1 //------------------------------------------------------------------------------
2 // <copyright file="OLEDB_Util.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
9 namespace System.Data.OleDb {
12 using System.Collections;
13 using System.ComponentModel;
15 using System.Data.Common;
16 using System.Diagnostics;
17 using System.Globalization;
18 using System.Runtime.InteropServices;
21 internal static class ODB {
24 static internal void CommandParameterStatus(StringBuilder builder, int index, DBStatus status) {
27 case DBStatus.S_ISNULL:
28 case DBStatus.S_IGNORE:
31 case DBStatus.E_BADACCESSOR:
32 builder.Append(Res.GetString(Res.OleDb_CommandParameterBadAccessor,index.ToString(CultureInfo.InvariantCulture), ""));
33 builder.Append(Environment.NewLine);
36 case DBStatus.E_CANTCONVERTVALUE:
37 builder.Append(Res.GetString(Res.OleDb_CommandParameterCantConvertValue,index.ToString(CultureInfo.InvariantCulture), ""));
38 builder.Append(Environment.NewLine);
41 case DBStatus.E_SIGNMISMATCH:
42 builder.Append(Res.GetString(Res.OleDb_CommandParameterSignMismatch,index.ToString(CultureInfo.InvariantCulture), ""));
43 builder.Append(Environment.NewLine);
46 case DBStatus.E_DATAOVERFLOW:
47 builder.Append(Res.GetString(Res.OleDb_CommandParameterDataOverflow,index.ToString(CultureInfo.InvariantCulture), ""));
48 builder.Append(Environment.NewLine);
51 case DBStatus.E_CANTCREATE:
52 Debug.Assert(false, "CommandParameterStatus: unexpected E_CANTCREATE");
55 case DBStatus.E_UNAVAILABLE:
56 builder.Append(Res.GetString(Res.OleDb_CommandParameterUnavailable,index.ToString(CultureInfo.InvariantCulture), ""));
57 builder.Append(Environment.NewLine);
60 case DBStatus.E_PERMISSIONDENIED:
61 Debug.Assert(false, "CommandParameterStatus: unexpected E_PERMISSIONDENIED");
64 case DBStatus.E_INTEGRITYVIOLATION:
65 Debug.Assert(false, "CommandParameterStatus: unexpected E_INTEGRITYVIOLATION");
68 case DBStatus.E_SCHEMAVIOLATION:
69 Debug.Assert(false, "CommandParameterStatus: unexpected E_SCHEMAVIOLATION");
72 case DBStatus.E_BADSTATUS:
73 Debug.Assert(false, "CommandParameterStatus: unexpected E_BADSTATUS");
76 case DBStatus.S_DEFAULT: // MDAC 66626
77 builder.Append(Res.GetString(Res.OleDb_CommandParameterDefault,index.ToString(CultureInfo.InvariantCulture), ""));
78 builder.Append(Environment.NewLine);
82 builder.Append(Res.GetString(Res.OleDb_CommandParameterError, index.ToString(CultureInfo.InvariantCulture), status.ToString()));
83 builder.Append(Environment.NewLine);
87 static internal Exception CommandParameterStatus(string value, Exception inner) {
88 if (ADP.IsEmpty(value)) { return inner; }
89 return ADP.InvalidOperation(value, inner);
91 static internal Exception UninitializedParameters(int index, OleDbType dbtype) {
92 return ADP.InvalidOperation(Res.GetString(Res.OleDb_UninitializedParameters, index.ToString(CultureInfo.InvariantCulture), dbtype.ToString()));
94 static internal Exception BadStatus_ParamAcc(int index, DBBindStatus status) {
95 return ADP.DataAdapter(Res.GetString(Res.OleDb_BadStatus_ParamAcc, index.ToString(CultureInfo.InvariantCulture), status.ToString()));
97 static internal Exception NoProviderSupportForParameters(string provider, Exception inner) {
98 return ADP.DataAdapter(Res.GetString(Res.OleDb_NoProviderSupportForParameters, provider), inner);
100 static internal Exception NoProviderSupportForSProcResetParameters(string provider) {
101 return ADP.DataAdapter(Res.GetString(Res.OleDb_NoProviderSupportForSProcResetParameters, provider));
105 static internal void PropsetSetFailure(StringBuilder builder, string description, OleDbPropertyStatus status) {
106 if (OleDbPropertyStatus.Ok == status) {
110 case OleDbPropertyStatus.NotSupported:
111 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
112 builder.Append(Res.GetString(Res.OleDb_PropertyNotSupported, description));
114 case OleDbPropertyStatus.BadValue:
115 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
116 builder.Append(Res.GetString(Res.OleDb_PropertyBadValue, description));
118 case OleDbPropertyStatus.BadOption:
119 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
120 builder.Append(Res.GetString(Res.OleDb_PropertyBadOption, description));
122 case OleDbPropertyStatus.BadColumn:
123 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
124 builder.Append(Res.GetString(Res.OleDb_PropertyBadColumn, description));
126 case OleDbPropertyStatus.NotAllSettable:
127 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
128 builder.Append(Res.GetString(Res.OleDb_PropertyNotAllSettable, description));
130 case OleDbPropertyStatus.NotSettable:
131 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
132 builder.Append(Res.GetString(Res.OleDb_PropertyNotSettable, description));
134 case OleDbPropertyStatus.NotSet:
135 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
136 builder.Append(Res.GetString(Res.OleDb_PropertyNotSet, description));
138 case OleDbPropertyStatus.Conflicting:
139 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
140 builder.Append(Res.GetString(Res.OleDb_PropertyConflicting, description));
142 case OleDbPropertyStatus.NotAvailable:
143 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
144 builder.Append(Res.GetString(Res.OleDb_PropertyNotAvailable, description));
147 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
148 builder.Append(Res.GetString(Res.OleDb_PropertyStatusUnknown, ((int) status).ToString(CultureInfo.InvariantCulture)));
152 static internal Exception PropsetSetFailure(string value, Exception inner) {
153 if (ADP.IsEmpty(value)) { return inner; }
154 return ADP.InvalidOperation(value, inner);
158 static internal ArgumentException SchemaRowsetsNotSupported(string provider) {
159 return ADP.Argument(Res.GetString(Res.OleDb_SchemaRowsetsNotSupported, "IDBSchemaRowset", provider));
161 static internal OleDbException NoErrorInformation(string provider, OleDbHResult hr, Exception inner) {
163 if (!ADP.IsEmpty(provider)) {
164 e = new OleDbException(Res.GetString(Res.OleDb_NoErrorInformation2, provider, ODB.ELookup(hr)), hr, inner);
167 e = new OleDbException(Res.GetString(Res.OleDb_NoErrorInformation, ODB.ELookup(hr)), hr, inner);
169 ADP.TraceExceptionAsReturnValue(e);
172 static internal InvalidOperationException MDACNotAvailable(Exception inner) {
173 return ADP.DataAdapter(Res.GetString(Res.OleDb_MDACNotAvailable), inner);
175 static internal ArgumentException MSDASQLNotSupported() {
176 return ADP.Argument(Res.GetString(Res.OleDb_MSDASQLNotSupported)); // MDAC 69975
178 static internal InvalidOperationException CommandTextNotSupported(string provider, Exception inner) {
179 return ADP.DataAdapter(Res.GetString(Res.OleDb_CommandTextNotSupported, provider), inner); // 72632
181 static internal InvalidOperationException PossiblePromptNotUserInteractive() {
182 return ADP.DataAdapter(Res.GetString(Res.OleDb_PossiblePromptNotUserInteractive));
184 static internal InvalidOperationException ProviderUnavailable(string provider, Exception inner) {
185 //return new OleDbException(Res.GetString(Res.OleDb_ProviderUnavailable, provider), (int)OleDbHResult.CO_E_CLASSSTRING, inner);
186 return ADP.DataAdapter(Res.GetString(Res.OleDb_ProviderUnavailable, provider), inner);
188 static internal InvalidOperationException TransactionsNotSupported(string provider, Exception inner) {
189 return ADP.DataAdapter(Res.GetString(Res.OleDb_TransactionsNotSupported, provider), inner); // 72632
191 static internal ArgumentException AsynchronousNotSupported() {
192 return ADP.Argument(Res.GetString(Res.OleDb_AsynchronousNotSupported));
194 static internal ArgumentException NoProviderSpecified() {
195 return ADP.Argument(Res.GetString(Res.OleDb_NoProviderSpecified));
197 static internal ArgumentException InvalidProviderSpecified() {
198 return ADP.Argument(Res.GetString(Res.OleDb_InvalidProviderSpecified));
200 static internal ArgumentException InvalidRestrictionsDbInfoKeywords(string parameter) {
201 return ADP.Argument(Res.GetString(Res.OleDb_InvalidRestrictionsDbInfoKeywords), parameter);
203 static internal ArgumentException InvalidRestrictionsDbInfoLiteral(string parameter) {
204 return ADP.Argument(Res.GetString(Res.OleDb_InvalidRestrictionsDbInfoLiteral), parameter);
206 static internal ArgumentException InvalidRestrictionsSchemaGuids(string parameter) {
207 return ADP.Argument(Res.GetString(Res.OleDb_InvalidRestrictionsSchemaGuids), parameter);
209 static internal ArgumentException NotSupportedSchemaTable(Guid schema, OleDbConnection connection) {
210 return ADP.Argument(Res.GetString(Res.OleDb_NotSupportedSchemaTable, OleDbSchemaGuid.GetTextFromValue(schema), connection.Provider));
214 static internal Exception InvalidOleDbType(OleDbType value) {
215 return ADP.InvalidEnumerationValue(typeof(OleDbType), (int)value);
219 static internal InvalidOperationException BadAccessor() {
220 return ADP.DataAdapter(Res.GetString(Res.OleDb_BadAccessor));
222 static internal InvalidCastException ConversionRequired() {
223 return ADP.InvalidCast();
225 static internal InvalidCastException CantConvertValue() {
226 return ADP.InvalidCast(Res.GetString(Res.OleDb_CantConvertValue));
228 static internal InvalidOperationException SignMismatch(Type type) {
229 return ADP.DataAdapter(Res.GetString(Res.OleDb_SignMismatch, type.Name));
231 static internal InvalidOperationException DataOverflow(Type type) {
232 return ADP.DataAdapter(Res.GetString(Res.OleDb_DataOverflow, type.Name));
234 static internal InvalidOperationException CantCreate(Type type) {
235 return ADP.DataAdapter(Res.GetString(Res.OleDb_CantCreate, type.Name));
237 static internal InvalidOperationException Unavailable(Type type) {
238 return ADP.DataAdapter(Res.GetString(Res.OleDb_Unavailable, type.Name));
240 static internal InvalidOperationException UnexpectedStatusValue(DBStatus status) {
241 return ADP.DataAdapter(Res.GetString(Res.OleDb_UnexpectedStatusValue, status.ToString()));
243 static internal InvalidOperationException GVtUnknown(int wType) {
244 return ADP.DataAdapter(Res.GetString(Res.OleDb_GVtUnknown, wType.ToString("X4", CultureInfo.InvariantCulture), wType.ToString(CultureInfo.InvariantCulture)));
246 static internal InvalidOperationException SVtUnknown(int wType) {
247 return ADP.DataAdapter(Res.GetString(Res.OleDb_SVtUnknown, wType.ToString("X4", CultureInfo.InvariantCulture), wType.ToString(CultureInfo.InvariantCulture)));
251 static internal InvalidOperationException BadStatusRowAccessor(int i, DBBindStatus rowStatus) {
252 return ADP.DataAdapter(Res.GetString(Res.OleDb_BadStatusRowAccessor, i.ToString(CultureInfo.InvariantCulture), rowStatus.ToString()));
254 static internal InvalidOperationException ThreadApartmentState(Exception innerException) {
255 return ADP.InvalidOperation(Res.GetString(Res.OleDb_ThreadApartmentState), innerException);
259 static internal ArgumentException Fill_NotADODB(string parameter) {
260 return ADP.Argument(Res.GetString(Res.OleDb_Fill_NotADODB), parameter);
262 static internal ArgumentException Fill_EmptyRecordSet(string parameter, Exception innerException) {
263 return ADP.Argument(Res.GetString(Res.OleDb_Fill_EmptyRecordSet, "IRowset"), parameter, innerException);
265 static internal ArgumentException Fill_EmptyRecord(string parameter, Exception innerException) {
266 return ADP.Argument(Res.GetString(Res.OleDb_Fill_EmptyRecord), parameter, innerException);
269 static internal string NoErrorMessage(OleDbHResult errorcode) {
270 return Res.GetString(Res.OleDb_NoErrorMessage, ODB.ELookup(errorcode));
272 static internal string FailedGetDescription(OleDbHResult errorcode) {
273 return Res.GetString(Res.OleDb_FailedGetDescription, ODB.ELookup(errorcode));
275 static internal string FailedGetSource(OleDbHResult errorcode) {
276 return Res.GetString(Res.OleDb_FailedGetSource, ODB.ELookup(errorcode));
279 static internal InvalidOperationException DBBindingGetVector() {
280 return ADP.InvalidOperation(Res.GetString(Res.OleDb_DBBindingGetVector));
283 static internal OleDbHResult GetErrorDescription(UnsafeNativeMethods.IErrorInfo errorInfo, OleDbHResult hresult, out string message) {
284 Bid.Trace("<oledb.IErrorInfo.GetDescription|API|OS>\n");
285 OleDbHResult hr = errorInfo.GetDescription(out message);
286 Bid.Trace("<oledb.IErrorInfo.GetDescription|API|OS|RET> %08X{HRESULT}, Message='%ls'\n", hr, message);
287 if (((int)hr < 0) && ADP.IsEmpty(message)) {
288 message = FailedGetDescription(hr) + Environment.NewLine + ODB.ELookup(hresult);
290 if (ADP.IsEmpty(message)) {
291 message = ODB.ELookup(hresult);
297 internal static ArgumentException ISourcesRowsetNotSupported() {
298 throw ADP.Argument(Res.OleDb_ISourcesRowsetNotSupported);
301 // OleDbMetaDataFactory
302 static internal InvalidOperationException IDBInfoNotSupported() {
303 return ADP.InvalidOperation(Res.GetString(Res.OleDb_IDBInfoNotSupported));
306 // explictly used error codes
307 internal const int ADODB_AlreadyClosedError = unchecked((int)0x800A0E78);
308 internal const int ADODB_NextResultError = unchecked((int)0x800A0CB3);
310 // internal command states
311 internal const int InternalStateExecuting = (int) (ConnectionState.Open | ConnectionState.Executing);
312 internal const int InternalStateFetching = (int) (ConnectionState.Open | ConnectionState.Fetching);
313 internal const int InternalStateClosed = (int) (ConnectionState.Closed);
315 internal const int ExecutedIMultipleResults = 0;
316 internal const int ExecutedIRowset = 1;
317 internal const int ExecutedIRow = 2;
318 internal const int PrepareICommandText = 3;
320 // internal connection states, a superset of the command states
321 internal const int InternalStateExecutingNot = (int) ~(ConnectionState.Executing);
322 internal const int InternalStateFetchingNot = (int) ~(ConnectionState.Fetching);
323 internal const int InternalStateConnecting = (int) (ConnectionState.Connecting);
324 internal const int InternalStateOpen = (int) (ConnectionState.Open);
326 // constants used to trigger from binding as WSTR to BYREF|WSTR
327 // used by OleDbCommand, OleDbDataReader
328 internal const int LargeDataSize = (1 << 13); // 8K
329 internal const int CacheIncrement = 10;
331 // constants used by OleDbDataReader
332 internal static readonly IntPtr DBRESULTFLAG_DEFAULT = IntPtr.Zero;
334 internal const short VARIANT_TRUE = -1;
335 internal const short VARIANT_FALSE = 0;
337 // OleDbConnection constants
338 internal const int CLSCTX_ALL = /*CLSCTX_INPROC_SERVER*/1 | /*CLSCTX_INPROC_HANDLER*/2 | /*CLSCTX_LOCAL_SERVER*/4 | /*CLSCTX_REMOTE_SERVER*/16;
339 internal const int MaxProgIdLength = 255;
341 internal const int DBLITERAL_CATALOG_SEPARATOR = 3;
342 internal const int DBLITERAL_QUOTE_PREFIX = 15;
343 internal const int DBLITERAL_QUOTE_SUFFIX = 28;
344 internal const int DBLITERAL_SCHEMA_SEPARATOR = 27;
345 internal const int DBLITERAL_TABLE_NAME = 17;
346 internal const int DBPROP_ACCESSORDER = 0xe7;
348 internal const int DBPROP_AUTH_CACHE_AUTHINFO = 0x5;
349 internal const int DBPROP_AUTH_ENCRYPT_PASSWORD= 0x6;
350 internal const int DBPROP_AUTH_INTEGRATED = 0x7;
351 internal const int DBPROP_AUTH_MASK_PASSWORD = 0x8;
352 internal const int DBPROP_AUTH_PASSWORD = 0x9;
353 internal const int DBPROP_AUTH_PERSIST_ENCRYPTED = 0xa;
354 internal const int DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO = 0xb;
355 internal const int DBPROP_AUTH_USERID = 0xc;
357 internal const int DBPROP_CATALOGLOCATION = 0x16;
358 internal const int DBPROP_COMMANDTIMEOUT = 0x22;
359 internal const int DBPROP_CONNECTIONSTATUS = 0xf4;
360 internal const int DBPROP_CURRENTCATALOG = 0x25;
361 internal const int DBPROP_DATASOURCENAME = 0x26;
362 internal const int DBPROP_DBMSNAME = 0x28;
363 internal const int DBPROP_DBMSVER = 0x29;
364 internal const int DBPROP_GROUPBY = 0x2c;
365 internal const int DBPROP_HIDDENCOLUMNS = 0x102;
366 internal const int DBPROP_IColumnsRowset = 0x7b;
367 internal const int DBPROP_IDENTIFIERCASE = 0x2e;
369 internal const int DBPROP_INIT_ASYNCH = 0xc8;
370 internal const int DBPROP_INIT_BINDFLAGS = 0x10e;
371 internal const int DBPROP_INIT_CATALOG = 0xe9;
372 internal const int DBPROP_INIT_DATASOURCE = 0x3b;
373 internal const int DBPROP_INIT_GENERALTIMEOUT = 0x11c;
374 internal const int DBPROP_INIT_HWND = 0x3c;
375 internal const int DBPROP_INIT_IMPERSONATION_LEVEL = 0x3d;
376 internal const int DBPROP_INIT_LCID = 0xba;
377 internal const int DBPROP_INIT_LOCATION = 0x3e;
378 internal const int DBPROP_INIT_LOCKOWNER = 0x10f;
379 internal const int DBPROP_INIT_MODE = 0x3f;
380 internal const int DBPROP_INIT_OLEDBSERVICES = 0xf8;
381 internal const int DBPROP_INIT_PROMPT = 0x40;
382 internal const int DBPROP_INIT_PROTECTION_LEVEL= 0x41;
383 internal const int DBPROP_INIT_PROVIDERSTRING = 0xa0;
384 internal const int DBPROP_INIT_TIMEOUT = 0x42;
386 internal const int DBPROP_IRow = 0x107;
387 internal const int DBPROP_MAXROWS = 0x49;
388 internal const int DBPROP_MULTIPLERESULTS = 0xc4;
389 internal const int DBPROP_ORDERBYCOLUNSINSELECT= 0x55;
390 internal const int DBPROP_PROVIDERFILENAME = 0x60;
391 internal const int DBPROP_QUOTEDIDENTIFIERCASE = 0x64;
392 internal const int DBPROP_RESETDATASOURCE = 0xf7;
393 internal const int DBPROP_SQLSUPPORT = 0x6d;
394 internal const int DBPROP_UNIQUEROWS = 0xee;
397 internal const int DBPROPSTATUS_OK = 0;
398 internal const int DBPROPSTATUS_NOTSUPPORTED = 1;
399 internal const int DBPROPSTATUS_BADVALUE = 2;
400 internal const int DBPROPSTATUS_BADOPTION = 3;
401 internal const int DBPROPSTATUS_BADCOLUMN = 4;
402 internal const int DBPROPSTATUS_NOTALLSETTABLE = 5;
403 internal const int DBPROPSTATUS_NOTSETTABLE = 6;
404 internal const int DBPROPSTATUS_NOTSET = 7;
405 internal const int DBPROPSTATUS_CONFLICTING = 8;
406 internal const int DBPROPSTATUS_NOTAVAILABLE = 9;
408 internal const int DBPROPOPTIONS_REQUIRED = 0;
409 internal const int DBPROPOPTIONS_OPTIONAL = 1;
411 internal const int DBPROPFLAGS_WRITE = 0x400;
412 internal const int DBPROPFLAGS_SESSION = 0x1000;
414 // misc. property values
415 internal const int DBPROPVAL_AO_RANDOM = 2;
417 internal const int DBPROPVAL_CL_END = 2;
418 internal const int DBPROPVAL_CL_START = 1;
420 internal const int DBPROPVAL_CS_COMMUNICATIONFAILURE = 2;
421 internal const int DBPROPVAL_CS_INITIALIZED = 1;
422 internal const int DBPROPVAL_CS_UNINITIALIZED = 0;
424 internal const int DBPROPVAL_GB_COLLATE = 16;
425 internal const int DBPROPVAL_GB_CONTAINS_SELECT = 4;
426 internal const int DBPROPVAL_GB_EQUALS_SELECT = 2;
427 internal const int DBPROPVAL_GB_NO_RELATION = 8;
428 internal const int DBPROPVAL_GB_NOT_SUPPORTED = 1;
430 internal const int DBPROPVAL_IC_LOWER = 2;
431 internal const int DBPROPVAL_IC_MIXED = 8;
432 internal const int DBPROPVAL_IC_SENSITIVE = 4;
433 internal const int DBPROPVAL_IC_UPPER = 1;
435 internal const int DBPROPVAL_IN_ALLOWNULL = 0x00000000;
436 /*internal const int DBPROPVAL_IN_DISALLOWNULL = 0x00000001;
437 internal const int DBPROPVAL_IN_IGNORENULL = 0x00000002;
438 internal const int DBPROPVAL_IN_IGNOREANYNULL = 0x00000004;*/
439 internal const int DBPROPVAL_MR_NOTSUPPORTED = 0;
441 internal const int DBPROPVAL_RD_RESETALL = unchecked((int) 0xffffffff);
443 internal const int DBPROPVAL_OS_RESOURCEPOOLING = 0x00000001;
444 internal const int DBPROPVAL_OS_TXNENLISTMENT = 0x00000002;
445 internal const int DBPROPVAL_OS_CLIENTCURSOR = 0x00000004;
446 internal const int DBPROPVAL_OS_AGR_AFTERSESSION = 0x00000008;
447 internal const int DBPROPVAL_SQL_ODBC_MINIMUM = 1;
448 internal const int DBPROPVAL_SQL_ESCAPECLAUSES = 0x00000100;
450 // OLE DB providers never return pGuid-style bindings.
451 // They are provided as a convenient shortcut for consumers supplying bindings all covered by the same GUID (for example, when creating bindings to access data).
452 internal const int DBKIND_GUID_NAME = 0;
453 internal const int DBKIND_GUID_PROPID = 1;
454 internal const int DBKIND_NAME = 2;
455 internal const int DBKIND_PGUID_NAME = 3;
456 internal const int DBKIND_PGUID_PROPID = 4;
457 internal const int DBKIND_PROPID = 5;
458 internal const int DBKIND_GUID = 6;
460 internal const int DBCOLUMNFLAGS_ISBOOKMARK = 0x01;
461 internal const int DBCOLUMNFLAGS_ISLONG = 0x80;
462 internal const int DBCOLUMNFLAGS_ISFIXEDLENGTH = 0x10;
463 internal const int DBCOLUMNFLAGS_ISNULLABLE = 0x20;
464 internal const int DBCOLUMNFLAGS_ISROWSET = 0x100000;
465 internal const int DBCOLUMNFLAGS_ISROW = 0x200000;
466 internal const int DBCOLUMNFLAGS_ISROWSET_DBCOLUMNFLAGS_ISROW = /*DBCOLUMNFLAGS_ISROWSET*/0x100000 | /*DBCOLUMNFLAGS_ISROW*/0x200000;
467 internal const int DBCOLUMNFLAGS_ISLONG_DBCOLUMNFLAGS_ISSTREAM = /*DBCOLUMNFLAGS_ISLONG*/0x80 | /*DBCOLUMNFLAGS_ISSTREAM*/0x80000;
468 internal const int DBCOLUMNFLAGS_ISROWID_DBCOLUMNFLAGS_ISROWVER = /*DBCOLUMNFLAGS_ISROWID*/0x100 | /*DBCOLUMNFLAGS_ISROWVER*/0x200;
469 internal const int DBCOLUMNFLAGS_WRITE_DBCOLUMNFLAGS_WRITEUNKNOWN = /*DBCOLUMNFLAGS_WRITE*/0x4 | /*DBCOLUMNFLAGS_WRITEUNKNOWN*/0x8;
470 internal const int DBCOLUMNFLAGS_ISNULLABLE_DBCOLUMNFLAGS_MAYBENULL = /*DBCOLUMNFLAGS_ISNULLABLE*/0x20 | /*DBCOLUMNFLAGS_MAYBENULL*/0x40;
472 // accessor constants
473 internal const int DBACCESSOR_ROWDATA = 0x2;
474 internal const int DBACCESSOR_PARAMETERDATA = 0x4;
476 // commandbuilder constants
477 internal const int DBPARAMTYPE_INPUT = 0x01;
478 internal const int DBPARAMTYPE_INPUTOUTPUT = 0x02;
479 internal const int DBPARAMTYPE_OUTPUT = 0x03;
480 internal const int DBPARAMTYPE_RETURNVALUE = 0x04;
482 // parameter constants
483 /*internal const int DBPARAMIO_NOTPARAM = 0;
484 internal const int DBPARAMIO_INPUT = 0x1;
485 internal const int DBPARAMIO_OUTPUT = 0x2;*/
487 /*internal const int DBPARAMFLAGS_ISINPUT = 0x1;
488 internal const int DBPARAMFLAGS_ISOUTPUT = 0x2;
489 internal const int DBPARAMFLAGS_ISSIGNED = 0x10;
490 internal const int DBPARAMFLAGS_ISNULLABLE = 0x40;
491 internal const int DBPARAMFLAGS_ISLONG = 0x80;*/
493 internal const int ParameterDirectionFlag = 3;
495 // values of the searchable column in the provider types schema rowset
496 internal const uint DB_UNSEARCHABLE = 1;
497 internal const uint DB_LIKE_ONLY = 2;
498 internal const uint DB_ALL_EXCEPT_LIKE = 3;
499 internal const uint DB_SEARCHABLE = 4;
501 static internal readonly IntPtr DB_INVALID_HACCESSOR = ADP.PtrZero;
502 static internal readonly IntPtr DB_NULL_HCHAPTER = ADP.PtrZero;
503 static internal readonly IntPtr DB_NULL_HROW = ADP.PtrZero;
505 /*static internal readonly int SizeOf_tagDBPARAMINFO = Marshal.SizeOf(typeof(tagDBPARAMINFO));*/
506 static internal readonly int SizeOf_tagDBBINDING = Marshal.SizeOf(typeof(tagDBBINDING));
507 static internal readonly int SizeOf_tagDBCOLUMNINFO = Marshal.SizeOf(typeof(tagDBCOLUMNINFO));
508 static internal readonly int SizeOf_tagDBLITERALINFO = Marshal.SizeOf(typeof(tagDBLITERALINFO));
509 static internal readonly int SizeOf_tagDBPROPSET = Marshal.SizeOf(typeof(tagDBPROPSET));
510 static internal readonly int SizeOf_tagDBPROP = Marshal.SizeOf(typeof(tagDBPROP));
511 static internal readonly int SizeOf_tagDBPROPINFOSET = Marshal.SizeOf(typeof(tagDBPROPINFOSET));
512 static internal readonly int SizeOf_tagDBPROPINFO = Marshal.SizeOf(typeof(tagDBPROPINFO));
513 static internal readonly int SizeOf_tagDBPROPIDSET = Marshal.SizeOf(typeof(tagDBPROPIDSET));
514 static internal readonly int SizeOf_Guid = Marshal.SizeOf(typeof(Guid));
515 static internal readonly int SizeOf_Variant = 8 + (2 * ADP.PtrSize); // 16 on 32bit, 24 on 64bit
517 static internal readonly int OffsetOf_tagDBPROP_Status = Marshal.OffsetOf(typeof(tagDBPROP), "dwStatus").ToInt32();
518 static internal readonly int OffsetOf_tagDBPROP_Value = Marshal.OffsetOf(typeof(tagDBPROP), "vValue").ToInt32();
519 static internal readonly int OffsetOf_tagDBPROPSET_Properties = Marshal.OffsetOf(typeof(tagDBPROPSET), "rgProperties").ToInt32();
520 static internal readonly int OffsetOf_tagDBPROPINFO_Value = Marshal.OffsetOf(typeof(tagDBPROPINFO), "vValue").ToInt32();
521 static internal readonly int OffsetOf_tagDBPROPIDSET_PropertySet = Marshal.OffsetOf(typeof(tagDBPROPIDSET), "guidPropertySet").ToInt32();
522 static internal readonly int OffsetOf_tagDBLITERALINFO_it = Marshal.OffsetOf(typeof(tagDBLITERALINFO), "it").ToInt32();
523 static internal readonly int OffsetOf_tagDBBINDING_obValue = Marshal.OffsetOf(typeof(tagDBBINDING), "obValue").ToInt32();
524 static internal readonly int OffsetOf_tagDBBINDING_wType = Marshal.OffsetOf(typeof(tagDBBINDING), "wType").ToInt32();
526 static internal Guid IID_NULL = Guid.Empty;
527 static internal Guid IID_IUnknown = new Guid(0x00000000,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
528 static internal Guid IID_IDBInitialize = new Guid(0x0C733A8B,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
529 static internal Guid IID_IDBCreateSession = new Guid(0x0C733A5D,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
530 static internal Guid IID_IDBCreateCommand = new Guid(0x0C733A1D,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
531 static internal Guid IID_ICommandText = new Guid(0x0C733A27,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
532 static internal Guid IID_IMultipleResults = new Guid(0x0C733A90,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
533 static internal Guid IID_IRow = new Guid(0x0C733AB4,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
534 static internal Guid IID_IRowset = new Guid(0x0C733A7C,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
535 static internal Guid IID_ISQLErrorInfo = new Guid(0x0C733A74,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
537 static internal Guid CLSID_DataLinks = new Guid(0x2206CDB2,0x19C1,0x11D1,0x89,0xE0,0x00,0xC0,0x4F,0xD7,0xA8,0x29);
539 static internal Guid DBGUID_DEFAULT = new Guid(0xc8b521fb,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
540 static internal Guid DBGUID_ROWSET = new Guid(0xc8b522f6,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
541 static internal Guid DBGUID_ROW = new Guid(0xc8b522f7,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
543 static internal Guid DBGUID_ROWDEFAULTSTREAM = new Guid(0x0C733AB7,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
545 static internal readonly Guid CLSID_MSDASQL = new Guid(0xc8b522cb,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
547 static internal readonly object DBCOL_SPECIALCOL = new Guid(0xc8b52232,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
549 static internal readonly char[] ErrorTrimCharacters = new char[] { '\r', '\n', '\0' }; // MDAC 73707
551 // used by ConnectionString hashtable, must be all lowercase
552 internal const string Asynchronous_Processing = "asynchronous processing";
553 internal const string AttachDBFileName = "attachdbfilename";
554 internal const string Connect_Timeout = "connect timeout";
555 internal const string Data_Source = "data source";
556 internal const string File_Name = "file name";
557 internal const string Initial_Catalog = "initial catalog";
558 internal const string Password = "password";
559 internal const string Persist_Security_Info = "persist security info";
560 internal const string Provider = "provider";
561 internal const string Pwd = "pwd";
562 internal const string User_ID = "user id";
564 // used by OleDbConnection as property names
565 internal const string Current_Catalog = "current catalog";
566 internal const string DBMS_Version = "dbms version";
567 internal const string Properties = "Properties";
569 // used by OleDbConnection to create and verify OLE DB Services
570 internal const string DataLinks_CLSID = "CLSID\\{2206CDB2-19C1-11D1-89E0-00C04FD7A829}\\InprocServer32";
571 internal const string OLEDB_SERVICES = "OLEDB_SERVICES";
573 // used by OleDbConnection to eliminate post-open detection of 'Microsoft OLE DB Provider for ODBC Drivers'
574 internal const string DefaultDescription_MSDASQL = "microsoft ole db provider for odbc drivers";
575 internal const string MSDASQL = "msdasql";
576 internal const string MSDASQLdot = "msdasql.";
578 // used by OleDbPermission
579 internal const string _Add = "add";
580 internal const string _Keyword = "keyword";
581 internal const string _Name = "name";
582 internal const string _Value = "value";
584 // IColumnsRowset column names
585 internal const string DBCOLUMN_BASECATALOGNAME = "DBCOLUMN_BASECATALOGNAME";
586 internal const string DBCOLUMN_BASECOLUMNNAME = "DBCOLUMN_BASECOLUMNNAME";
587 internal const string DBCOLUMN_BASESCHEMANAME = "DBCOLUMN_BASESCHEMANAME";
588 internal const string DBCOLUMN_BASETABLENAME = "DBCOLUMN_BASETABLENAME";
589 internal const string DBCOLUMN_COLUMNSIZE = "DBCOLUMN_COLUMNSIZE";
590 internal const string DBCOLUMN_FLAGS = "DBCOLUMN_FLAGS";
591 internal const string DBCOLUMN_GUID = "DBCOLUMN_GUID";
592 internal const string DBCOLUMN_IDNAME = "DBCOLUMN_IDNAME";
593 internal const string DBCOLUMN_ISAUTOINCREMENT = "DBCOLUMN_ISAUTOINCREMENT";
594 internal const string DBCOLUMN_ISUNIQUE = "DBCOLUMN_ISUNIQUE";
595 internal const string DBCOLUMN_KEYCOLUMN = "DBCOLUMN_KEYCOLUMN";
596 internal const string DBCOLUMN_NAME = "DBCOLUMN_NAME";
597 internal const string DBCOLUMN_NUMBER = "DBCOLUMN_NUMBER";
598 internal const string DBCOLUMN_PRECISION = "DBCOLUMN_PRECISION";
599 internal const string DBCOLUMN_PROPID = "DBCOLUMN_PROPID";
600 internal const string DBCOLUMN_SCALE = "DBCOLUMN_SCALE";
601 internal const string DBCOLUMN_TYPE = "DBCOLUMN_TYPE";
602 internal const string DBCOLUMN_TYPEINFO = "DBCOLUMN_TYPEINFO";
604 // ISchemaRowset.GetRowset(OleDbSchemaGuid.Indexes) column names
605 internal const string PRIMARY_KEY = "PRIMARY_KEY";
606 internal const string UNIQUE = "UNIQUE";
607 internal const string COLUMN_NAME = "COLUMN_NAME";
608 internal const string NULLS = "NULLS";
609 internal const string INDEX_NAME = "INDEX_NAME";
611 // ISchemaRowset.GetSchemaRowset(OleDbSchemaGuid.Procedure_Parameters) column names
612 internal const string PARAMETER_NAME = "PARAMETER_NAME";
613 internal const string ORDINAL_POSITION = "ORDINAL_POSITION";
614 internal const string PARAMETER_TYPE = "PARAMETER_TYPE";
615 internal const string IS_NULLABLE = "IS_NULLABLE";
616 internal const string DATA_TYPE = "DATA_TYPE";
617 internal const string CHARACTER_MAXIMUM_LENGTH = "CHARACTER_MAXIMUM_LENGTH";
618 internal const string NUMERIC_PRECISION = "NUMERIC_PRECISION";
619 internal const string NUMERIC_SCALE = "NUMERIC_SCALE";
620 internal const string TYPE_NAME = "TYPE_NAME";
622 // DataTable.Select to sort on ordinal position for OleDbSchemaGuid.Procedure_Parameters
623 internal const string ORDINAL_POSITION_ASC = "ORDINAL_POSITION ASC";
625 // OleDbConnection.GetOleDbSchemmaTable(OleDbSchemaGuid.SchemaGuids) table and column names
626 internal const string SchemaGuids = "SchemaGuids";
627 internal const string Schema = "Schema";
628 internal const string RestrictionSupport = "RestrictionSupport";
630 // OleDbConnection.GetOleDbSchemmaTable(OleDbSchemaGuid.DbInfoKeywords) table and column names
631 internal const string DbInfoKeywords = "DbInfoKeywords";
632 internal const string Keyword = "Keyword";
634 // Debug error string writeline
635 static internal string ELookup(OleDbHResult hr) {
636 StringBuilder builder = new StringBuilder();
637 builder.Append(hr.ToString());
638 if ((0 < builder.Length) && Char.IsDigit(builder[0])) {
641 builder.Append("(0x");
642 builder.Append(((int)hr).ToString("X8", CultureInfo.InvariantCulture));
644 return builder.ToString();
648 static readonly private Hashtable g_wlookpup = new Hashtable();
649 static internal string WLookup(short id) {
650 string value = (string)g_wlookpup[id];
652 value = "0x" + ((short) id).ToString("X2", CultureInfo.InvariantCulture) + " " + ((short) id);
653 value += " " + ((DBTypeEnum) id).ToString();
654 g_wlookpup[id] = value;
659 private enum DBTypeEnum {
681 FILETIME = 64, // 2.0
686 NUMERIC = 131, // with potential overflow
687 UDT = 132, // should never be encountered
690 DBTIMESTAMP = 135, // granularity reduced from 1ns to 100ns (sql is 3.33 milli seconds)
691 HCHAPTER = 136, // 1.5
692 PROPVARIANT = 138, // 2.0 - as variant
693 VARNUMERIC = 139, // 2.0 - as string else ConversionException
702 BYREF_IDISPATCH = 0x4009,
703 BYREF_ERROR = 0x400a,
705 BYREF_VARIANT = 0x400c,
706 BYREF_IUNKNOWN = 0x400d,
707 BYREF_DECIMAL = 0x400e,
714 BYREF_FILETIME = 0x4040,
716 BYREF_BYTES = 0x4080,
719 BYREF_NUMERIC = 0x4083,
721 BYREF_DBDATE = 0x4085,
722 BYREF_DBTIME = 0x4086,
723 BYREF_DBTIMESTAMP = 0x4087,
724 BYREF_HCHAPTER = 0x4088,
725 BYREF_PROPVARIANT = 0x408a,
726 BYREF_VARNUMERIC = 0x408b,
731 RESERVED = 0x8000, // SystemException