Datei: Provider/SqlServerProvider/NDO.SqlServer/Provider.cs
Last Commit (f892a37)
1 | using NDOInterfaces; |
2 | using System; |
3 | using System.Collections.Generic; |
4 | using System.Data; |
5 | using System.Data.Common; |
6 | using System.Data.SqlClient; |
7 | using System.Text; |
8 | using System.Text.RegularExpressions; |
9 | |
10 | namespace SqlServerProvider |
11 | { |
12 | ····/// <summary> |
13 | ····/// This is an Implementation of the IProvider interface for SqlServer. |
14 | ····/// For more information see <see cref="IProvider"> IProvider interface </see>. |
15 | ····/// </summary> |
16 | ····public class Provider : NDOAbstractProvider |
17 | ····{ |
18 | |
19 | ········#region Implementation of IProvider |
20 | |
21 | |
22 | ········/// <summary> |
23 | ········/// See <see cref="IProvider"> IProvider interface </see> |
24 | ········/// </summary> |
25 | ········public override bool UseNamedParams |
26 | ········{ |
27 | ············get { return true; } |
28 | ········} |
29 | |
30 | ········/// <summary> |
31 | ········/// See <see cref="IProvider"> IProvider interface </see> |
32 | ········/// </summary> |
33 | ········public override string GetNamedParameter( string plainParameterName ) |
34 | ········{ |
35 | ············return "@" + plainParameterName; |
36 | ········} |
37 | |
38 | |
39 | ········/// <summary> |
40 | ········/// See <see cref="IProvider"> IProvider interface </see> |
41 | ········/// </summary> |
42 | ········public override string NamedParamPrefix |
43 | ········{ |
44 | ············get { return "@"; } |
45 | ········} |
46 | |
47 | ········/// <summary> |
48 | ········/// See <see cref="IProvider"> IProvider interface </see> |
49 | ········/// </summary> |
50 | ········private string GetDateExpression( DateTime dt ) |
51 | ········{ |
52 | ············string dtstr = dt.ToString(); |
53 | ············dtstr = dtstr.Replace( ".", "/" ); |
54 | ············dtstr = dtstr.Replace( "-", "/" ); |
55 | ············return "'" + dtstr + "'"; |
56 | ········} |
57 | |
58 | ········/// <summary> |
59 | ········/// See <see cref="IProvider"> IProvider interface </see> |
60 | ········/// </summary> |
61 | ········public override string GetSqlLiteral( object o ) |
62 | ········{ |
63 | ············if (o is DateTime) |
64 | ················return this.GetDateExpression( (DateTime)o ); |
65 | ············return base.GetSqlLiteral( o ); |
66 | ········} |
67 | |
68 | |
69 | ········/// <summary> |
70 | ········/// See <see cref="IProvider"> IProvider interface </see> |
71 | ········/// </summary> |
72 | ········public override System.Data.IDbConnection NewConnection( string connectionString ) |
73 | ········{ |
74 | ············return new SqlConnection( connectionString ); |
75 | ········} |
76 | |
77 | ········/// <summary> |
78 | ········/// See <see cref="IProvider"> IProvider interface </see> |
79 | ········/// </summary> |
80 | ········public override System.Data.IDbCommand NewSqlCommand( System.Data.IDbConnection connection ) |
81 | ········{ |
82 | ············SqlCommand command = new SqlCommand(); |
83 | ············command.Connection = (SqlConnection)connection; |
84 | ············return command; |
85 | ········} |
86 | |
87 | ········/// <summary> |
88 | ········/// See <see cref="IProvider"> IProvider interface </see> |
89 | ········/// </summary> |
90 | ········public override DbDataAdapter NewDataAdapter( System.Data.IDbCommand select, System.Data.IDbCommand update, System.Data.IDbCommand insert, System.Data.IDbCommand delete ) |
91 | ········{ |
92 | ············SqlDataAdapter da = new SqlDataAdapter(); |
93 | ············da.SelectCommand = (SqlCommand)select; |
94 | ············da.UpdateCommand = (SqlCommand)update; |
95 | ············da.InsertCommand = (SqlCommand)insert; |
96 | ············da.DeleteCommand = (SqlCommand)delete; |
97 | ············return da; |
98 | ········} |
99 | |
100 | |
101 | ········/// <summary> |
102 | ········/// See <see cref="IProvider"> IProvider interface </see> |
103 | ········/// </summary> |
104 | ········public override object NewCommandBuilder( DbDataAdapter dataAdapter ) |
105 | ········{ |
106 | ············return new SqlCommandBuilder( (SqlDataAdapter)dataAdapter ); |
107 | ········} |
108 | |
109 | ········/// <summary> |
110 | ········/// See <see cref="IProvider"> IProvider interface </see> |
111 | ········/// </summary> |
112 | ········public override IDataParameter AddParameter( System.Data.IDbCommand command, string parameterName, object dbType, int size, string columnName ) |
113 | ········{ |
114 | ············return ((SqlCommand)command).Parameters.Add( new SqlParameter( parameterName, (SqlDbType)dbType, size > -1 ? size : 0, columnName ) ); |
115 | ········} |
116 | |
117 | ········/// <summary> |
118 | ········/// See <see cref="IProvider"> IProvider interface </see> |
119 | ········/// </summary> |
120 | ········public override IDataParameter AddParameter( IDbCommand command, string parameterName, object dbType, int size, ParameterDirection dir, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value ) |
121 | ········{ |
122 | ············return ((SqlCommand)command).Parameters.Add( new SqlParameter( parameterName, (SqlDbType)dbType, size > -1 ? size : 0, dir, isNullable, precision, scale, srcColumn, srcVersion, value ) ); |
123 | ········} |
124 | |
125 | ········/// <summary> |
126 | ········/// See <see cref="IProvider"> IProvider interface </see> |
127 | ········/// </summary> |
128 | ········public override object GetDbType( Type t ) |
129 | ········{ |
130 | ············t = base.ConvertNullableType( t ); |
131 | ············if (t == typeof( bool )) |
132 | ················return SqlDbType.Bit; |
133 | ············else if (t == typeof( byte )) |
134 | ················return SqlDbType.TinyInt; |
135 | ············else if (t == typeof( sbyte )) |
136 | ················return SqlDbType.TinyInt; |
137 | ············else if (t == typeof( char )) |
138 | ················return SqlDbType.Char; |
139 | ············else if (t == typeof( short )) |
140 | ················return SqlDbType.SmallInt; |
141 | ············else if (t == typeof( ushort )) |
142 | ················return SqlDbType.SmallInt; |
143 | ············else if (t == typeof( int )) |
144 | ················return SqlDbType.Int; |
145 | ············else if (t == typeof( uint )) |
146 | ················return SqlDbType.Int; |
147 | ············else if (t == typeof( long )) |
148 | ················return SqlDbType.BigInt; |
149 | ············else if (t == typeof( System.Guid )) |
150 | ················return SqlDbType.UniqueIdentifier; |
151 | ············else if (t == typeof( ulong )) |
152 | ················return SqlDbType.BigInt; |
153 | ············else if (t == typeof( float )) |
154 | ················return SqlDbType.Real; |
155 | ············else if (t == typeof( double )) |
156 | ················return SqlDbType.Float; |
157 | ············else if (t == typeof( string )) |
158 | ················return SqlDbType.NVarChar; |
159 | ············else if (t == typeof( byte[] )) |
160 | ················return SqlDbType.Image; |
161 | ············else if (t == typeof( decimal )) |
162 | ················return SqlDbType.Decimal; |
163 | ············else if (t == typeof( System.DateTime )) |
164 | ················return SqlDbType.DateTime; |
165 | ············else if (t.IsSubclassOf( typeof( System.Enum ) )) |
166 | ················return SqlDbType.Int; |
167 | ············else if (t == typeof( System.Data.SqlTypes.SqlXml )) |
168 | ················return SqlDbType.Xml; |
169 | ············else |
170 | ················throw new Exception( $"NDOSqlProvider.GetDbType: Type {t.Name} can't be converted into a SqlDbType." ); |
171 | ········} |
172 | |
173 | ········public override string GetDbTypeString( IDbDataParameter parameter ) |
174 | ········{ |
175 | ············return (((SqlParameter)parameter).SqlDbType).ToString(); |
176 | ········} |
177 | |
178 | ········public override int GetDefaultLength( Type t ) |
179 | ········{ |
180 | ············if (t == typeof( byte[] )) |
181 | ················return 65535; |
182 | ············return base.GetDefaultLength( t ); |
183 | ········} |
184 | |
185 | ········/// <summary> |
186 | ········/// See <see cref="IProvider"> IProvider interface </see> |
187 | ········/// </summary> |
188 | ········public override object GetDbType( string typeName ) |
189 | ········{ |
190 | ············string typeNameLower = typeName.ToLower(); |
191 | ············if (typeNameLower.StartsWith( "nvarchar" )) return SqlDbType.NVarChar; |
192 | ············if (String.Compare( typeName, "VarChar", true ) == 0) return SqlDbType.VarChar; |
193 | ············if (String.Compare( typeName, "NChar", true ) == 0) return SqlDbType.NChar; |
194 | ············if (String.Compare( typeName, "Int", true ) == 0) return SqlDbType.Int; |
195 | ············if (String.Compare( typeName, "Char", true ) == 0) return SqlDbType.Char; |
196 | ············if (String.Compare( typeName, "UniqueIdentifier", true ) == 0) return SqlDbType.UniqueIdentifier; |
197 | ············if (String.Compare( typeName, "DateTime", true ) == 0) return SqlDbType.DateTime; |
198 | ············if (String.Compare( typeName, "Decimal", true ) == 0) return SqlDbType.Decimal; |
199 | ············if (String.Compare( typeName, "Binary", true ) == 0) return SqlDbType.Binary; |
200 | ············if (String.Compare( typeName, "Bit", true ) == 0) return SqlDbType.Bit; |
201 | ············if (String.Compare( typeName, "Real", true ) == 0) return SqlDbType.Real; |
202 | ············if (String.Compare( typeName, "Float", true ) == 0) return SqlDbType.Float; |
203 | ············if (String.Compare( typeName, "Image", true ) == 0) return SqlDbType.Image; |
204 | ············if (String.Compare( typeName, "Money", true ) == 0) return SqlDbType.Money; |
205 | ············if (String.Compare( typeName, "NText", true ) == 0) return SqlDbType.NText; |
206 | ············if (String.Compare( typeName, "SmallDateTime", true ) == 0) return SqlDbType.SmallDateTime; |
207 | ············if (String.Compare( typeName, "SmallInt", true ) == 0) return SqlDbType.SmallInt; |
208 | ············if (String.Compare( typeName, "SmallMoney", true ) == 0) return SqlDbType.SmallMoney; |
209 | ············if (String.Compare( typeName, "Text", true ) == 0) return SqlDbType.Text; |
210 | ············if (String.Compare( typeName, "Timestamp", true ) == 0) return SqlDbType.Timestamp; |
211 | ············if (String.Compare( typeName, "TinyInt", true ) == 0) return SqlDbType.TinyInt; |
212 | ············if (String.Compare( typeName, "VarBinary", true ) == 0) return SqlDbType.VarBinary; |
213 | ············if (String.Compare( typeName, "Variant", true ) == 0) return SqlDbType.Variant; |
214 | ············if (String.Compare( typeName, "BigInt", true ) == 0) return SqlDbType.BigInt; |
215 | ············if (typeNameLower.StartsWith( "xml" )) return SqlDbType.Xml; |
216 | ············if (String.Compare( typeName, "RowVersion", true ) == 0) return SqlDbType.Timestamp; |
217 | ············SqlDbType result; |
218 | ············if (Enum.TryParse( typeName, out result )) |
219 | ················return result; |
220 | ············throw new Exception( $"NDOSqlProvider.GetDbType: Type name {typeName} can't be converted into a SqlDbType." ); |
221 | ········} |
222 | |
223 | ········/// <summary> |
224 | ········/// See <see cref="IProvider"> IProvider interface </see> |
225 | ········/// </summary> |
226 | ········public override string GetQuotedName( string plainName ) |
227 | ········{ |
228 | ············if (plainName[0] == '[') |
229 | ················return plainName; |
230 | ············return "[" + plainName + "]"; |
231 | ········} |
232 | |
233 | ········/// <summary> |
234 | ········/// Indicates whether the last automatically generated ID can be retrieved. |
235 | ········/// Returns true if a database provides automatically incremented IDs and its syntax has an expression |
236 | ········/// which retrieves the last generated ID; otherwise false. |
237 | ········/// </summary> |
238 | ········public override bool SupportsLastInsertedId |
239 | ········{ |
240 | ············get { return true; } |
241 | ········} |
242 | |
243 | ········/// <summary> |
244 | ········/// Gets an expression in the SQL dialect of the database, which retrieves the ID of the last |
245 | ········/// inserted row, if the ID is automatically generated by the database. |
246 | ········/// </summary> |
247 | ········/// <param name="tableName">The table name, the insert happens into.</param> |
248 | ········/// <param name="columnName">The column name of the autoincremented primary key column.</param> |
249 | ········/// <returns></returns>········ |
250 | ········public override string GetLastInsertedId( string tableName, string columnName ) |
251 | ········{ |
252 | return "@@IDENTITY"; |
253 | ········} |
254 | |
255 | ········/// <summary> |
256 | ········/// Determines whether a database supports bulk command strings. |
257 | ········/// </summary> |
258 | ········public override bool SupportsBulkCommands |
259 | ········{ |
260 | ············get { return true; } |
261 | ········} |
262 | |
263 | |
264 | ········/// <summary> |
265 | ········/// Generate one big command string out of several partial commands to save roundtrips |
266 | ········/// to the server. |
267 | ········/// </summary> |
268 | ········/// <param name="commands"></param> |
269 | ········/// <returns></returns> |
270 | ········public override string GenerateBulkCommand( string[] commands ) |
271 | ········{ |
272 | ············StringBuilder sb = new StringBuilder( commands.Length * 100 ); |
273 | ············foreach (string s in commands) |
274 | ············{ |
275 | ················sb.Append( s ); |
276 | ················sb.Append( ';' ); |
277 | ············} |
278 | ············return sb.ToString(); |
279 | ········} |
280 | |
281 | ········/// <summary> |
282 | ········/// See <see cref="NDOInterfaces.IProvider">IProvider interface</see>. |
283 | ········/// </summary> |
284 | ········public override int MaxBulkCommandLength |
285 | ········{ |
286 | ············// Der Wert ist willkürlich gesetzt. Die Query in der Größe dauert ungefähr 15s. |
287 | ············get { return 1280000; } |
288 | ········} |
289 | |
290 | |
291 | |
292 | ········/// <summary> |
293 | ········/// See <see cref="IProvider"> IProvider interface </see> |
294 | ········/// </summary> |
295 | ········public override string[] GetTableNames( IDbConnection conn, string owner ) |
296 | ········{ |
297 | ············List<string> result = new List<string>(); |
298 | ············string sql = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'"; |
299 | ············SqlCommand cmd = new SqlCommand( sql, (SqlConnection)conn ); |
300 | ············bool wasOpen = true; |
301 | |
302 | ············if (conn.State == ConnectionState.Closed) |
303 | ············{ |
304 | ················wasOpen = false; |
305 | ················conn.Open(); |
306 | ············} |
307 | |
308 | ············SqlDataReader dr = cmd.ExecuteReader(); |
309 | ············while (dr.Read()) |
310 | ············{ |
311 | ················string tbl = dr.GetString( 2 ); |
312 | ················if (tbl != "dtproperties") |
313 | ····················result.Add( tbl ); |
314 | ············} |
315 | |
316 | ············dr.Close(); |
317 | |
318 | ············if (!wasOpen) |
319 | ················conn.Close(); |
320 | |
321 | ············return result.ToArray(); |
322 | ········} |
323 | |
324 | ········/// <summary> |
325 | ········/// See <see cref="IProvider"> IProvider interface </see> |
326 | ········/// </summary> |
327 | ········public override string[] TypeNames |
328 | ········{ |
329 | ············get |
330 | ············{ |
331 | ················return Enum.GetNames( typeof( SqlDbType ) ); |
332 | ············} |
333 | ········} |
334 | |
335 | ········/// <summary> |
336 | ········/// See <see cref="IProvider"> IProvider interface </see> |
337 | ········/// </summary> |
338 | ········public override string Name { get { return "SqlServer"; } } |
339 | |
340 | ········/// <summary> |
341 | ········/// See <see cref="IProvider"> IProvider interface </see> |
342 | ········/// </summary> |
343 | ········public override bool SupportsNativeGuidType { get { return true; } } |
344 | |
345 | ········public override bool SupportsInsertBatch |
346 | ········{ |
347 | ············get |
348 | ············{ |
349 | ················return true; |
350 | ············} |
351 | ········} |
352 | |
353 | ········public override string CreateDatabase( string databaseName, string connectionString, object additionalData ) |
354 | ········{ |
355 | ············base.CreateDatabase( databaseName, connectionString, additionalData ); |
356 | ············Regex regex = new Regex( @"Initial\sCatalog=([^\;]*)" ); |
357 | ············Match match = regex.Match( connectionString ); |
358 | ············if (match.Success) |
359 | ············{ |
360 | ················return connectionString.Substring( 0, match.Groups[1].Index ) + GetQuotedName( databaseName ) + connectionString.Substring( match.Index + match.Length ); |
361 | ············} |
362 | |
363 | ············if (connectionString.EndsWith( ";" )) |
364 | ················return connectionString + "Initial Catalog=" + databaseName; |
365 | ············else |
366 | ················return connectionString + ";Initial Catalog=" + databaseName; |
367 | ········} |
368 | |
369 | ········#endregion |
370 | |
371 | ····} |
372 | } |
373 |
New Commit (c39bd40)
1 | using NDOInterfaces; |
2 | using System; |
3 | using System.Collections.Generic; |
4 | using System.Data; |
5 | using System.Data.Common; |
6 | using System.Data.SqlClient; |
7 | using System.Text; |
8 | using System.Text.RegularExpressions; |
9 | |
10 | namespace SqlServerProvider |
11 | { |
12 | ····/// <summary> |
13 | ····/// This is an Implementation of the IProvider interface for SqlServer. |
14 | ····/// For more information see <see cref="IProvider"> IProvider interface </see>. |
15 | ····/// </summary> |
16 | ····public class Provider : NDOAbstractProvider |
17 | ····{ |
18 | |
19 | ········#region Implementation of IProvider |
20 | |
21 | |
22 | ········/// <summary> |
23 | ········/// See <see cref="IProvider"> IProvider interface </see> |
24 | ········/// </summary> |
25 | ········public override bool UseNamedParams |
26 | ········{ |
27 | ············get { return true; } |
28 | ········} |
29 | |
30 | ········/// <summary> |
31 | ········/// See <see cref="IProvider"> IProvider interface </see> |
32 | ········/// </summary> |
33 | ········public override string GetNamedParameter( string plainParameterName ) |
34 | ········{ |
35 | ············return "@" + plainParameterName; |
36 | ········} |
37 | |
38 | |
39 | ········/// <summary> |
40 | ········/// See <see cref="IProvider"> IProvider interface </see> |
41 | ········/// </summary> |
42 | ········public override string NamedParamPrefix |
43 | ········{ |
44 | ············get { return "@"; } |
45 | ········} |
46 | |
47 | ········/// <summary> |
48 | ········/// See <see cref="IProvider"> IProvider interface </see> |
49 | ········/// </summary> |
50 | ········private string GetDateExpression( DateTime dt ) |
51 | ········{ |
52 | ············string dtstr = dt.ToString(); |
53 | ············dtstr = dtstr.Replace( ".", "/" ); |
54 | ············dtstr = dtstr.Replace( "-", "/" ); |
55 | ············return "'" + dtstr + "'"; |
56 | ········} |
57 | |
58 | ········/// <summary> |
59 | ········/// See <see cref="IProvider"> IProvider interface </see> |
60 | ········/// </summary> |
61 | ········public override string GetSqlLiteral( object o ) |
62 | ········{ |
63 | ············if (o is DateTime) |
64 | ················return this.GetDateExpression( (DateTime)o ); |
65 | ············return base.GetSqlLiteral( o ); |
66 | ········} |
67 | |
68 | |
69 | ········/// <summary> |
70 | ········/// See <see cref="IProvider"> IProvider interface </see> |
71 | ········/// </summary> |
72 | ········public override System.Data.IDbConnection NewConnection( string connectionString ) |
73 | ········{ |
74 | ············return new SqlConnection( connectionString ); |
75 | ········} |
76 | |
77 | ········/// <summary> |
78 | ········/// See <see cref="IProvider"> IProvider interface </see> |
79 | ········/// </summary> |
80 | ········public override System.Data.IDbCommand NewSqlCommand( System.Data.IDbConnection connection ) |
81 | ········{ |
82 | ············SqlCommand command = new SqlCommand(); |
83 | ············command.Connection = (SqlConnection)connection; |
84 | ············return command; |
85 | ········} |
86 | |
87 | ········/// <summary> |
88 | ········/// See <see cref="IProvider"> IProvider interface </see> |
89 | ········/// </summary> |
90 | ········public override DbDataAdapter NewDataAdapter( System.Data.IDbCommand select, System.Data.IDbCommand update, System.Data.IDbCommand insert, System.Data.IDbCommand delete ) |
91 | ········{ |
92 | ············SqlDataAdapter da = new SqlDataAdapter(); |
93 | ············da.SelectCommand = (SqlCommand)select; |
94 | ············da.UpdateCommand = (SqlCommand)update; |
95 | ············da.InsertCommand = (SqlCommand)insert; |
96 | ············da.DeleteCommand = (SqlCommand)delete; |
97 | ············return da; |
98 | ········} |
99 | |
100 | |
101 | ········/// <summary> |
102 | ········/// See <see cref="IProvider"> IProvider interface </see> |
103 | ········/// </summary> |
104 | ········public override object NewCommandBuilder( DbDataAdapter dataAdapter ) |
105 | ········{ |
106 | ············return new SqlCommandBuilder( (SqlDataAdapter)dataAdapter ); |
107 | ········} |
108 | |
109 | ········/// <summary> |
110 | ········/// See <see cref="IProvider"> IProvider interface </see> |
111 | ········/// </summary> |
112 | ········public override IDataParameter AddParameter( System.Data.IDbCommand command, string parameterName, object dbType, int size, string columnName ) |
113 | ········{ |
114 | ············return ((SqlCommand)command).Parameters.Add( new SqlParameter( parameterName, (SqlDbType)dbType, size > -1 ? size : 0, columnName ) ); |
115 | ········} |
116 | |
117 | ········/// <summary> |
118 | ········/// See <see cref="IProvider"> IProvider interface </see> |
119 | ········/// </summary> |
120 | ········public override IDataParameter AddParameter( IDbCommand command, string parameterName, object dbType, int size, ParameterDirection dir, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value ) |
121 | ········{ |
122 | ············return ((SqlCommand)command).Parameters.Add( new SqlParameter( parameterName, (SqlDbType)dbType, size > -1 ? size : 0, dir, isNullable, precision, scale, srcColumn, srcVersion, value ) ); |
123 | ········} |
124 | |
125 | ········/// <summary> |
126 | ········/// See <see cref="IProvider"> IProvider interface </see> |
127 | ········/// </summary> |
128 | ········public override object GetDbType( Type t ) |
129 | ········{ |
130 | ············t = base.ConvertNullableType( t ); |
131 | ············if (t == typeof( bool )) |
132 | ················return SqlDbType.Bit; |
133 | ············else if (t == typeof( byte )) |
134 | ················return SqlDbType.TinyInt; |
135 | ············else if (t == typeof( sbyte )) |
136 | ················return SqlDbType.TinyInt; |
137 | ············else if (t == typeof( char )) |
138 | ················return SqlDbType.Char; |
139 | ············else if (t == typeof( short )) |
140 | ················return SqlDbType.SmallInt; |
141 | ············else if (t == typeof( ushort )) |
142 | ················return SqlDbType.SmallInt; |
143 | ············else if (t == typeof( int )) |
144 | ················return SqlDbType.Int; |
145 | ············else if (t == typeof( uint )) |
146 | ················return SqlDbType.Int; |
147 | ············else if (t == typeof( long )) |
148 | ················return SqlDbType.BigInt; |
149 | ············else if (t == typeof( System.Guid )) |
150 | ················return SqlDbType.UniqueIdentifier; |
151 | ············else if (t == typeof( ulong )) |
152 | ················return SqlDbType.BigInt; |
153 | ············else if (t == typeof( float )) |
154 | ················return SqlDbType.Real; |
155 | ············else if (t == typeof( double )) |
156 | ················return SqlDbType.Float; |
157 | ············else if (t == typeof( string )) |
158 | ················return SqlDbType.NVarChar; |
159 | ············else if (t == typeof( byte[] )) |
160 | ················return SqlDbType.Image; |
161 | ············else if (t == typeof( decimal )) |
162 | ················return SqlDbType.Decimal; |
163 | ············else if (t == typeof( System.DateTime )) |
164 | ················return SqlDbType.DateTime; |
165 | ············else if (t.IsSubclassOf( typeof( System.Enum ) )) |
166 | ················return SqlDbType.Int; |
167 | ············else if (t == typeof( System.Data.SqlTypes.SqlXml )) |
168 | ················return SqlDbType.Xml; |
169 | ············else |
170 | ················throw new Exception( $"NDOSqlProvider.GetDbType: Type {t.Name} can't be converted into a SqlDbType." ); |
171 | ········} |
172 | |
173 | ········public override string GetDbTypeString( IDbDataParameter parameter ) |
174 | ········{ |
175 | ············return (((SqlParameter)parameter).SqlDbType).ToString(); |
176 | ········} |
177 | |
178 | ········public override int GetDefaultLength( Type t ) |
179 | ········{ |
180 | ············if (t == typeof( byte[] )) |
181 | ················return 65535; |
182 | ············return base.GetDefaultLength( t ); |
183 | ········} |
184 | |
185 | ········/// <summary> |
186 | ········/// See <see cref="IProvider"> IProvider interface </see> |
187 | ········/// </summary> |
188 | ········public override object GetDbType( string typeName ) |
189 | ········{ |
190 | ············string typeNameLower = typeName.ToLower(); |
191 | ············if (typeNameLower.StartsWith( "nvarchar" )) return SqlDbType.NVarChar; |
192 | ············if (String.Compare( typeName, "VarChar", true ) == 0) return SqlDbType.VarChar; |
193 | ············if (String.Compare( typeName, "NChar", true ) == 0) return SqlDbType.NChar; |
194 | ············if (String.Compare( typeName, "Int", true ) == 0) return SqlDbType.Int; |
195 | ············if (String.Compare( typeName, "Char", true ) == 0) return SqlDbType.Char; |
196 | ············if (String.Compare( typeName, "UniqueIdentifier", true ) == 0) return SqlDbType.UniqueIdentifier; |
197 | ············if (String.Compare( typeName, "DateTime", true ) == 0) return SqlDbType.DateTime; |
198 | ············if (String.Compare( typeName, "Decimal", true ) == 0) return SqlDbType.Decimal; |
199 | ············if (String.Compare( typeName, "Binary", true ) == 0) return SqlDbType.Binary; |
200 | ············if (String.Compare( typeName, "Bit", true ) == 0) return SqlDbType.Bit; |
201 | ············if (String.Compare( typeName, "Real", true ) == 0) return SqlDbType.Real; |
202 | ············if (String.Compare( typeName, "Float", true ) == 0) return SqlDbType.Float; |
203 | ············if (String.Compare( typeName, "Image", true ) == 0) return SqlDbType.Image; |
204 | ············if (String.Compare( typeName, "Money", true ) == 0) return SqlDbType.Money; |
205 | ············if (String.Compare( typeName, "NText", true ) == 0) return SqlDbType.NText; |
206 | ············if (String.Compare( typeName, "SmallDateTime", true ) == 0) return SqlDbType.SmallDateTime; |
207 | ············if (String.Compare( typeName, "SmallInt", true ) == 0) return SqlDbType.SmallInt; |
208 | ············if (String.Compare( typeName, "SmallMoney", true ) == 0) return SqlDbType.SmallMoney; |
209 | ············if (String.Compare( typeName, "Text", true ) == 0) return SqlDbType.Text; |
210 | ············if (String.Compare( typeName, "Timestamp", true ) == 0) return SqlDbType.Timestamp; |
211 | ············if (String.Compare( typeName, "TinyInt", true ) == 0) return SqlDbType.TinyInt; |
212 | ············if (String.Compare( typeName, "VarBinary", true ) == 0) return SqlDbType.VarBinary; |
213 | ············if (String.Compare( typeName, "Variant", true ) == 0) return SqlDbType.Variant; |
214 | ············if (String.Compare( typeName, "BigInt", true ) == 0) return SqlDbType.BigInt; |
215 | ············if (typeNameLower.StartsWith( "xml" )) return SqlDbType.Xml; |
216 | ············if (String.Compare( typeName, "RowVersion", true ) == 0) return SqlDbType.Timestamp; |
217 | ············SqlDbType result; |
218 | ············if (Enum.TryParse( typeName, out result )) |
219 | ················return result; |
220 | ············throw new Exception( $"NDOSqlProvider.GetDbType: Type name {typeName} can't be converted into a SqlDbType." ); |
221 | ········} |
222 | |
223 | ········/// <summary> |
224 | ········/// See <see cref="IProvider"> IProvider interface </see> |
225 | ········/// </summary> |
226 | ········public override string GetQuotedName( string plainName ) |
227 | ········{ |
228 | ············if (plainName[0] == '[') |
229 | ················return plainName; |
230 | ············return "[" + plainName + "]"; |
231 | ········} |
232 | |
233 | ········/// <summary> |
234 | ········/// Indicates whether the last automatically generated ID can be retrieved. |
235 | ········/// Returns true if a database provides automatically incremented IDs and its syntax has an expression |
236 | ········/// which retrieves the last generated ID; otherwise false. |
237 | ········/// </summary> |
238 | ········public override bool SupportsLastInsertedId |
239 | ········{ |
240 | ············get { return true; } |
241 | ········} |
242 | |
243 | ········/// <summary> |
244 | ········/// Gets an expression in the SQL dialect of the database, which retrieves the ID of the last |
245 | ········/// inserted row, if the ID is automatically generated by the database. |
246 | ········/// </summary> |
247 | ········/// <param name="tableName">The table name, the insert happens into.</param> |
248 | ········/// <param name="columnName">The column name of the autoincremented primary key column.</param> |
249 | ········/// <returns></returns>········ |
250 | ········public override string GetLastInsertedId( string tableName, string columnName ) |
251 | ········{ |
252 | return "SCOPE_IDENTITY( ) "; |
253 | ········} |
254 | |
255 | ········/// <summary> |
256 | ········/// Determines whether a database supports bulk command strings. |
257 | ········/// </summary> |
258 | ········public override bool SupportsBulkCommands |
259 | ········{ |
260 | ············get { return true; } |
261 | ········} |
262 | |
263 | |
264 | ········/// <summary> |
265 | ········/// Generate one big command string out of several partial commands to save roundtrips |
266 | ········/// to the server. |
267 | ········/// </summary> |
268 | ········/// <param name="commands"></param> |
269 | ········/// <returns></returns> |
270 | ········public override string GenerateBulkCommand( string[] commands ) |
271 | ········{ |
272 | ············StringBuilder sb = new StringBuilder( commands.Length * 100 ); |
273 | ············foreach (string s in commands) |
274 | ············{ |
275 | ················sb.Append( s ); |
276 | ················sb.Append( ';' ); |
277 | ············} |
278 | ············return sb.ToString(); |
279 | ········} |
280 | |
281 | ········/// <summary> |
282 | ········/// See <see cref="NDOInterfaces.IProvider">IProvider interface</see>. |
283 | ········/// </summary> |
284 | ········public override int MaxBulkCommandLength |
285 | ········{ |
286 | ············// Der Wert ist willkürlich gesetzt. Die Query in der Größe dauert ungefähr 15s. |
287 | ············get { return 1280000; } |
288 | ········} |
289 | |
290 | |
291 | |
292 | ········/// <summary> |
293 | ········/// See <see cref="IProvider"> IProvider interface </see> |
294 | ········/// </summary> |
295 | ········public override string[] GetTableNames( IDbConnection conn, string owner ) |
296 | ········{ |
297 | ············List<string> result = new List<string>(); |
298 | ············string sql = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'"; |
299 | ············SqlCommand cmd = new SqlCommand( sql, (SqlConnection)conn ); |
300 | ············bool wasOpen = true; |
301 | |
302 | ············if (conn.State == ConnectionState.Closed) |
303 | ············{ |
304 | ················wasOpen = false; |
305 | ················conn.Open(); |
306 | ············} |
307 | |
308 | ············SqlDataReader dr = cmd.ExecuteReader(); |
309 | ············while (dr.Read()) |
310 | ············{ |
311 | ················string tbl = dr.GetString( 2 ); |
312 | ················if (tbl != "dtproperties") |
313 | ····················result.Add( tbl ); |
314 | ············} |
315 | |
316 | ············dr.Close(); |
317 | |
318 | ············if (!wasOpen) |
319 | ················conn.Close(); |
320 | |
321 | ············return result.ToArray(); |
322 | ········} |
323 | |
324 | ········/// <summary> |
325 | ········/// See <see cref="IProvider"> IProvider interface </see> |
326 | ········/// </summary> |
327 | ········public override string[] TypeNames |
328 | ········{ |
329 | ············get |
330 | ············{ |
331 | ················return Enum.GetNames( typeof( SqlDbType ) ); |
332 | ············} |
333 | ········} |
334 | |
335 | ········/// <summary> |
336 | ········/// See <see cref="IProvider"> IProvider interface </see> |
337 | ········/// </summary> |
338 | ········public override string Name { get { return "SqlServer"; } } |
339 | |
340 | ········/// <summary> |
341 | ········/// See <see cref="IProvider"> IProvider interface </see> |
342 | ········/// </summary> |
343 | ········public override bool SupportsNativeGuidType { get { return true; } } |
344 | |
345 | ········public override bool SupportsInsertBatch |
346 | ········{ |
347 | ············get |
348 | ············{ |
349 | ················return true; |
350 | ············} |
351 | ········} |
352 | |
353 | ········public override string CreateDatabase( string databaseName, string connectionString, object additionalData ) |
354 | ········{ |
355 | ············base.CreateDatabase( databaseName, connectionString, additionalData ); |
356 | ············Regex regex = new Regex( @"Initial\sCatalog=([^\;]*)" ); |
357 | ············Match match = regex.Match( connectionString ); |
358 | ············if (match.Success) |
359 | ············{ |
360 | ················return connectionString.Substring( 0, match.Groups[1].Index ) + GetQuotedName( databaseName ) + connectionString.Substring( match.Index + match.Length ); |
361 | ············} |
362 | |
363 | ············if (connectionString.EndsWith( ";" )) |
364 | ················return connectionString + "Initial Catalog=" + databaseName; |
365 | ············else |
366 | ················return connectionString + ";Initial Catalog=" + databaseName; |
367 | ········} |
368 | |
369 | ········#endregion |
370 | |
371 | ····} |
372 | } |
373 |