a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
511 lines
14 KiB
C#
511 lines
14 KiB
C#
//
|
|
// System.Data.Odbc.libodbc
|
|
//
|
|
// Authors:
|
|
// Brian Ritchie (brianlritchie@hotmail.com)
|
|
// Sureshkumar T (tsureshkumar@novell.com)
|
|
//
|
|
// Copyright (C) Brian Ritchie, 2002
|
|
//
|
|
// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
// permit persons to whom the Software is furnished to do so, subject to
|
|
// the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
//
|
|
|
|
using System.Data;
|
|
using System.Data.Common;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace System.Data.Odbc
|
|
{
|
|
internal enum OdbcHandleType : short
|
|
{
|
|
Env = 1,
|
|
Dbc = 2,
|
|
Stmt = 3,
|
|
Desc = 4
|
|
}
|
|
|
|
internal enum OdbcReturn : short
|
|
{
|
|
Error = -1,
|
|
InvalidHandle = -2,
|
|
StillExecuting = 2,
|
|
NeedData = 99,
|
|
Success = 0,
|
|
SuccessWithInfo = 1,
|
|
NoData = 100
|
|
}
|
|
|
|
internal enum OdbcEnv : ushort
|
|
{
|
|
OdbcVersion = 200,
|
|
ConnectionPooling = 201,
|
|
CPMatch = 202
|
|
}
|
|
|
|
internal enum OdbcConnectionAttribute : int
|
|
{
|
|
AutoCommit = 102,
|
|
TransactionIsolation = 108,
|
|
CurrentCatalog = 109,
|
|
#if NET_2_0
|
|
CoptTransactionIsolation = 1227 /* SQL_COPT_SS_TXN_ISOLATION */
|
|
#endif
|
|
}
|
|
|
|
internal enum OdbcInfo : ushort
|
|
{
|
|
DataSourceName = 2,
|
|
DriverName = 6,
|
|
DriverVersion = 7,
|
|
DatabaseName = 16,
|
|
DbmsVersion = 18,
|
|
IdentifierQuoteChar = 29
|
|
}
|
|
|
|
internal enum OdbcInputOutputDirection : short
|
|
{
|
|
Input = 1,
|
|
InputOutput = 2,
|
|
ResultCol = 3,
|
|
Output = 4,
|
|
ReturnValue = 5
|
|
}
|
|
|
|
internal enum OdbcIsolationLevel
|
|
{
|
|
ReadUncommitted = 1,
|
|
ReadCommitted = 2,
|
|
RepeatableRead = 4,
|
|
Serializable = 8,
|
|
Snapshot = 32 /* SQL_TXN_SS_SNAPSHOT */
|
|
}
|
|
|
|
internal enum OdbcLengthIndicator : short
|
|
{
|
|
NoTotal = -4,
|
|
NullData = -1
|
|
}
|
|
|
|
// Keep this sorted.
|
|
internal enum FieldIdentifier : short
|
|
{
|
|
AutoUniqueValue = 11, /* SQL_DESC_AUTO_UNIQUE_VALUE */
|
|
BaseColumnName = 22, /* SQL_DESC_BASE_COLUMN_NAME */
|
|
BaseTableName = 23, /* SQL_DESC_BASE_TABLE_NAME */
|
|
CaseSensitive = 12, /* SQL_DESC_CASE_SENSITIVE */
|
|
CatelogName = 17, /* SQL_DESC_CATALOG_NAME */
|
|
ConsiseType = 2, /* SQL_DESC_CONCISE_TYPE */
|
|
Count = 1001, /* SQL_DESC_COUNT */
|
|
DisplaySize = 6, /* SQL_DESC_DISPLAY_SIZE */
|
|
FixedPrecScale = 9, /* SQL_DESC_FIXED_PREC_SCALE */
|
|
Label = 18, /* SQL_DESC_LABEL */
|
|
Length = 1003, /* SQL_DESC_LENGTH */
|
|
LiteralPrefix = 27, /* SQL_DESC_LITERAL_PREFIX */
|
|
LiteralSuffix = 28, /* SQL_DESC_LITERAL_SUFFIX */
|
|
LocalTypeName = 29, /* SQL_DESC_LOCAL_TYPE_NAME */
|
|
Name = 1011, /* SQL_DESC_NAME */
|
|
Nullable = 1008, /* SQL_DESC_NULLABLE */
|
|
NumPrecRadix = 32, /* SQL_DESC_NUM_PREC_RADIX */
|
|
OctetLength = 1013, /* SQL_DESC_OCTET_LENGTH */
|
|
Precision = 1005, /* SQL_DESC_PRECISION */
|
|
Scale = 1006, /* SQL_DESC_SCALE */
|
|
SchemaName = 16, /* SQL_DESC_SCHEMA_NAME */
|
|
Searchable = 13, /* SQL_DESC_SEARCHABLE */
|
|
TableName = 15, /* SQL_DESC_TABLE_NAME */
|
|
Type = 1002, /* SQL_DESC_TYPE */
|
|
TypeName = 14, /* SQL_DESC_TYPE_NAME */
|
|
Unnamed = 1012, /* SQL_DESC_UNNAMED */
|
|
Unsigned = 8, /* SQL_DESC_UNSIGNED */
|
|
Updatable = 10 /* SQL_DESC_UPDATABLE */
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal struct OdbcTimestamp
|
|
{
|
|
internal short year;
|
|
internal ushort month;
|
|
internal ushort day;
|
|
internal ushort hour;
|
|
internal ushort minute;
|
|
internal ushort second;
|
|
internal ulong fraction;
|
|
}
|
|
|
|
internal class libodbc
|
|
{
|
|
#region global constants
|
|
internal const int SQL_OV_ODBC2 = 2;
|
|
internal const int SQL_OV_ODBC3 = 3;
|
|
|
|
internal const string SQLSTATE_RIGHT_TRUNC = "01004";
|
|
internal const char C_NULL = '\0';
|
|
internal const int SQL_NTS = -3;
|
|
|
|
internal const short SQL_TRUE = 1;
|
|
internal const short SQL_FALSE = 0;
|
|
|
|
// SQLStatistics
|
|
internal const short SQL_INDEX_UNIQUE = 0;
|
|
internal const short SQL_INDEX_ALL = 1;
|
|
internal const short SQL_QUICK = 0;
|
|
internal const short SQL_ENSURE = 1;
|
|
|
|
// SQLColumnAttribute
|
|
internal const short SQL_NO_NULLS = 0;
|
|
internal const short SQL_NULLABLE = 1;
|
|
internal const short SQL_NULLABLE_UNKNOWN = 2;
|
|
internal const short SQL_ATTR_READONLY = 0;
|
|
internal const short SQL_ATTR_WRITE = 1;
|
|
internal const short SQL_ATTR_READWRITE_UNKNOWN = 2;
|
|
#endregion
|
|
|
|
internal static OdbcInputOutputDirection ConvertParameterDirection(
|
|
ParameterDirection dir)
|
|
{
|
|
switch (dir) {
|
|
case ParameterDirection.Input:
|
|
return OdbcInputOutputDirection.Input;
|
|
case ParameterDirection.InputOutput:
|
|
return OdbcInputOutputDirection.InputOutput;
|
|
case ParameterDirection.Output:
|
|
return OdbcInputOutputDirection.Output;
|
|
case ParameterDirection.ReturnValue:
|
|
return OdbcInputOutputDirection.ReturnValue;
|
|
default:
|
|
return OdbcInputOutputDirection.Input;
|
|
}
|
|
}
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLAllocHandle (
|
|
OdbcHandleType HandleType,
|
|
IntPtr InputHandle,
|
|
ref IntPtr OutputHandlePtr);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLSetEnvAttr (
|
|
IntPtr EnvHandle,
|
|
OdbcEnv Attribute,
|
|
IntPtr Value,
|
|
int StringLength);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLConnect (
|
|
IntPtr ConnectionHandle,
|
|
string ServerName,
|
|
short NameLength1,
|
|
string UserName,
|
|
short NameLength2,
|
|
string Authentication,
|
|
short NameLength3);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLDriverConnect (
|
|
IntPtr ConnectionHandle,
|
|
IntPtr WindowHandle,
|
|
string InConnectionString,
|
|
short StringLength1,
|
|
string OutConnectionString,
|
|
short BufferLength,
|
|
ref short StringLength2Ptr,
|
|
ushort DriverCompletion);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLExecDirect (
|
|
IntPtr StatementHandle,
|
|
string StatementText,
|
|
int TextLength);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLRowCount (
|
|
IntPtr StatementHandle,
|
|
ref int RowCount);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLNumResultCols (
|
|
IntPtr StatementHandle,
|
|
ref short ColumnCount);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLFetch (
|
|
IntPtr StatementHandle);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetData (
|
|
IntPtr StatementHandle,
|
|
ushort ColumnNumber,
|
|
SQL_C_TYPE TargetType,
|
|
ref bool TargetPtr,
|
|
int BufferLen,
|
|
ref int Len);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetData (
|
|
IntPtr StatementHandle,
|
|
ushort ColumnNumber,
|
|
SQL_C_TYPE TargetType,
|
|
ref double TargetPtr,
|
|
int BufferLen,
|
|
ref int Len);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetData (
|
|
IntPtr StatementHandle,
|
|
ushort ColumnNumber,
|
|
SQL_C_TYPE TargetType,
|
|
ref long TargetPtr,
|
|
int BufferLen,
|
|
ref int Len);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetData (
|
|
IntPtr StatementHandle,
|
|
ushort ColumnNumber,
|
|
SQL_C_TYPE TargetType,
|
|
ref short TargetPtr,
|
|
int BufferLen,
|
|
ref int Len);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetData (
|
|
IntPtr StatementHandle,
|
|
ushort ColumnNumber,
|
|
SQL_C_TYPE TargetType,
|
|
ref float TargetPtr,
|
|
int BufferLen,
|
|
ref int Len);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetData (
|
|
IntPtr StatementHandle,
|
|
ushort ColumnNumber,
|
|
SQL_C_TYPE TargetType,
|
|
ref OdbcTimestamp TargetPtr,
|
|
int BufferLen,
|
|
ref int Len);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetData (
|
|
IntPtr StatementHandle,
|
|
ushort ColumnNumber,
|
|
SQL_C_TYPE TargetType,
|
|
ref int TargetPtr,
|
|
int BufferLen,
|
|
ref int Len);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetData (
|
|
IntPtr StatementHandle,
|
|
ushort ColumnNumber,
|
|
SQL_C_TYPE TargetType,
|
|
byte[] TargetPtr,
|
|
int BufferLen,
|
|
ref int Len);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLDescribeCol (
|
|
IntPtr StatementHandle,
|
|
ushort ColumnNumber,
|
|
byte[] ColumnName,
|
|
short BufferLength,
|
|
ref short NameLength,
|
|
ref short DataType,
|
|
ref uint ColumnSize,
|
|
ref short DecimalDigits,
|
|
ref short Nullable);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLFreeHandle (
|
|
ushort HandleType,
|
|
IntPtr SqlHandle);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLDisconnect (
|
|
IntPtr ConnectionHandle);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLPrepare (
|
|
IntPtr StatementHandle,
|
|
string Statement,
|
|
int TextLength);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLExecute (
|
|
IntPtr StatementHandle);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetConnectAttr (
|
|
IntPtr ConnectionHandle,
|
|
OdbcConnectionAttribute Attribute,
|
|
out int value,
|
|
int BufferLength,
|
|
out int StringLength);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLSetConnectAttr (
|
|
IntPtr ConnectionHandle,
|
|
OdbcConnectionAttribute Attribute,
|
|
IntPtr Value,
|
|
int Length);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLEndTran (
|
|
int HandleType,
|
|
IntPtr Handle,
|
|
short CompletionType);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLBindParameter (
|
|
IntPtr StatementHandle,
|
|
ushort ParamNum,
|
|
short InputOutputType,
|
|
SQL_C_TYPE ValueType,
|
|
SQL_TYPE ParamType,
|
|
uint ColSize,
|
|
short DecimalDigits,
|
|
IntPtr ParamValue,
|
|
int BufLen,
|
|
IntPtr StrLen);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLCancel (
|
|
IntPtr StatementHandle);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLCloseCursor (
|
|
IntPtr StatementHandle);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLError (
|
|
IntPtr EnvironmentHandle,
|
|
IntPtr ConnectionHandle,
|
|
IntPtr StatementHandle,
|
|
byte[] Sqlstate,
|
|
ref int NativeError,
|
|
byte[] MessageText,
|
|
short BufferLength,
|
|
ref short TextLength);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetStmtAttr (
|
|
IntPtr StatementHandle,
|
|
int Attribute,
|
|
ref IntPtr Value,
|
|
int BufLen,
|
|
int StrLen);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLSetDescField (
|
|
IntPtr DescriptorHandle,
|
|
short RecNumber,
|
|
short FieldIdentifier,
|
|
byte[] Value,
|
|
int BufLen);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetDiagRec (
|
|
OdbcHandleType HandleType,
|
|
IntPtr Handle,
|
|
ushort RecordNumber,
|
|
byte [] Sqlstate,
|
|
ref int NativeError,
|
|
byte [] MessageText,
|
|
short BufferLength,
|
|
ref short TextLength);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLMoreResults (
|
|
IntPtr Handle);
|
|
|
|
internal enum SQLFreeStmtOptions : short
|
|
{
|
|
Close = 0,
|
|
Drop,
|
|
Unbind,
|
|
ResetParams
|
|
}
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLFreeStmt (
|
|
IntPtr Handle,
|
|
SQLFreeStmtOptions option);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLGetInfo (
|
|
IntPtr connHandle,
|
|
OdbcInfo info,
|
|
byte [] buffer,
|
|
short buffLength,
|
|
ref short remainingStrLen);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLColAttribute (
|
|
IntPtr StmtHandle,
|
|
short column,
|
|
FieldIdentifier fieldId,
|
|
byte [] charAttributePtr,
|
|
short bufferLength,
|
|
ref short strLengthPtr,
|
|
ref int numericAttributePtr);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLPrimaryKeys (
|
|
IntPtr StmtHandle,
|
|
string catalog,
|
|
short catalogLength,
|
|
string schema,
|
|
short schemaLength,
|
|
string tableName,
|
|
short tableLength);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLStatistics (
|
|
IntPtr StmtHandle,
|
|
string catalog,
|
|
short catalogLength,
|
|
string schema,
|
|
short schemaLength,
|
|
string tableName,
|
|
short tableLength,
|
|
short unique,
|
|
short Reserved);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLBindCol (
|
|
IntPtr StmtHandle,
|
|
short column,
|
|
SQL_C_TYPE targetType,
|
|
byte [] buffer,
|
|
int bufferLength,
|
|
ref int indicator);
|
|
|
|
[DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern OdbcReturn SQLBindCol (
|
|
IntPtr StmtHandle,
|
|
short column,
|
|
SQL_C_TYPE targetType,
|
|
ref short value,
|
|
int bufferLength,
|
|
ref int indicator);
|
|
}
|
|
}
|