/
OleDbError.cs
110 lines (96 loc) · 3.29 KB
/
OleDbError.cs
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
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Data.Common;
using System.Runtime.InteropServices;
namespace System.Data.OleDb
{
public sealed class OleDbError
{
private readonly string? message;
private readonly string? source;
private readonly string? sqlState;
private readonly int nativeError;
internal OleDbError(UnsafeNativeMethods.IErrorRecords errorRecords, int index)
{
OleDbHResult hr;
int lcid = System.Globalization.CultureInfo.CurrentCulture.LCID;
UnsafeNativeMethods.IErrorInfo errorInfo = errorRecords.GetErrorInfo(index, lcid);
if (null != errorInfo)
{
hr = errorInfo.GetDescription(out this.message);
if (OleDbHResult.DB_E_NOLOCALE == hr)
{
Marshal.ReleaseComObject(errorInfo);
lcid = Interop.Kernel32.GetUserDefaultLCID();
errorInfo = errorRecords.GetErrorInfo(index, lcid);
if (null != errorInfo)
{
hr = errorInfo.GetDescription(out this.message);
}
}
if ((hr < 0) && ADP.IsEmpty(this.message))
{
this.message = ODB.FailedGetDescription(hr);
}
if (null != errorInfo)
{
hr = errorInfo.GetSource(out this.source);
if (OleDbHResult.DB_E_NOLOCALE == hr)
{
Marshal.ReleaseComObject(errorInfo);
lcid = Interop.Kernel32.GetUserDefaultLCID();
errorInfo = errorRecords.GetErrorInfo(index, lcid);
if (null != errorInfo)
{
hr = errorInfo.GetSource(out this.source);
}
}
if ((hr < 0) && ADP.IsEmpty(this.source))
{
this.source = ODB.FailedGetSource(hr);
}
Marshal.ReleaseComObject(errorInfo!);
}
}
UnsafeNativeMethods.ISQLErrorInfo sqlErrorInfo;
errorRecords.GetCustomErrorObject(index, ref ODB.IID_ISQLErrorInfo, out sqlErrorInfo);
if (null != sqlErrorInfo)
{
this.nativeError = sqlErrorInfo.GetSQLInfo(out this.sqlState);
Marshal.ReleaseComObject(sqlErrorInfo);
}
}
public string Message
{
get
{
return this.message ?? string.Empty;
}
}
public int NativeError
{
get
{
return this.nativeError;
}
}
public string Source
{
get
{
return this.source ?? string.Empty;
}
}
public string SQLState
{
get
{
return this.sqlState ?? string.Empty;
}
}
public override string ToString()
{
return Message;
}
}
}