Welcome to mirror list, hosted at ThFree Co, Russian Federation.

OLEDB_Util.cs « OleDb « Data « System « System.Data « referencesource « class « mcs - github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 66c7ead9d2710faefc1c1bb6e616e2a21c0be91d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
//------------------------------------------------------------------------------
// <copyright file="OLEDB_Util.cs" company="Microsoft">
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
// <owner current="true" primary="true">[....]</owner>
// <owner current="true" primary="false">[....]</owner>
//------------------------------------------------------------------------------

namespace System.Data.OleDb {

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Data.Common;
    using System.Diagnostics;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using System.Text;

    internal static class ODB {

        // OleDbCommand
        static internal void CommandParameterStatus(StringBuilder builder, int index, DBStatus status) {
            switch (status) {
            case DBStatus.S_OK:
            case DBStatus.S_ISNULL:
            case DBStatus.S_IGNORE:
                break;

            case DBStatus.E_BADACCESSOR:
                builder.Append(Res.GetString(Res.OleDb_CommandParameterBadAccessor,index.ToString(CultureInfo.InvariantCulture), ""));
                builder.Append(Environment.NewLine);
                break;

            case DBStatus.E_CANTCONVERTVALUE:
                builder.Append(Res.GetString(Res.OleDb_CommandParameterCantConvertValue,index.ToString(CultureInfo.InvariantCulture), ""));
                builder.Append(Environment.NewLine);
                break;

            case DBStatus.E_SIGNMISMATCH:
                builder.Append(Res.GetString(Res.OleDb_CommandParameterSignMismatch,index.ToString(CultureInfo.InvariantCulture), ""));
                builder.Append(Environment.NewLine);
                break;

            case DBStatus.E_DATAOVERFLOW:
                builder.Append(Res.GetString(Res.OleDb_CommandParameterDataOverflow,index.ToString(CultureInfo.InvariantCulture), ""));
                builder.Append(Environment.NewLine);
                break;

            case DBStatus.E_CANTCREATE:
                Debug.Assert(false, "CommandParameterStatus: unexpected E_CANTCREATE");
                goto default;

            case DBStatus.E_UNAVAILABLE:
                builder.Append(Res.GetString(Res.OleDb_CommandParameterUnavailable,index.ToString(CultureInfo.InvariantCulture), ""));
                builder.Append(Environment.NewLine);
                break;

            case DBStatus.E_PERMISSIONDENIED:
                Debug.Assert(false, "CommandParameterStatus: unexpected E_PERMISSIONDENIED");
                goto default;

            case DBStatus.E_INTEGRITYVIOLATION:
                Debug.Assert(false, "CommandParameterStatus: unexpected E_INTEGRITYVIOLATION");
                goto default;

            case DBStatus.E_SCHEMAVIOLATION:
                Debug.Assert(false, "CommandParameterStatus: unexpected E_SCHEMAVIOLATION");
                goto default;

            case DBStatus.E_BADSTATUS:
                Debug.Assert(false, "CommandParameterStatus: unexpected E_BADSTATUS");
                goto default;

            case DBStatus.S_DEFAULT: // MDAC 66626
                builder.Append(Res.GetString(Res.OleDb_CommandParameterDefault,index.ToString(CultureInfo.InvariantCulture), ""));
                builder.Append(Environment.NewLine);
                break;

            default:
                builder.Append(Res.GetString(Res.OleDb_CommandParameterError, index.ToString(CultureInfo.InvariantCulture), status.ToString()));
                builder.Append(Environment.NewLine);
                break;
            }
        }
        static internal Exception CommandParameterStatus(string value, Exception inner) {
            if (ADP.IsEmpty(value)) { return inner; }
            return ADP.InvalidOperation(value, inner);
        }
        static internal Exception UninitializedParameters(int index, OleDbType dbtype) {
            return ADP.InvalidOperation(Res.GetString(Res.OleDb_UninitializedParameters, index.ToString(CultureInfo.InvariantCulture), dbtype.ToString()));
        }
        static internal Exception BadStatus_ParamAcc(int index, DBBindStatus status) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_BadStatus_ParamAcc, index.ToString(CultureInfo.InvariantCulture), status.ToString()));
        }
        static internal Exception NoProviderSupportForParameters(string provider, Exception inner) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_NoProviderSupportForParameters, provider), inner);
        }
        static internal Exception NoProviderSupportForSProcResetParameters(string provider) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_NoProviderSupportForSProcResetParameters, provider));
        }

        // OleDbProperties
        static internal void PropsetSetFailure(StringBuilder builder, string description, OleDbPropertyStatus status) {
            if (OleDbPropertyStatus.Ok == status) {
                return;
            }
            switch (status) {
            case OleDbPropertyStatus.NotSupported:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyNotSupported, description));
                break;
            case OleDbPropertyStatus.BadValue:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyBadValue, description));
                break;
            case OleDbPropertyStatus.BadOption:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyBadOption, description));
                break;
            case OleDbPropertyStatus.BadColumn:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyBadColumn, description));
                break;
            case OleDbPropertyStatus.NotAllSettable:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyNotAllSettable, description));
                break;
            case OleDbPropertyStatus.NotSettable:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyNotSettable, description));
                break;
            case OleDbPropertyStatus.NotSet:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyNotSet, description));
                break;
            case OleDbPropertyStatus.Conflicting:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyConflicting, description));
                break;
            case OleDbPropertyStatus.NotAvailable:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyNotAvailable, description));
                break;
            default:
                if (0 < builder.Length) { builder.Append(Environment.NewLine); }
                builder.Append(Res.GetString(Res.OleDb_PropertyStatusUnknown, ((int) status).ToString(CultureInfo.InvariantCulture)));
                break;
            }
        }
        static internal Exception PropsetSetFailure(string value, Exception inner) {
            if (ADP.IsEmpty(value)) { return inner; }
            return ADP.InvalidOperation(value, inner);
        }

        // OleDbConnection
        static internal ArgumentException SchemaRowsetsNotSupported(string provider) {
            return ADP.Argument(Res.GetString(Res.OleDb_SchemaRowsetsNotSupported, "IDBSchemaRowset", provider));
        }
        static internal OleDbException NoErrorInformation(string provider, OleDbHResult hr, Exception inner) {
            OleDbException e;
            if (!ADP.IsEmpty(provider)) {
                e = new OleDbException(Res.GetString(Res.OleDb_NoErrorInformation2, provider, ODB.ELookup(hr)), hr, inner);
            }
            else {
                e = new OleDbException(Res.GetString(Res.OleDb_NoErrorInformation, ODB.ELookup(hr)), hr, inner);
            }
            ADP.TraceExceptionAsReturnValue(e);
            return e;
        }
        static internal InvalidOperationException MDACNotAvailable(Exception inner) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_MDACNotAvailable), inner);
        }
        static internal ArgumentException MSDASQLNotSupported() {
            return ADP.Argument(Res.GetString(Res.OleDb_MSDASQLNotSupported)); // MDAC 69975
        }
        static internal InvalidOperationException CommandTextNotSupported(string provider, Exception inner) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_CommandTextNotSupported, provider), inner); // 72632
        }
        static internal InvalidOperationException PossiblePromptNotUserInteractive() {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_PossiblePromptNotUserInteractive));
        }
        static internal InvalidOperationException ProviderUnavailable(string provider, Exception inner) {
            //return new OleDbException(Res.GetString(Res.OleDb_ProviderUnavailable, provider), (int)OleDbHResult.CO_E_CLASSSTRING, inner);
            return ADP.DataAdapter(Res.GetString(Res.OleDb_ProviderUnavailable, provider), inner);
        }
        static internal InvalidOperationException TransactionsNotSupported(string provider, Exception inner) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_TransactionsNotSupported, provider), inner); // 72632
        }
        static internal ArgumentException AsynchronousNotSupported() {
            return ADP.Argument(Res.GetString(Res.OleDb_AsynchronousNotSupported));
        }
        static internal ArgumentException NoProviderSpecified() {
            return ADP.Argument(Res.GetString(Res.OleDb_NoProviderSpecified));
        }
        static internal ArgumentException InvalidProviderSpecified() {
            return ADP.Argument(Res.GetString(Res.OleDb_InvalidProviderSpecified));
        }
        static internal ArgumentException InvalidRestrictionsDbInfoKeywords(string parameter) {
            return ADP.Argument(Res.GetString(Res.OleDb_InvalidRestrictionsDbInfoKeywords), parameter);
        }
        static internal ArgumentException InvalidRestrictionsDbInfoLiteral(string parameter) {
            return ADP.Argument(Res.GetString(Res.OleDb_InvalidRestrictionsDbInfoLiteral), parameter);
        }
        static internal ArgumentException InvalidRestrictionsSchemaGuids(string parameter) {
            return ADP.Argument(Res.GetString(Res.OleDb_InvalidRestrictionsSchemaGuids), parameter);
        }
        static internal ArgumentException NotSupportedSchemaTable(Guid schema, OleDbConnection connection) {
            return ADP.Argument(Res.GetString(Res.OleDb_NotSupportedSchemaTable, OleDbSchemaGuid.GetTextFromValue(schema), connection.Provider));
        }

        // OleDbParameter
        static internal Exception InvalidOleDbType(OleDbType value) {
            return ADP.InvalidEnumerationValue(typeof(OleDbType), (int)value);
        }

        // Getting Data
        static internal InvalidOperationException BadAccessor() {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_BadAccessor));
        }
        static internal InvalidCastException ConversionRequired() {
            return ADP.InvalidCast();
        }
        static internal InvalidCastException CantConvertValue() {
            return ADP.InvalidCast(Res.GetString(Res.OleDb_CantConvertValue));
        }
        static internal InvalidOperationException SignMismatch(Type type) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_SignMismatch, type.Name));
        }
        static internal InvalidOperationException DataOverflow(Type type) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_DataOverflow, type.Name));
        }
        static internal InvalidOperationException CantCreate(Type type) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_CantCreate, type.Name));
        }
        static internal InvalidOperationException Unavailable(Type type) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_Unavailable, type.Name));
        }
        static internal InvalidOperationException UnexpectedStatusValue(DBStatus status) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_UnexpectedStatusValue, status.ToString()));
        }
        static internal InvalidOperationException GVtUnknown(int wType) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_GVtUnknown, wType.ToString("X4", CultureInfo.InvariantCulture), wType.ToString(CultureInfo.InvariantCulture)));
        }
        static internal InvalidOperationException SVtUnknown(int wType) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_SVtUnknown, wType.ToString("X4", CultureInfo.InvariantCulture), wType.ToString(CultureInfo.InvariantCulture)));
        }

        // OleDbDataReader
        static internal InvalidOperationException BadStatusRowAccessor(int i, DBBindStatus rowStatus) {
            return ADP.DataAdapter(Res.GetString(Res.OleDb_BadStatusRowAccessor, i.ToString(CultureInfo.InvariantCulture), rowStatus.ToString()));
        }
        static internal InvalidOperationException ThreadApartmentState(Exception innerException) {
            return ADP.InvalidOperation(Res.GetString(Res.OleDb_ThreadApartmentState), innerException);
        }

        // OleDbDataAdapter
        static internal ArgumentException Fill_NotADODB(string parameter) {
            return ADP.Argument(Res.GetString(Res.OleDb_Fill_NotADODB), parameter);
        }
        static internal ArgumentException Fill_EmptyRecordSet(string parameter, Exception innerException) {
            return ADP.Argument(Res.GetString(Res.OleDb_Fill_EmptyRecordSet, "IRowset"), parameter, innerException);
        }
        static internal ArgumentException Fill_EmptyRecord(string parameter, Exception innerException) {
            return ADP.Argument(Res.GetString(Res.OleDb_Fill_EmptyRecord), parameter, innerException);
        }

        static internal string NoErrorMessage(OleDbHResult errorcode) {
            return Res.GetString(Res.OleDb_NoErrorMessage, ODB.ELookup(errorcode));
        }
        static internal string FailedGetDescription(OleDbHResult errorcode) {
            return Res.GetString(Res.OleDb_FailedGetDescription, ODB.ELookup(errorcode));
        }
        static internal string FailedGetSource(OleDbHResult errorcode) {
            return Res.GetString(Res.OleDb_FailedGetSource, ODB.ELookup(errorcode));
        }

        static internal InvalidOperationException DBBindingGetVector() {
            return ADP.InvalidOperation(Res.GetString(Res.OleDb_DBBindingGetVector));
        }

        static internal OleDbHResult GetErrorDescription(UnsafeNativeMethods.IErrorInfo errorInfo, OleDbHResult hresult, out string message) {
            Bid.Trace("<oledb.IErrorInfo.GetDescription|API|OS>\n");
            OleDbHResult hr = errorInfo.GetDescription(out message);
            Bid.Trace("<oledb.IErrorInfo.GetDescription|API|OS|RET> %08X{HRESULT}, Message='%ls'\n", hr, message);
            if (((int)hr < 0) && ADP.IsEmpty(message)) {
                message = FailedGetDescription(hr) + Environment.NewLine + ODB.ELookup(hresult);
            }
            if (ADP.IsEmpty(message)) {
                message = ODB.ELookup(hresult);
            }
            return hr;
        }

        // OleDbEnumerator
        internal static ArgumentException ISourcesRowsetNotSupported() {
            throw ADP.Argument(Res.OleDb_ISourcesRowsetNotSupported);
        }

        // OleDbMetaDataFactory
        static internal InvalidOperationException IDBInfoNotSupported() {
            return ADP.InvalidOperation(Res.GetString(Res.OleDb_IDBInfoNotSupported));
        }

        // explictly used error codes
        internal const int ADODB_AlreadyClosedError = unchecked((int)0x800A0E78);
        internal const int ADODB_NextResultError    = unchecked((int)0x800A0CB3);

        // internal command states
        internal const int InternalStateExecuting = (int) (ConnectionState.Open | ConnectionState.Executing);
        internal const int InternalStateFetching = (int) (ConnectionState.Open | ConnectionState.Fetching);
        internal const int InternalStateClosed = (int) (ConnectionState.Closed);

        internal const int ExecutedIMultipleResults = 0;
        internal const int ExecutedIRowset          = 1;
        internal const int ExecutedIRow             = 2;
        internal const int PrepareICommandText      = 3;

        // internal connection states, a superset of the command states
        internal const int InternalStateExecutingNot = (int) ~(ConnectionState.Executing);
        internal const int InternalStateFetchingNot = (int) ~(ConnectionState.Fetching);
        internal const int InternalStateConnecting = (int) (ConnectionState.Connecting);
        internal const int InternalStateOpen = (int) (ConnectionState.Open);

        // constants used to trigger from binding as WSTR to BYREF|WSTR
        // used by OleDbCommand, OleDbDataReader
        internal const int LargeDataSize = (1 << 13); // 8K
        internal const int CacheIncrement = 10;

        // constants used by OleDbDataReader
        internal static readonly IntPtr DBRESULTFLAG_DEFAULT = IntPtr.Zero;

        internal const short VARIANT_TRUE = -1;
        internal const short VARIANT_FALSE = 0;

        // OleDbConnection constants
        internal const int CLSCTX_ALL = /*CLSCTX_INPROC_SERVER*/1 | /*CLSCTX_INPROC_HANDLER*/2 | /*CLSCTX_LOCAL_SERVER*/4 | /*CLSCTX_REMOTE_SERVER*/16;
        internal const int MaxProgIdLength = 255;

        internal const int DBLITERAL_CATALOG_SEPARATOR = 3;
        internal const int DBLITERAL_QUOTE_PREFIX      = 15;
        internal const int DBLITERAL_QUOTE_SUFFIX      = 28;
        internal const int DBLITERAL_SCHEMA_SEPARATOR  = 27;
        internal const int DBLITERAL_TABLE_NAME        = 17;
        internal const int DBPROP_ACCESSORDER          = 0xe7;

        internal const int DBPROP_AUTH_CACHE_AUTHINFO  = 0x5;
        internal const int DBPROP_AUTH_ENCRYPT_PASSWORD= 0x6;
        internal const int DBPROP_AUTH_INTEGRATED      = 0x7;
        internal const int DBPROP_AUTH_MASK_PASSWORD   = 0x8;
        internal const int DBPROP_AUTH_PASSWORD        = 0x9;
        internal const int DBPROP_AUTH_PERSIST_ENCRYPTED            = 0xa;
        internal const int DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO   = 0xb;
        internal const int DBPROP_AUTH_USERID          = 0xc;

        internal const int DBPROP_CATALOGLOCATION      = 0x16;
        internal const int DBPROP_COMMANDTIMEOUT       = 0x22;
        internal const int DBPROP_CONNECTIONSTATUS     = 0xf4;
        internal const int DBPROP_CURRENTCATALOG       = 0x25;
        internal const int DBPROP_DATASOURCENAME       = 0x26;
        internal const int DBPROP_DBMSNAME             = 0x28;
        internal const int DBPROP_DBMSVER              = 0x29;
        internal const int DBPROP_GROUPBY              = 0x2c;
        internal const int DBPROP_HIDDENCOLUMNS        = 0x102;
        internal const int DBPROP_IColumnsRowset       = 0x7b;
        internal const int DBPROP_IDENTIFIERCASE       = 0x2e;

        internal const int DBPROP_INIT_ASYNCH          = 0xc8;
        internal const int DBPROP_INIT_BINDFLAGS       = 0x10e;
        internal const int DBPROP_INIT_CATALOG         = 0xe9;
        internal const int DBPROP_INIT_DATASOURCE      = 0x3b;
        internal const int DBPROP_INIT_GENERALTIMEOUT  = 0x11c;
        internal const int DBPROP_INIT_HWND            = 0x3c;
        internal const int DBPROP_INIT_IMPERSONATION_LEVEL = 0x3d;
        internal const int DBPROP_INIT_LCID            = 0xba;
        internal const int DBPROP_INIT_LOCATION        = 0x3e;
        internal const int DBPROP_INIT_LOCKOWNER       = 0x10f;
        internal const int DBPROP_INIT_MODE            = 0x3f;
        internal const int DBPROP_INIT_OLEDBSERVICES   = 0xf8;
        internal const int DBPROP_INIT_PROMPT          = 0x40;
        internal const int DBPROP_INIT_PROTECTION_LEVEL= 0x41;
        internal const int DBPROP_INIT_PROVIDERSTRING  = 0xa0;
        internal const int DBPROP_INIT_TIMEOUT         = 0x42;

        internal const int DBPROP_IRow                 = 0x107;
        internal const int DBPROP_MAXROWS              = 0x49;
        internal const int DBPROP_MULTIPLERESULTS      = 0xc4;
        internal const int DBPROP_ORDERBYCOLUNSINSELECT= 0x55;
        internal const int DBPROP_PROVIDERFILENAME     = 0x60;
        internal const int DBPROP_QUOTEDIDENTIFIERCASE = 0x64;
        internal const int DBPROP_RESETDATASOURCE      = 0xf7;
        internal const int DBPROP_SQLSUPPORT           = 0x6d;
        internal const int DBPROP_UNIQUEROWS           = 0xee;

        // property status
        internal const int DBPROPSTATUS_OK             = 0;
        internal const int DBPROPSTATUS_NOTSUPPORTED   = 1;
        internal const int DBPROPSTATUS_BADVALUE       = 2;
        internal const int DBPROPSTATUS_BADOPTION      = 3;
        internal const int DBPROPSTATUS_BADCOLUMN      = 4;
        internal const int DBPROPSTATUS_NOTALLSETTABLE = 5;
        internal const int DBPROPSTATUS_NOTSETTABLE    = 6;
        internal const int DBPROPSTATUS_NOTSET         = 7;
        internal const int DBPROPSTATUS_CONFLICTING    = 8;
        internal const int DBPROPSTATUS_NOTAVAILABLE   = 9;

        internal const int DBPROPOPTIONS_REQUIRED = 0;
        internal const int DBPROPOPTIONS_OPTIONAL = 1;

        internal const int DBPROPFLAGS_WRITE   = 0x400;
        internal const int DBPROPFLAGS_SESSION = 0x1000;

        // misc. property values
        internal const int DBPROPVAL_AO_RANDOM = 2;

        internal const int DBPROPVAL_CL_END   = 2;
        internal const int DBPROPVAL_CL_START = 1;

        internal const int DBPROPVAL_CS_COMMUNICATIONFAILURE = 2;
        internal const int DBPROPVAL_CS_INITIALIZED          = 1;
        internal const int DBPROPVAL_CS_UNINITIALIZED        = 0;

        internal const int DBPROPVAL_GB_COLLATE              = 16;
        internal const int DBPROPVAL_GB_CONTAINS_SELECT      = 4;
        internal const int DBPROPVAL_GB_EQUALS_SELECT        = 2;
        internal const int DBPROPVAL_GB_NO_RELATION          = 8;
        internal const int DBPROPVAL_GB_NOT_SUPPORTED        = 1;

        internal const int DBPROPVAL_IC_LOWER                = 2;
        internal const int DBPROPVAL_IC_MIXED                = 8;
        internal const int DBPROPVAL_IC_SENSITIVE            = 4;
        internal const int DBPROPVAL_IC_UPPER                = 1;

        internal const int DBPROPVAL_IN_ALLOWNULL     = 0x00000000;
        /*internal const int DBPROPVAL_IN_DISALLOWNULL  = 0x00000001;
        internal const int DBPROPVAL_IN_IGNORENULL    = 0x00000002;
        internal const int DBPROPVAL_IN_IGNOREANYNULL = 0x00000004;*/
        internal const int DBPROPVAL_MR_NOTSUPPORTED         = 0;

        internal const int DBPROPVAL_RD_RESETALL         = unchecked((int) 0xffffffff);

        internal const int DBPROPVAL_OS_RESOURCEPOOLING  = 0x00000001;
        internal const int DBPROPVAL_OS_TXNENLISTMENT    = 0x00000002;
        internal const int DBPROPVAL_OS_CLIENTCURSOR     = 0x00000004;
        internal const int DBPROPVAL_OS_AGR_AFTERSESSION = 0x00000008;
        internal const int DBPROPVAL_SQL_ODBC_MINIMUM = 1;
        internal const int DBPROPVAL_SQL_ESCAPECLAUSES   = 0x00000100;

        // OLE DB providers never return pGuid-style bindings.
        // 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).
        internal const int DBKIND_GUID_NAME = 0;
        internal const int DBKIND_GUID_PROPID = 1;
        internal const int DBKIND_NAME = 2;
        internal const int DBKIND_PGUID_NAME = 3;
        internal const int DBKIND_PGUID_PROPID = 4;
        internal const int DBKIND_PROPID = 5;
        internal const int DBKIND_GUID = 6;

        internal const int DBCOLUMNFLAGS_ISBOOKMARK    = 0x01;
        internal const int DBCOLUMNFLAGS_ISLONG        = 0x80;
        internal const int DBCOLUMNFLAGS_ISFIXEDLENGTH = 0x10;
        internal const int DBCOLUMNFLAGS_ISNULLABLE    = 0x20;
        internal const int DBCOLUMNFLAGS_ISROWSET      = 0x100000;
        internal const int DBCOLUMNFLAGS_ISROW         = 0x200000;
        internal const int DBCOLUMNFLAGS_ISROWSET_DBCOLUMNFLAGS_ISROW = /*DBCOLUMNFLAGS_ISROWSET*/0x100000 | /*DBCOLUMNFLAGS_ISROW*/0x200000;
        internal const int DBCOLUMNFLAGS_ISLONG_DBCOLUMNFLAGS_ISSTREAM = /*DBCOLUMNFLAGS_ISLONG*/0x80 | /*DBCOLUMNFLAGS_ISSTREAM*/0x80000;
        internal const int DBCOLUMNFLAGS_ISROWID_DBCOLUMNFLAGS_ISROWVER = /*DBCOLUMNFLAGS_ISROWID*/0x100 | /*DBCOLUMNFLAGS_ISROWVER*/0x200;
        internal const int DBCOLUMNFLAGS_WRITE_DBCOLUMNFLAGS_WRITEUNKNOWN  = /*DBCOLUMNFLAGS_WRITE*/0x4 | /*DBCOLUMNFLAGS_WRITEUNKNOWN*/0x8;
        internal const int DBCOLUMNFLAGS_ISNULLABLE_DBCOLUMNFLAGS_MAYBENULL = /*DBCOLUMNFLAGS_ISNULLABLE*/0x20 | /*DBCOLUMNFLAGS_MAYBENULL*/0x40;

        // accessor constants
        internal const int DBACCESSOR_ROWDATA = 0x2;
        internal const int DBACCESSOR_PARAMETERDATA = 0x4;

        // commandbuilder constants
        internal const int DBPARAMTYPE_INPUT = 0x01;
        internal const int DBPARAMTYPE_INPUTOUTPUT = 0x02;
        internal const int DBPARAMTYPE_OUTPUT = 0x03;
        internal const int DBPARAMTYPE_RETURNVALUE = 0x04;

        // parameter constants
        /*internal const int DBPARAMIO_NOTPARAM = 0;
        internal const int DBPARAMIO_INPUT = 0x1;
        internal const int DBPARAMIO_OUTPUT = 0x2;*/

        /*internal const int DBPARAMFLAGS_ISINPUT = 0x1;
        internal const int DBPARAMFLAGS_ISOUTPUT = 0x2;
        internal const int DBPARAMFLAGS_ISSIGNED = 0x10;
        internal const int DBPARAMFLAGS_ISNULLABLE = 0x40;
        internal const int DBPARAMFLAGS_ISLONG = 0x80;*/

        internal const int ParameterDirectionFlag = 3;

        // values of the searchable column in the provider types schema rowset
        internal const uint DB_UNSEARCHABLE = 1;
        internal const uint DB_LIKE_ONLY = 2;
        internal const uint DB_ALL_EXCEPT_LIKE = 3;
        internal const uint DB_SEARCHABLE = 4;

        static internal readonly IntPtr DB_INVALID_HACCESSOR = ADP.PtrZero;
        static internal readonly IntPtr DB_NULL_HCHAPTER = ADP.PtrZero;
        static internal readonly IntPtr DB_NULL_HROW = ADP.PtrZero;

        /*static internal readonly int SizeOf_tagDBPARAMINFO = Marshal.SizeOf(typeof(tagDBPARAMINFO));*/
        static internal readonly int SizeOf_tagDBBINDING = Marshal.SizeOf(typeof(tagDBBINDING));
        static internal readonly int SizeOf_tagDBCOLUMNINFO = Marshal.SizeOf(typeof(tagDBCOLUMNINFO));
        static internal readonly int SizeOf_tagDBLITERALINFO = Marshal.SizeOf(typeof(tagDBLITERALINFO));
        static internal readonly int SizeOf_tagDBPROPSET = Marshal.SizeOf(typeof(tagDBPROPSET));
        static internal readonly int SizeOf_tagDBPROP = Marshal.SizeOf(typeof(tagDBPROP));
        static internal readonly int SizeOf_tagDBPROPINFOSET = Marshal.SizeOf(typeof(tagDBPROPINFOSET));
        static internal readonly int SizeOf_tagDBPROPINFO = Marshal.SizeOf(typeof(tagDBPROPINFO));
        static internal readonly int SizeOf_tagDBPROPIDSET = Marshal.SizeOf(typeof(tagDBPROPIDSET));
        static internal readonly int SizeOf_Guid = Marshal.SizeOf(typeof(Guid));
        static internal readonly int SizeOf_Variant = 8 + (2 * ADP.PtrSize); // 16 on 32bit, 24 on 64bit

        static internal readonly int OffsetOf_tagDBPROP_Status = Marshal.OffsetOf(typeof(tagDBPROP), "dwStatus").ToInt32();
        static internal readonly int OffsetOf_tagDBPROP_Value = Marshal.OffsetOf(typeof(tagDBPROP), "vValue").ToInt32();
        static internal readonly int OffsetOf_tagDBPROPSET_Properties = Marshal.OffsetOf(typeof(tagDBPROPSET), "rgProperties").ToInt32();
        static internal readonly int OffsetOf_tagDBPROPINFO_Value = Marshal.OffsetOf(typeof(tagDBPROPINFO), "vValue").ToInt32();
        static internal readonly int OffsetOf_tagDBPROPIDSET_PropertySet = Marshal.OffsetOf(typeof(tagDBPROPIDSET), "guidPropertySet").ToInt32();
        static internal readonly int OffsetOf_tagDBLITERALINFO_it = Marshal.OffsetOf(typeof(tagDBLITERALINFO), "it").ToInt32();
        static internal readonly int OffsetOf_tagDBBINDING_obValue = Marshal.OffsetOf(typeof(tagDBBINDING), "obValue").ToInt32();
        static internal readonly int OffsetOf_tagDBBINDING_wType = Marshal.OffsetOf(typeof(tagDBBINDING), "wType").ToInt32();

        static internal Guid IID_NULL               = Guid.Empty;
        static internal Guid IID_IUnknown           = new Guid(0x00000000,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
        static internal Guid IID_IDBInitialize      = new Guid(0x0C733A8B,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
        static internal Guid IID_IDBCreateSession   = new Guid(0x0C733A5D,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
        static internal Guid IID_IDBCreateCommand   = new Guid(0x0C733A1D,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
        static internal Guid IID_ICommandText       = new Guid(0x0C733A27,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
        static internal Guid IID_IMultipleResults   = new Guid(0x0C733A90,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
        static internal Guid IID_IRow               = new Guid(0x0C733AB4,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
        static internal Guid IID_IRowset            = new Guid(0x0C733A7C,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
        static internal Guid IID_ISQLErrorInfo      = new Guid(0x0C733A74,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);

        static internal Guid CLSID_DataLinks        = new Guid(0x2206CDB2,0x19C1,0x11D1,0x89,0xE0,0x00,0xC0,0x4F,0xD7,0xA8,0x29);

        static internal Guid DBGUID_DEFAULT = new Guid(0xc8b521fb,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
        static internal Guid DBGUID_ROWSET  = new Guid(0xc8b522f6,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
        static internal Guid DBGUID_ROW     = new Guid(0xc8b522f7,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);

        static internal Guid DBGUID_ROWDEFAULTSTREAM = new Guid(0x0C733AB7,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);

        static internal readonly Guid CLSID_MSDASQL  = new Guid(0xc8b522cb,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);

        static internal readonly object DBCOL_SPECIALCOL = new Guid(0xc8b52232,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);

        static internal readonly char[] ErrorTrimCharacters = new char[] { '\r', '\n', '\0' }; // MDAC 73707

        // used by ConnectionString hashtable, must be all lowercase
        internal const string Asynchronous_Processing = "asynchronous processing";
        internal const string AttachDBFileName = "attachdbfilename";
        internal const string Connect_Timeout = "connect timeout";
        internal const string Data_Source = "data source";
        internal const string File_Name = "file name";
        internal const string Initial_Catalog = "initial catalog";
        internal const string Password = "password";
        internal const string Persist_Security_Info = "persist security info";
        internal const string Provider = "provider";
        internal const string Pwd = "pwd";
        internal const string User_ID = "user id";

        // used by OleDbConnection as property names
        internal const string Current_Catalog = "current catalog";
        internal const string DBMS_Version = "dbms version";
        internal const string Properties = "Properties";

        // used by OleDbConnection to create and verify OLE DB Services
        internal const string DataLinks_CLSID = "CLSID\\{2206CDB2-19C1-11D1-89E0-00C04FD7A829}\\InprocServer32";
        internal const string OLEDB_SERVICES = "OLEDB_SERVICES";

        // used by OleDbConnection to eliminate post-open detection of 'Microsoft OLE DB Provider for ODBC Drivers'
        internal const string DefaultDescription_MSDASQL = "microsoft ole db provider for odbc drivers";
        internal const string MSDASQL = "msdasql";
        internal const string MSDASQLdot = "msdasql.";

        // used by OleDbPermission
        internal const string _Add = "add";
        internal const string _Keyword = "keyword";
        internal const string _Name = "name";
        internal const string _Value = "value";

        // IColumnsRowset column names
        internal const string DBCOLUMN_BASECATALOGNAME = "DBCOLUMN_BASECATALOGNAME";
        internal const string DBCOLUMN_BASECOLUMNNAME  = "DBCOLUMN_BASECOLUMNNAME";
        internal const string DBCOLUMN_BASESCHEMANAME  = "DBCOLUMN_BASESCHEMANAME";
        internal const string DBCOLUMN_BASETABLENAME   = "DBCOLUMN_BASETABLENAME";
        internal const string DBCOLUMN_COLUMNSIZE      = "DBCOLUMN_COLUMNSIZE";
        internal const string DBCOLUMN_FLAGS           = "DBCOLUMN_FLAGS";
        internal const string DBCOLUMN_GUID            = "DBCOLUMN_GUID";
        internal const string DBCOLUMN_IDNAME          = "DBCOLUMN_IDNAME";
        internal const string DBCOLUMN_ISAUTOINCREMENT = "DBCOLUMN_ISAUTOINCREMENT";
        internal const string DBCOLUMN_ISUNIQUE        = "DBCOLUMN_ISUNIQUE";
        internal const string DBCOLUMN_KEYCOLUMN       = "DBCOLUMN_KEYCOLUMN";
        internal const string DBCOLUMN_NAME            = "DBCOLUMN_NAME";
        internal const string DBCOLUMN_NUMBER          = "DBCOLUMN_NUMBER";
        internal const string DBCOLUMN_PRECISION       = "DBCOLUMN_PRECISION";
        internal const string DBCOLUMN_PROPID          = "DBCOLUMN_PROPID";
        internal const string DBCOLUMN_SCALE           = "DBCOLUMN_SCALE";
        internal const string DBCOLUMN_TYPE            = "DBCOLUMN_TYPE";
        internal const string DBCOLUMN_TYPEINFO        = "DBCOLUMN_TYPEINFO";

        // ISchemaRowset.GetRowset(OleDbSchemaGuid.Indexes) column names
        internal const string PRIMARY_KEY  = "PRIMARY_KEY";
        internal const string UNIQUE       = "UNIQUE";
        internal const string COLUMN_NAME  = "COLUMN_NAME";
        internal const string NULLS        = "NULLS";
        internal const string INDEX_NAME   = "INDEX_NAME";

        // ISchemaRowset.GetSchemaRowset(OleDbSchemaGuid.Procedure_Parameters) column names
        internal const string PARAMETER_NAME           = "PARAMETER_NAME";
        internal const string ORDINAL_POSITION         = "ORDINAL_POSITION";
        internal const string PARAMETER_TYPE           = "PARAMETER_TYPE";
        internal const string IS_NULLABLE              = "IS_NULLABLE";
        internal const string DATA_TYPE                = "DATA_TYPE";
        internal const string CHARACTER_MAXIMUM_LENGTH = "CHARACTER_MAXIMUM_LENGTH";
        internal const string NUMERIC_PRECISION        = "NUMERIC_PRECISION";
        internal const string NUMERIC_SCALE            = "NUMERIC_SCALE";
        internal const string TYPE_NAME                = "TYPE_NAME";

        // DataTable.Select to sort on ordinal position for OleDbSchemaGuid.Procedure_Parameters
        internal const string ORDINAL_POSITION_ASC     = "ORDINAL_POSITION ASC";

        // OleDbConnection.GetOleDbSchemmaTable(OleDbSchemaGuid.SchemaGuids) table and column names
        internal const string SchemaGuids = "SchemaGuids";
        internal const string Schema = "Schema";
        internal const string RestrictionSupport = "RestrictionSupport";

        // OleDbConnection.GetOleDbSchemmaTable(OleDbSchemaGuid.DbInfoKeywords) table and column names
        internal const string DbInfoKeywords = "DbInfoKeywords";
        internal const string Keyword = "Keyword";

        // Debug error string writeline
        static internal string ELookup(OleDbHResult hr) {
            StringBuilder builder = new StringBuilder();
            builder.Append(hr.ToString());
            if ((0 < builder.Length) && Char.IsDigit(builder[0])) {
                builder.Length = 0;
            }
            builder.Append("(0x");
            builder.Append(((int)hr).ToString("X8", CultureInfo.InvariantCulture));
            builder.Append(")");
            return builder.ToString();
        }       

#if DEBUG
        static readonly private Hashtable g_wlookpup = new Hashtable();
        static internal string WLookup(short id) {
            string value = (string)g_wlookpup[id];
            if (null == value) {
                value = "0x" + ((short) id).ToString("X2", CultureInfo.InvariantCulture) + " " + ((short) id);
                value += " " + ((DBTypeEnum) id).ToString();
                g_wlookpup[id] = value;
            }
            return value;
        }

        private enum DBTypeEnum {
            EMPTY       = 0,       //
            NULL        = 1,       //
            I2          = 2,       //
            I4          = 3,       //
            R4          = 4,       //
            R8          = 5,       //
            CY          = 6,       //
            DATE        = 7,       //
            BSTR        = 8,       //
            IDISPATCH   = 9,       //
            ERROR       = 10,      //
            BOOL        = 11,      //
            VARIANT     = 12,      //
            IUNKNOWN    = 13,      //
            DECIMAL     = 14,      //
            I1          = 16,      //
            UI1         = 17,      //
            UI2         = 18,      //
            UI4         = 19,      //
            I8          = 20,      //
            UI8         = 21,      //
            FILETIME    = 64,      // 2.0
            GUID        = 72,      //
            BYTES       = 128,     //
            STR         = 129,     //
            WSTR        = 130,     //
            NUMERIC     = 131,     // with potential overflow
            UDT         = 132,     // should never be encountered
            DBDATE      = 133,     //
            DBTIME      = 134,     //
            DBTIMESTAMP = 135,     // granularity reduced from 1ns to 100ns (sql is 3.33 milli seconds)
            HCHAPTER    = 136,     // 1.5
            PROPVARIANT = 138,     // 2.0 - as variant
            VARNUMERIC  = 139,     // 2.0 - as string else ConversionException

            BYREF_I2          = 0x4002,
            BYREF_I4          = 0x4003,
            BYREF_R4          = 0x4004,
            BYREF_R8          = 0x4005,
            BYREF_CY          = 0x4006,
            BYREF_DATE        = 0x4007,
            BYREF_BSTR        = 0x4008,
            BYREF_IDISPATCH   = 0x4009,
            BYREF_ERROR       = 0x400a,
            BYREF_BOOL        = 0x400b,
            BYREF_VARIANT     = 0x400c,
            BYREF_IUNKNOWN    = 0x400d,
            BYREF_DECIMAL     = 0x400e,
            BYREF_I1          = 0x4010,
            BYREF_UI1         = 0x4011,
            BYREF_UI2         = 0x4012,
            BYREF_UI4         = 0x4013,
            BYREF_I8          = 0x4014,
            BYREF_UI8         = 0x4015,
            BYREF_FILETIME    = 0x4040,
            BYREF_GUID        = 0x4048,
            BYREF_BYTES       = 0x4080,
            BYREF_STR         = 0x4081,
            BYREF_WSTR        = 0x4082,
            BYREF_NUMERIC     = 0x4083,
            BYREF_UDT         = 0x4084,
            BYREF_DBDATE      = 0x4085,
            BYREF_DBTIME      = 0x4086,
            BYREF_DBTIMESTAMP = 0x4087,
            BYREF_HCHAPTER    = 0x4088,
            BYREF_PROPVARIANT = 0x408a,
            BYREF_VARNUMERIC  = 0x408b,

            VECTOR      = 0x1000,
            ARRAY       = 0x2000,
            BYREF       = 0x4000,  //
            RESERVED    = 0x8000,  // SystemException
        }
#endif
    }
}