annotate Source/Data/DataProvider/GenericDataProvider.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Data.Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Transactions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.Data.DataProvider.Interpreters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.Data.Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 namespace BLToolkit.Data.DataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 /// Creates an instance of a db provider for a specified provider name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 public sealed class GenericDataProvider : DataProviderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 private readonly string _providerName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 private readonly DbProviderFactory _factory;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 private readonly DataProviderInterpreterBase _dataProviderInterpreter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 public GenericDataProvider(string providerName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 _providerName = providerName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 using (new TransactionScope())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 _factory = DbProviderFactories.GetFactory(providerName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 switch (Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 case ProviderFullName.Oracle:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 case ProviderFullName.OracleNet:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 _dataProviderInterpreter = new OracleDataProviderInterpreter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 case ProviderFullName.SQLite:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 _dataProviderInterpreter = new SqliteDataProviderInterpreter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 default:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 throw new Exception(string.Format("The sql provider {0} isnt supported in the DataProviderInterpreterBase", Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 #region Overrides of DataProviderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 public override Type ConnectionType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 var dbConnection = _factory.CreateConnection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 if (dbConnection != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 return dbConnection.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 public override string Name
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 get { return _providerName; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 public override IDbConnection CreateConnectionObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 return _factory.CreateConnection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 public override DbDataAdapter CreateDataAdapterObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 return _factory.CreateDataAdapter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 /// Populates the specified IDbCommand object's Parameters collection with
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 /// parameter information for the stored procedure specified in the IDbCommand.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 public override bool DeriveParameters(IDbCommand command)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 public override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 switch (Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 case ProviderFullName.OracleNet:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 return new OracleSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 case ProviderFullName.SQLite:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 return new SQLiteSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 case ProviderFullName.Oracle:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 return new OracleSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 default:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 throw new Exception(string.Format("The sql provider {0} isnt supported in the GenericDataProvider", Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 public override void SetParameterValue(IDbDataParameter parameter, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 _dataProviderInterpreter.SetParameterValue(parameter, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 public override string GetSequenceQuery(string sequenceName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 return _dataProviderInterpreter.GetSequenceQuery(sequenceName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 public override string NextSequenceQuery(string sequenceName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 return _dataProviderInterpreter.NextSequenceQuery(sequenceName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 public override string GetReturningInto(string columnName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 return _dataProviderInterpreter.GetReturningInto(columnName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 if (Name == ProviderFullName.Oracle)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 case ConvertType.NameToQueryParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 var qname = (string) value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 // Avoid "ORA-00972: identifier is too long" error
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 // Cause error : You tried to reference a table, cluster, view, index, synonym, tablespace, or username with a value that was longer than 30 characters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 // Resolution : Names for tables, clusters, views, indexes, synonyms, tablespaces, and usernames must be 30 characters or less.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 // You must shorten the name to no more than 30 characters for these objects.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 if (qname.Length > 30)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 qname = qname.Substring(0, 30);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 return SqlProvider.Convert(qname, convertType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 return SqlProvider.Convert(value, convertType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 return base.Convert(value, convertType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 public override int InsertBatchWithIdentity<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 DbManager db,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 string insertText,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 IEnumerable<T> collection,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 Mapping.MemberMapper[] members,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 int maxBatchSize,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 DbManager.ParameterProvider<T> getParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 if (db.UseQueryText && Name == ProviderFullName.Oracle)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 List<string> sqlList = _dataProviderInterpreter.GetInsertBatchSqlList(insertText, collection, members, maxBatchSize, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 return ExecuteSqlList(db, sqlList);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 return base.InsertBatchWithIdentity(db, insertText, collection, members, maxBatchSize, getParameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 public override int InsertBatch<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 DbManager db,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 string insertText,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 IEnumerable<T> collection,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 Mapping.MemberMapper[] members,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 int maxBatchSize,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 DbManager.ParameterProvider<T> getParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 if (Name == ProviderFullName.Oracle)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 if (db.UseQueryText)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 List<string> sqlList = _dataProviderInterpreter.GetInsertBatchSqlList(insertText, collection, members, maxBatchSize, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 return ExecuteSqlList(db, sqlList);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 throw new NotSupportedException("Set UseQueryText = true on the current generic data provider!");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 return base.InsertBatch(db, insertText, collection, members, maxBatchSize, getParameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 }