annotate Source/Data/DataProvider/SqlDataProviderBase.cs @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +0400
parents f990fcb411a9
children 1e85f66cf767
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;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Data.Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Data.SqlClient;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using SqlException = System.Data.SqlClient.SqlException;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using SqlParameter = System.Data.SqlClient.SqlParameter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 namespace BLToolkit.Data.DataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 using Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 /// Implements access to the Data Provider for SQL Server.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public abstract class SqlDataProviderBase : DataProviderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 /// Creates the database connection object.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 /// <returns>The database connection object.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 public override IDbConnection CreateConnectionObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 return new SqlConnection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 /// Creates the data adapter object.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 /// <returns>A data adapter object.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 public override DbDataAdapter CreateDataAdapterObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 return new SqlDataAdapter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 /// Populates the specified <see cref="IDbCommand"/> object's Parameters collection with
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 /// parameter information for the stored procedure specified in the <see cref="IDbCommand"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 /// <param name="command">The <see cref="IDbCommand"/> referencing the stored procedure for which the parameter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 /// information is to be derived. The derived parameters will be populated into the
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 /// Parameters of this command.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 public override bool DeriveParameters(IDbCommand command)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 SqlCommandBuilder.DeriveParameters((SqlCommand)command);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 #if !MONO
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 foreach (SqlParameter p in command.Parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 // We have to clear UDT type names.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 // Otherwise it will fail with error
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 // "Database name is not allowed with a table-valued parameter"
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 // but this is exactly the way how they are discovered.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 if (p.SqlDbType == SqlDbType.Structured)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 var firstDot = p.TypeName.IndexOf('.');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 if (firstDot >= 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 p.TypeName = p.TypeName.Substring(firstDot + 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 base.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 if (commandParameters == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 foreach (var p in commandParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 var val = p.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 if (val == null || !val.GetType().IsArray || val is byte[] || val is char[])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 var dt = new DataTable();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 dt.Columns.Add("column_value", val.GetType().GetElementType());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 dt.BeginLoadData();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 foreach (object o in (Array)val)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 var row = dt.NewRow();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 row[0] = o;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 dt.Rows.Add(row);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 dt.EndLoadData();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 p.Value = dt;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 public override void SetUserDefinedType(IDbDataParameter parameter, string typeName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 #if !MONO
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 if (!(parameter is SqlParameter))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 throw new ArgumentException("SqlParameter expected.", "parameter");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 ((SqlParameter)parameter).TypeName = typeName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 throw new NotSupportedException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 case ConvertType.ExceptionToErrorNumber:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 if (value is SqlException)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 return ((SqlException)value).Number;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 return SqlProvider.Convert(value, convertType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 public override DataExceptionType ConvertErrorNumberToDataExceptionType(int number)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 switch (number)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 case 1205: return DataExceptionType.Deadlock;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 case -2: return DataExceptionType.Timeout;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 case 547: return DataExceptionType.ForeignKeyViolation;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 case 2601: return DataExceptionType.UniqueIndexViolation;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 case 2627: return DataExceptionType.ConstraintViolation;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 return DataExceptionType.Undefined;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 /// Returns connection type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 /// <value>An instance of the <see cref="Type"/> class.</value>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 public override Type ConnectionType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 get { return typeof(SqlConnection); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 public const string NameString = DataProvider.ProviderName.MsSql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 /// Returns the data provider name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 /// <value>Data provider name.</value>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 public override string Name
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 get { return NameString; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 public override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 return new MsSql2005SqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 public override int MaxParameters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 get { return 2100 - 20; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 public override int MaxBatchSize
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 get { return 65536; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 public override bool IsMarsEnabled(IDbConnection conn)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 if (conn.ConnectionString != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 return conn.ConnectionString.Split(';')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 .Select(s => s.Split('='))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 .Where (s => s.Length == 2 && s[0].Trim().ToLower() == "multipleactiveresultsets")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 .Select(s => s[1].Trim().ToLower())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 .Any (s => s == "true" || s == "1" || s == "yes");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 #region GetDataReader
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 return dataReader is SqlDataReader?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 new SqlDataReaderEx((SqlDataReader)dataReader):
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 base.GetDataReader(schema, dataReader);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 class SqlDataReaderEx : DataReaderEx<SqlDataReader>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 public SqlDataReaderEx(SqlDataReader rd): base(rd)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 public override DateTimeOffset GetDateTimeOffset(int i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 #if !MONO
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 return DataReader.GetDateTimeOffset(i);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 throw new NotSupportedException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 public override int InsertBatch<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 DbManager db,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 string insertText,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 IEnumerable<T> collection,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 MemberMapper[] members,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 int maxBatchSize,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 DbManager.ParameterProvider<T> getParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 if (db.Transaction != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 return base.InsertBatch(db, insertText, collection, members, maxBatchSize, getParameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 var idx = insertText.IndexOf('\n');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 var tbl = insertText.Substring(0, idx).Substring("INSERT INTO ".Length).TrimEnd('\r');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 var rd = new BulkCopyReader(members, collection);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 var bc = new SqlBulkCopy((SqlConnection)db.Connection)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 BatchSize = maxBatchSize,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 DestinationTableName = tbl,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 foreach (var memberMapper in members)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 bc.ColumnMappings.Add(new SqlBulkCopyColumnMapping(memberMapper.Ordinal, memberMapper.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 bc.WriteToServer(rd);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 return rd.Count;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 class BulkCopyReader : IDataReader
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 readonly MemberMapper[] _members;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 readonly IEnumerable _collection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 readonly IEnumerator _enumerator;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 public int Count;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 public BulkCopyReader(MemberMapper[] members, IEnumerable collection)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 _members = members;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 _collection = collection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 _enumerator = _collection.GetEnumerator();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 #region Implementation of IDisposable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 public void Dispose()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 #region Implementation of IDataRecord
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 public string GetName(int i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 return _members[i].Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 public Type GetFieldType(int i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 return _members[i].Type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 public object GetValue(int i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 return _members[i].GetValue(_enumerator.Current);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 public int FieldCount
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 get { return _members.Length; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 throw new NotImplementedException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 throw new NotImplementedException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 public string GetDataTypeName(int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 public int GetValues (object[] values) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 public int GetOrdinal (string name) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 public bool GetBoolean (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 public byte GetByte (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 public char GetChar (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 public Guid GetGuid (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 public short GetInt16 (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 public int GetInt32 (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 public long GetInt64 (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 public float GetFloat (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 public double GetDouble (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 public string GetString (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 public decimal GetDecimal (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 public DateTime GetDateTime (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 public IDataReader GetData (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 public bool IsDBNull (int i) { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 object IDataRecord.this[int i]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 get { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 object IDataRecord.this[string name]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 get { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 #region Implementation of IDataReader
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 public void Close()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 throw new NotImplementedException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 public DataTable GetSchemaTable()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 throw new NotImplementedException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 public bool NextResult()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 throw new NotImplementedException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 public bool Read()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 var b = _enumerator.MoveNext();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 if (b)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 Count++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 return b;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 public int Depth
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 get { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 public bool IsClosed
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 get { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 public int RecordsAffected
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 get { throw new NotImplementedException(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 public override void SetParameterValue(IDbDataParameter parameter, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 if (value is sbyte)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 parameter.Value = (byte)(sbyte)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 else if (value is ushort)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 parameter.Value = (short)(ushort)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 else if (value is uint)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 parameter.Value = (int)(uint)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 else if (value is ulong)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 parameter.Value = (long)(ulong)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 else if (value is string)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 parameter.Value = value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 if (parameter.DbType == DbType.String && ((string)value).Length == 0) parameter.Size = 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 base.SetParameterValue(parameter, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 }