// // 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); } }