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