*** empty log message ***
authorVictor Vatamanescu <victor@mono-cvs.ximian.com>
Thu, 17 Jun 2004 10:14:35 +0000 (10:14 -0000)
committerVictor Vatamanescu <victor@mono-cvs.ximian.com>
Thu, 17 Jun 2004 10:14:35 +0000 (10:14 -0000)
svn path=/trunk/mcs/; revision=29756

13 files changed:
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2CLIWrapper.cs
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2Command.cs
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2CommandBuilder.cs [new file with mode: 0755]
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2Connection.cs
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2ConnectionPool.cs
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2ConnectionSettings.cs
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2Constants.cs
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2DataAdapter.cs [new file with mode: 0755]
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2DataReader.cs
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2InfoMessageEventHandler.cs [new file with mode: 0755]
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2OpenConnection.cs
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2Parameter.cs
mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2Type.cs

index ef823991b6990e818af8bf1bed00799c565e5636..740846f835bfd2454c671e1432cea81333a2ae71 100755 (executable)
@@ -9,6 +9,134 @@ namespace IBM.Data.DB2
        /// DB2Prototypes class is a wrapper for the DB2.lib, IBM's Call Level Interface to DB2
        /// </summary>
        /// 
+       #region comented
+       /*internal class DB2CLIWrapper
+       {
+               
+               #if (OS_LINUX)
+                       private const string libname = "db2_36";
+               #endif
+               
+               #if (OS_WINDOWS)
+                       private const string libname = "db2cli";
+               #endif
+               
+               [DllImport("db2cli", EntryPoint = "SQLAllocHandle")]
+                       internal static extern short SQLAllocHandle(short handleType, IntPtr inputHandle,  ref IntPtr outputHandle);
+
+               [DllImport("db2cli", EntryPoint = "SQLFreeHandle")]
+               internal static extern short SQLFreeHandle(short handleType, IntPtr inputHandle);
+
+               [DllImport("db2cli", EntryPoint = "SQLGetConnectAttrW")]
+               internal static extern short SQLGetConnectAttr(IntPtr ConnectionHandle, int Attribute, [Out] IntPtr ValuePtr, int BufferLength, out int StringLengthPtr);
+
+               [DllImport("db2cli", EntryPoint = "SQLGetConnectAttrW")]
+               internal static extern short SQLGetConnectAttr(IntPtr ConnectionHandle, int Attribute, out int Value, int BufferLength, IntPtr Zero);
+
+               [DllImport("db2cli", EntryPoint = "SQLFreeStmt")]
+               internal static extern short SQLFreeStmt(IntPtr StatementHandle, short option);
+
+               [DllImport("db2cli", EntryPoint = "SQLConnect")]
+                       internal static extern short SQLConnect(IntPtr sqlHdbc, string serverName, short serverNameLength, string userName, short userNameLength, string authentication, short authenticationLength);
+               [DllImport("db2cli", EntryPoint = "SQLColAttribute")]
+                       internal static extern short SQLColAttribute(IntPtr StatementHandle, short ColumnNumber, short FieldIdentifier, IntPtr CharacterAttribute, short BufferLength,  ref short StringLength,  ref int NumericAttribute);
+               //[DllImport("db2cli", EntryPoint = "SQLGetData")]
+               //      internal static extern short SQLGetData(IntPtr StatementHandle, short ColumnNumber, short TargetType, IntPtr TargetPtr, IntPtr BufferLength, ref IntPtr StrLen_or_Ind);
+               [DllImport("db2cli", EntryPoint="SQLMoreResults")]
+                       internal static extern short SQLMoreResults(IntPtr StatementHandle);
+
+               //[DllImport("db2cli", EntryPoint = "SQLGetData")]
+               //internal static extern short SQLGetData(IntPtr StatementHandle, short ColumnNumber, short TargetType, IntPtr TargetPtr, IntPtr BufferLength, out int StrLen_or_Ind);
+               [DllImport("db2cli", EntryPoint = "SQLGetData")]
+               internal static extern short SQLGetData(IntPtr StatementHandle, short ColumnNumber, short TargetType, IntPtr TargetPtr, int BufferLength, out int StrLen_or_Ind);
+               
+                       
+               //[DllImport("db2cli", EntryPoint = "SQLGetData")]
+               //internal static extern short SQLGetData(IntPtr StatementHandle, short ColumnNumber, short TargetType, byte[] TargetPtr, IntPtr BufferLength, ref IntPtr StrLen_or_Ind);
+               
+               [DllImport("db2cli", EntryPoint = "SQLGetData")]
+               internal static extern short SQLGetData(IntPtr StatementHandle, short ColumnNumber, short TargetType, byte[] TargetPtr, int BufferLength, out int StrLen_or_Ind);
+
+               [DllImport("db2cli", EntryPoint = "SQLGetData")]
+               internal static extern short SQLGetData(IntPtr StatementHandle, short ColumnNumber, short TargetType, [Out] StringBuilder sb, int BufferLength, out int StrLen_or_Ind);
+
+               [DllImport("db2cli", EntryPoint = "SQLColAttributeW")]
+               internal static extern short SQLColAttribute(IntPtr StatementHandle, short ColumnNumber, short FieldIdentifier, [Out] StringBuilder CharacterAttribute, short BufferLength,  out short StringLength, out int NumericAttribute);
+       
+               [DllImport("db2cli", CharSet = CharSet.Auto, EntryPoint = "SQLDisconnect")]
+                       internal static extern short SQLDisconnect(IntPtr sqlHdbc);
+               [DllImport("db2cli", EntryPoint = "SQLGetDiagRec")]
+                       internal static extern short SQLGetDiagRec( short handleType, IntPtr handle, short recNum, [Out] StringBuilder sqlState, ref IntPtr nativeErrorPtr, [Out] StringBuilder errorMessage, short bufferLength, ref IntPtr shortTextLengthPtr);
+               [DllImport("db2cli", EntryPoint = "SQLSetConnectAttr")]
+                       internal static extern short SQLSetConnectAttr(IntPtr sqlHdbc, long sqlAttr, [In] IntPtr sqlValuePtr, long sqlValueLength);
+               [DllImport("db2cli", EntryPoint = "SQLSetStmtAttr")]
+                       internal static extern short SQLSetStmtAttr(IntPtr sqlHstmt, long sqlAttr, [In] IntPtr sqlValuePtr, long sqlValueLength);
+               [DllImport("db2cli", EntryPoint = "SQLEndTran")]
+                       internal static extern short SQLEndTran (short handleType, IntPtr handle, short fType);
+               [DllImport("db2cli", EntryPoint = "SQLCancel")]
+                       internal static extern short SQLCancel(IntPtr handle);
+               [DllImport("db2cli", EntryPoint = "SQLNumResultCols")]
+                       internal static extern short SQLNumResultCols(IntPtr handle, ref int numCols);
+               [DllImport("db2cli", EntryPoint = "SQLFetch")]
+                       internal static extern short SQLFetch(IntPtr handle);
+               [DllImport("db2cli", EntryPoint = "SQLRowCount")]
+                       internal static extern short SQLRowCount(IntPtr stmtHandle, ref int numRows);
+               [DllImport("db2cli", EntryPoint = "SQLExecute")]
+                       internal static extern short SQLExecute(IntPtr handle);
+               [DllImport ("db2cli", EntryPoint = "SQLExecDirect")]
+                       internal static extern short SQLExecDirect(IntPtr stmtHandle, string stmt, int length);
+               [DllImport("db2cli", EntryPoint = "SQLDescribeCol")]
+                       internal static extern short SQLDescribeCol(IntPtr stmtHandle, ushort colNum, StringBuilder colName, short colNameMaxLength, IntPtr colNameLength, ref IntPtr dataType, ref IntPtr colSizePtr, ref IntPtr scalePtr, ref IntPtr nullablePtr );
+               [DllImport("db2cli", EntryPoint = "SQLBindCol")]
+                       internal static extern short SQLBindCol(IntPtr StatementHandle, short ColumnNumber, short TargetType, IntPtr TargetValue, IntPtr BufferLength, ref IntPtr StrLen_or_Ind); 
+               [DllImport("db2cli", EntryPoint = "SQLDriverConnect")]
+                       internal static extern short SQLDriverConnect(IntPtr hdbc, int centered, [In] string inConnectStr, [In] int inStrLength, [Out] StringBuilder outConnectStr, [Out] int outStrCapacity, [Out] IntPtr outStrLengthReturned, [In] int completion);
+               [DllImport("db2cli", EntryPoint = "SQLPrepare")]
+                       internal static extern short SQLPrepare(IntPtr stmtHandle, string stmt, int length);
+               [DllImport("db2cli", EntryPoint = "SQLDescribeParam")]
+                       internal static extern short SQLDescribeParam(IntPtr stmtHandle, short paramNumber,ref IntPtr dataType, ref IntPtr paramSize, ref IntPtr decimalDigits, ref IntPtr nullable);
+               [DllImport("db2cli", EntryPoint = "SQLNumParams")]
+                       internal static extern short SQLNumParams(IntPtr stmtHandle, ref IntPtr numParams);
+               
+               [DllImport("db2cli")]
+                       internal static extern short SQLBindParameter(IntPtr stmtHandle, ushort paramNumber, 
+                       short dataType, short valueType, short paramType, uint colSize, short decDigits, 
+                        IntPtr dataBufferPtr, int dataBufferLength, IntPtr StrLen_or_IndPtr);
+                       
+               [DllImport("db2cli")]
+                       internal static extern short SQLBindParameter(IntPtr stmtHandle, ushort paramNumber, 
+                       short dataType, short valueType, short paramType, uint colSize, short decDigits, 
+                       byte[] dataBufferPtr, int dataBufferLength, IntPtr StrLen_or_IndPtr);
+                                               
+               [DllImport("db2cli", EntryPoint = "SQLBindParameter")]
+                       internal static extern short SQLBindParameter(IntPtr stmtHandle, ushort paramNumber, 
+                       short dataType, short valueType, short paramType, uint colSize, short decDigits,
+                       ref int dataBufferPtr, int dataBufferLength, IntPtr StrLen_or_IndPtr);
+       
+               [DllImport("db2cli", EntryPoint = "SQLBindParameter")]
+                       internal static extern short SQLBindParameter(IntPtr stmtHandle, ushort paramNumber,
+                       short dataType, short valueType, short paramType, uint colSize, short decDigits,
+                       ref double dataBufferPtr, int dataBufferLength, IntPtr StrLen_or_IndPtr);
+                               
+               [DllImport("db2cli", EntryPoint = "SQLDescribeParam")]
+                       internal static extern short SQLDescribeParam(IntPtr stmtHandle, short ParameterNumber, IntPtr DataTypePtr, IntPtr ParameterSizePtr, IntPtr DecimalDigitsPtr, IntPtr NullablePtr); 
+               
+               [DllImport("db2cli", EntryPoint = "SQLGetLength")]
+                       internal static extern short SQLGetLength( IntPtr stmtHandle, short locatorCType, int Locator,
+                       IntPtr stringLength, IntPtr indicatorValue);
+               [DllImport("db2cli", EntryPoint = "SQLGetPosition")]
+                       internal static extern short SQLGetPosition(IntPtr stmtHandle, short locatorCType, int sourceLocator, int searchLocator, 
+                       string searchLiteral, int searchLiteralLength, uint fromPosition, IntPtr locatedAt, IntPtr indicatorValue);
+               [DllImport("db2cli", EntryPoint = "SQLGetPosition")]
+                   internal static extern short SQLBindFileToCol (IntPtr stmtHandle, ushort colNum, string fileName, IntPtr fileNameLength, 
+                       IntPtr fileOptions, short maxFileNameLength, IntPtr stringLength, IntPtr indicatorValue);
+               [DllImport("db2cli", EntryPoint = "SQLGetPosition")]
+                   internal static extern short SQLBindFileToParam (IntPtr stmtHandle, ushort targetType, short dataType, string fileName,
+                       IntPtr fileNameLength, short maxFileNameLength, IntPtr indicatorValue); 
+                       
+
+       }*/
+       #endregion
 
        internal class DB2CLIWrapper
        {
@@ -16,16 +144,14 @@ namespace IBM.Data.DB2
 
                static public short Initialize(ref IntPtr pEnvHandle)
                {
-                       useLibCli = false;
-                       try
-                       {
-                               return DB2CLIWrapper.SQLAllocHandle(DB2Constants.SQL_HANDLE_ENV, IntPtr.Zero, out pEnvHandle);
+                       string OSVersion = Environment.OSVersion.ToString();
+                       useLibCli = true;
+                       if(OSVersion.Substring(0,4)=="Unix"){
+                               useLibCli = false;
                        }
-                       catch {}
-                       useLibCli = false;
-                       return DB2CLIWrapper.SQLAllocHandle(DB2Constants.SQL_HANDLE_ENV, IntPtr.Zero, out pEnvHandle);
+                       return DB2CLIWrapper.SQLAllocHandle(DB2Constants.SQL_HANDLE_ENV, IntPtr.Zero, out pEnvHandle);
                }
-    
+
                static public short SQLAllocHandle(short handleType, IntPtr inputHandle, out IntPtr outputHandle)
                {
                        if(useLibCli)
@@ -122,6 +248,15 @@ namespace IBM.Data.DB2
                                return StaticWrapperCli.SQLSetStmtAttr(sqlHdbc, sqlAttr, sqlValuePtr, sqlValueLength);
                        return StaticWrapper36.SQLSetStmtAttr(sqlHdbc, sqlAttr, sqlValuePtr, sqlValueLength);
                }
+
+               //for bulk operations
+               static public short SQLSetStmtAttr(IntPtr sqlHdbc, int sqlAttr, ushort[] sqlValuePtr, int sqlValueLength)
+               {
+                       if(useLibCli)
+                               return StaticWrapperCli.SQLSetStmtAttr(sqlHdbc, sqlAttr, sqlValuePtr, sqlValueLength);
+                       return StaticWrapper36.SQLSetStmtAttr(sqlHdbc, sqlAttr, sqlValuePtr, sqlValueLength);
+               }
+
                static public short SQLEndTran (short handleType, IntPtr handle, short fType)
                {
                        if(useLibCli)
@@ -182,6 +317,13 @@ namespace IBM.Data.DB2
                                return StaticWrapperCli.SQLBindParameter(stmtHandle, paramNumber, dataType, valueType, paramType, colSize, decDigits, dataBufferPtr, dataBufferLength, StrLen_or_IndPtr);
                        return StaticWrapper36.SQLBindParameter(stmtHandle, paramNumber, dataType, valueType, paramType, colSize, decDigits, dataBufferPtr, dataBufferLength, StrLen_or_IndPtr);
                }
+
+               static public short SQLBindParameter(IntPtr stmtHandle, short paramNumber, short dataType, short valueType, short paramType, int colSize, short decDigits, int[] dataBufferPtr, int dataBufferLength, IntPtr StrLen_or_IndPtr)
+               {
+                       if(useLibCli)
+                               return StaticWrapperCli.SQLBindParameter(stmtHandle, paramNumber, dataType, valueType, paramType, colSize, decDigits, dataBufferPtr, dataBufferLength, StrLen_or_IndPtr);
+                       return StaticWrapper36.SQLBindParameter(stmtHandle, paramNumber, dataType, valueType, paramType, colSize, decDigits, dataBufferPtr, dataBufferLength, StrLen_or_IndPtr);
+               }
                public static short SQLGetInfo(IntPtr sqlHdbc, short fInfoType, [Out] StringBuilder rgbInfoValue, short cbInfoValueMax, out short pcbInfoValue)
                {
                        if(useLibCli)
@@ -238,8 +380,14 @@ namespace IBM.Data.DB2
 
                        [DllImport(libname, EntryPoint = "SQLSetConnectAttr")]
                        public static extern short SQLSetConnectAttr(IntPtr sqlHdbc, int sqlAttr, [In] IntPtr sqlValuePtr, int sqlValueLength);
+                       
                        [DllImport(libname, EntryPoint = "SQLSetStmtAttr")]
                        public static extern short SQLSetStmtAttr(IntPtr sqlHdbc, int sqlAttr, [In] IntPtr sqlValuePtr, int sqlValueLength);
+                       
+                       //For bulk operations
+                       [DllImport(libname, EntryPoint = "SQLSetStmtAttr")]
+                       public static extern short SQLSetStmtAttr(IntPtr sqlHdbc, int sqlAttr, ushort[] sqlValuePtr, int sqlValueLength);
+
                        [DllImport(libname, EntryPoint = "SQLEndTran")]
                        public static extern short SQLEndTran (short handleType, IntPtr handle, short fType);
                        [DllImport(libname, EntryPoint = "SQLCancel")]
@@ -262,6 +410,12 @@ namespace IBM.Data.DB2
                        public static extern short SQLBindParameter(IntPtr stmtHandle, short paramNumber, 
                                short dataType, short valueType, short paramType, int colSize, short decDigits, 
                                IntPtr dataBufferPtr, int dataBufferLength, IntPtr StrLen_or_IndPtr);
+
+                       [DllImport(libname)]
+                       public static extern short SQLBindParameter(IntPtr stmtHandle, short paramNumber, 
+                               short dataType, short valueType, short paramType, int colSize, short decDigits, 
+                               int[] dataBufferPtr, int dataBufferLength, IntPtr StrLen_or_IndPtr);
+
                        [DllImport(libname, EntryPoint = "SQLGetInfoW", CharSet=CharSet.Unicode)]
                        public static extern short SQLGetInfo(IntPtr sqlHdbc, short fInfoType, [Out] StringBuilder rgbInfoValue, short cbInfoValueMax, out short pcbInfoValue);
                }
@@ -278,7 +432,7 @@ namespace IBM.Data.DB2
                        [DllImport(libname, EntryPoint = "SQLFreeStmt")]
                        public static extern short SQLFreeStmt(IntPtr StatementHandle, short option);
 
-                       [DllImport(libname, EntryPoint = "SQLConnect")]
+                       [DllImport(libname, EntryPoint = "SQLConnect", CharSet=CharSet.Ansi)]
 
                        public static extern short SQLConnect(IntPtr sqlHdbc, string serverName, short serverNameLength, string userName, short userNameLength, string authentication, short authenticationLength);
                        [DllImport(libname, EntryPoint = "SQLColAttributeW", CharSet=CharSet.Unicode)]
@@ -314,6 +468,11 @@ namespace IBM.Data.DB2
                        public static extern short SQLSetConnectAttr(IntPtr sqlHdbc, int sqlAttr, [In] IntPtr sqlValuePtr, int sqlValueLength);
                        [DllImport(libname, EntryPoint = "SQLSetStmtAttr")]
                        public static extern short SQLSetStmtAttr(IntPtr sqlHdbc, int sqlAttr, [In] IntPtr sqlValuePtr, int sqlValueLength);
+       
+                       //for bulk operations
+                       [DllImport(libname, EntryPoint = "SQLSetStmtAttr")]
+                       public static extern short SQLSetStmtAttr(IntPtr sqlHdbc, int sqlAttr, ushort[] sqlValuePtr, int sqlValueLength);
+
                        [DllImport(libname, EntryPoint = "SQLEndTran")]
                        public static extern short SQLEndTran (short handleType, IntPtr handle, short fType);
                        [DllImport(libname, EntryPoint = "SQLCancel")]
@@ -336,7 +495,13 @@ namespace IBM.Data.DB2
                        public static extern short SQLBindParameter(IntPtr stmtHandle, short paramNumber, 
                                short dataType, short valueType, short paramType, int colSize, short decDigits, 
                                IntPtr dataBufferPtr, int dataBufferLength, IntPtr StrLen_or_IndPtr);
-                       [DllImport(libname, EntryPoint = "SQLGetInfo")]
+
+                       [DllImport(libname)]
+                       public static extern short SQLBindParameter(IntPtr stmtHandle, short paramNumber, 
+                               short dataType, short valueType, short paramType, int colSize, short decDigits, 
+                               int[] dataBufferPtr, int dataBufferLength, IntPtr StrLen_or_IndPtr);
+
+                       [DllImport(libname, EntryPoint = "SQLGetInfoW", CharSet=CharSet.Unicode)]
                        public static extern short SQLGetInfo(IntPtr sqlHdbc, short fInfoType, [Out] StringBuilder rgbInfoValue, short cbInfoValueMax, out short pcbInfoValue);
 
                }
index 7d2dff40f06eb30afdb18c12d3208b18f3f2d67c..a2678f13eb55156378cba2025b6c7f2ac61116a4 100755 (executable)
@@ -10,20 +10,21 @@ namespace IBM.Data.DB2
        {
                #region Private data members
                
-               private WeakReference refDataReader;
-               private string commandText;
-               private CommandType commandType = CommandType.Text;
-               private DB2Connection db2Conn;
-               private DB2Transaction db2Trans;
-               private int commandTimeout = 30;
-               private bool prepared = false;
-               private IntPtr hwndStmt = IntPtr.Zero;  //Our statement handle
-               private DB2ParameterCollection parameters = new DB2ParameterCollection();
-               private bool disposed = false;
-               private bool statementOpen;
-               private CommandBehavior previousBehavior;
-               private UpdateRowSource updatedRowSource = UpdateRowSource.Both;
-               private IntPtr statementParametersMemory;
+               private WeakReference refDataReader;\r
+               private string commandText;\r
+               private CommandType commandType = CommandType.Text;\r
+               private DB2Connection db2Conn;\r
+               private DB2Transaction db2Trans;\r
+               private int commandTimeout = 30;\r
+               private bool prepared = false;\r
+               private bool binded = false;\r
+               private IntPtr hwndStmt = IntPtr.Zero;  //Our statement handle\r
+               private DB2ParameterCollection parameters = new DB2ParameterCollection();\r
+               private bool disposed = false;\r
+               private bool statementOpen;\r
+               private CommandBehavior previousBehavior;\r
+               private UpdateRowSource updatedRowSource = UpdateRowSource.Both;\r
+               private IntPtr statementParametersMemory;\r
                private int statementParametersMemorySize;
 
                #endregion
@@ -34,114 +35,113 @@ namespace IBM.Data.DB2
                {
                        hwndStmt = IntPtr.Zero;
                }
-               public DB2Command(string commandStr)
+               public DB2Command(string commandStr):this()
                {
                        commandText = commandStr;
-                       hwndStmt = IntPtr.Zero;
                        
                }
-               public DB2Command(string commandStr, DB2Connection con) :this()
+               public DB2Command(string commandStr, DB2Connection con) : this()
                {
                        db2Conn = con;
                        commandText = commandStr;
-                       if(con != null)
-                       {
-                               con.AddCommand(this);
+                       if(con != null)\r
+                       {\r
+                               con.AddCommand(this);\r
                        }
                }
                public DB2Command (string commandStr, DB2Connection con, DB2Transaction trans)
                {
-                       commandText = commandStr;
-                       db2Conn = con;
-                       db2Trans = trans;
-                       if(con != null)
-                       {
-                               con.AddCommand(this);
+                       commandText = commandStr;\r
+                       db2Conn = con;\r
+                       db2Trans = trans;\r
+                       if(con != null)\r
+                       {\r
+                               con.AddCommand(this);\r
                        }
                }
                #endregion
 
-               #region Dispose
-               public new void  Dispose()
-               {
-                       Dispose(true);
-                       GC.SuppressFinalize(this);
-               }
-
-               protected override void Dispose(bool disposing)
-               {
-                       if(!disposed) 
-                       {
-                               if(disposing)
-                               {
-                                       ConnectionClosed();
-                                       if(db2Conn != null)
-                                       {
-                                               db2Conn.RemoveCommand(this);
-                                               db2Conn = null;
-                                       }
-                               }
-                               if(statementParametersMemory != IntPtr.Zero)
-                               {
-                                       Marshal.FreeHGlobal(statementParametersMemory);
-                                       statementParametersMemory = IntPtr.Zero;
-                               }
-                       }
-                       base.Dispose(disposing);
-                       disposed = true;
-               }
-
-
-               ~DB2Command()
-               {
-                       Dispose(false);
-               }
-
-               internal void DataReaderClosed()
-               {
-                       CloseStatementHandle(false);
-                       if((previousBehavior & CommandBehavior.CloseConnection) != 0)
-                               Connection.Close();
-                       refDataReader = null;
-               }
-
-               private void CloseStatementHandle(bool dispose)
-               {
-                       if(hwndStmt != IntPtr.Zero)
-                       {
-                               if(statementOpen)
-                               {
-                                       short sqlRet = DB2CLIWrapper.SQLFreeStmt(hwndStmt, DB2Constants.SQL_CLOSE);
-                               }
-                               if((!prepared && statementOpen) ||
-                                       dispose)
-                               {
-                                       short sqlRet = DB2CLIWrapper.SQLFreeHandle(DB2Constants.SQL_HANDLE_STMT, hwndStmt);
-
-                                       hwndStmt = IntPtr.Zero;
-                                       prepared = false;
-                               }
-                               statementOpen = false;
-                       }
-               }
-
-               internal void ConnectionClosed()
-               {
-                       DB2DataReader reader = null;
-                       if((refDataReader != null) && refDataReader.IsAlive)
-                       {
-                               reader = (DB2DataReader)refDataReader.Target;
-                       }
-                       if((reader != null) && refDataReader.IsAlive)
-                       {
-                               reader.Dispose();
-                               refDataReader = null;
-                       }
-                       CloseStatementHandle(true);
-
-                       db2Trans = null;
-               }
-
+               #region Dispose\r
+               public new void  Dispose()\r
+               {\r
+                       Dispose(true);\r
+                       GC.SuppressFinalize(this);\r
+               }\r
+\r
+               protected override void Dispose(bool disposing)\r
+               {\r
+                       if(!disposed) \r
+                       {\r
+                               if(disposing)\r
+                               {\r
+                                       ConnectionClosed();\r
+                                       if(db2Conn != null)\r
+                                       {\r
+                                               db2Conn.RemoveCommand(this);\r
+                                               db2Conn = null;\r
+                                       }\r
+                               }\r
+                               if(statementParametersMemory != IntPtr.Zero)\r
+                               {\r
+                                       Marshal.FreeHGlobal(statementParametersMemory);\r
+                                       statementParametersMemory = IntPtr.Zero;\r
+                               }\r
+                       }\r
+                       base.Dispose(disposing);\r
+                       disposed = true;\r
+               }\r
+\r
+\r
+               ~DB2Command()\r
+               {\r
+                       Dispose(false);\r
+               }\r
+\r
+               internal void DataReaderClosed()\r
+               {\r
+                       CloseStatementHandle(false);\r
+                       if((previousBehavior & CommandBehavior.CloseConnection) != 0)\r
+                               Connection.Close();\r
+                       refDataReader = null;\r
+               }\r
+\r
+               private void CloseStatementHandle(bool dispose)\r
+               {\r
+                       if(hwndStmt != IntPtr.Zero)\r
+                       {\r
+                               if(statementOpen)\r
+                               {\r
+                                       short sqlRet = DB2CLIWrapper.SQLFreeStmt(hwndStmt, DB2Constants.SQL_CLOSE);\r
+                               }\r
+                               if((!prepared && statementOpen) ||\r
+                                       dispose)\r
+                               {\r
+                                       short sqlRet = DB2CLIWrapper.SQLFreeHandle(DB2Constants.SQL_HANDLE_STMT, hwndStmt);\r
+\r
+                                       hwndStmt = IntPtr.Zero;\r
+                                       prepared = false;\r
+                               }\r
+                               statementOpen = false;\r
+                       }\r
+               }\r
+\r
+               internal void ConnectionClosed()\r
+               {\r
+                       DB2DataReader reader = null;\r
+                       if((refDataReader != null) && refDataReader.IsAlive)\r
+                       {\r
+                               reader = (DB2DataReader)refDataReader.Target;\r
+                       }\r
+                       if((reader != null) && refDataReader.IsAlive)\r
+                       {\r
+                               reader.Dispose();\r
+                               refDataReader = null;\r
+                       }\r
+                       CloseStatementHandle(true);\r
+\r
+                       db2Trans = null;\r
+               }\r
+\r
                #endregion
 
                #region SelfDescribe property
@@ -185,18 +185,18 @@ namespace IBM.Data.DB2
                ///
                /// The Timeout property states how long we wait for results to return
                /// 
-               public int CommandTimeout
-               {
-                       get
-                       {
-                               return commandTimeout;
-                       }
-                       set 
-                       {
-                               commandTimeout = value;
-                               if(hwndStmt != IntPtr.Zero)
-                                       SetStatementTimeout();
-                       }
+               public int CommandTimeout\r
+               {\r
+                       get\r
+                       {\r
+                               return commandTimeout;\r
+                       }\r
+                       set \r
+                       {\r
+                               commandTimeout = value;\r
+                               if(hwndStmt != IntPtr.Zero)\r
+                                       SetStatementTimeout();\r
+                       }\r
                }
                #endregion
 
@@ -231,24 +231,24 @@ namespace IBM.Data.DB2
                        }
                }
 
-               public DB2Connection Connection
-               {
-                       get
-                       {
-                               return db2Conn;
-                       }
-                       set
-                       {
-                               if(db2Conn != null)
-                               {
-                                       db2Conn.RemoveCommand(this);
-                               }
-                               db2Conn = value;
-                               if(db2Conn != null)
-                               {
-                                       db2Conn.AddCommand(this);
-                               }
-                       }
+               public DB2Connection Connection\r
+               {\r
+                       get\r
+                       {\r
+                               return db2Conn;\r
+                       }\r
+                       set\r
+                       {\r
+                               if(db2Conn != null)\r
+                               {\r
+                                       db2Conn.RemoveCommand(this);\r
+                               }\r
+                               db2Conn = value;\r
+                               if(db2Conn != null)\r
+                               {\r
+                                       db2Conn.AddCommand(this);\r
+                               }\r
+                       }\r
                }
                #endregion
 
@@ -288,25 +288,25 @@ namespace IBM.Data.DB2
                        }
                }
 
-               public DB2Transaction Transaction
-               {
-                       get
-                       {
-                               return db2Trans;
-                       }
-                       set
-                       {
-                               db2Trans = value;
-                       }
+               public DB2Transaction Transaction\r
+               {\r
+                       get\r
+                       {\r
+                               return db2Trans;\r
+                       }\r
+                       set\r
+                       {\r
+                               db2Trans = value;\r
+                       }\r
                }
                #endregion
 
                #region UpdatedRowSource property
 
-               public UpdateRowSource UpdatedRowSource 
-               {
-                       get { return updatedRowSource; }
-                       set { updatedRowSource = value; }
+               public UpdateRowSource UpdatedRowSource \r
+               {\r
+                       get { return updatedRowSource; }\r
+                       set { updatedRowSource = value; }\r
                }
                #endregion
 
@@ -325,23 +325,23 @@ namespace IBM.Data.DB2
 
                #region AllocateStatement function
 
-               internal void AllocateStatement(string location)
-               {
-                       if (db2Conn.DBHandle.ToInt32() == 0) return;
-                       short sqlRet;
-                       sqlRet = DB2CLIWrapper.SQLAllocHandle(DB2Constants.SQL_HANDLE_STMT, db2Conn.DBHandle, out hwndStmt);
-                       if ((sqlRet != DB2Constants.SQL_SUCCESS) && (sqlRet != DB2Constants.SQL_SUCCESS_WITH_INFO))
-                               throw new DB2Exception(DB2Constants.SQL_HANDLE_DBC, db2Conn.DBHandle, location +": Unable to allocate statement handle.");
-
-                       parameters.HwndStmt = hwndStmt;
-
-                       SetStatementTimeout();
+               internal void AllocateStatement(string location)\r
+               {\r
+                       if (db2Conn.DBHandle.ToInt32() == 0) return;\r
+                       short sqlRet;\r
+                       sqlRet = DB2CLIWrapper.SQLAllocHandle(DB2Constants.SQL_HANDLE_STMT, db2Conn.DBHandle, out hwndStmt);\r
+                       if ((sqlRet != DB2Constants.SQL_SUCCESS) && (sqlRet != DB2Constants.SQL_SUCCESS_WITH_INFO))\r
+                               throw new DB2Exception(DB2Constants.SQL_HANDLE_DBC, db2Conn.DBHandle, location +": Unable to allocate statement handle.");\r
+\r
+                       parameters.HwndStmt = hwndStmt;\r
+\r
+                       SetStatementTimeout();\r
                }
 
-               private void SetStatementTimeout()
-               {
-                       short sqlRet = DB2CLIWrapper.SQLSetStmtAttr(hwndStmt, DB2Constants.SQL_ATTR_QUERY_TIMEOUT, new IntPtr(commandTimeout), 0);
-                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Set statement timeout.", db2Conn);
+               private void SetStatementTimeout()\r
+               {\r
+                       short sqlRet = DB2CLIWrapper.SQLSetStmtAttr(hwndStmt, DB2Constants.SQL_ATTR_QUERY_TIMEOUT, new IntPtr(commandTimeout), 0);\r
+                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Set statement timeout.", db2Conn);\r
                }
                #endregion
 
@@ -349,13 +349,13 @@ namespace IBM.Data.DB2
                /// <summary>
                /// Attempt to cancel an executing command
                /// </summary>
-               public void Cancel()
-               {
-                       if(hwndStmt == IntPtr.Zero)
-                       {
-                               throw new InvalidOperationException("Nothing to Cancel.");
-                       }
-                       DB2CLIWrapper.SQLCancel(hwndStmt);
+               public void Cancel()\r
+               {\r
+                       if(hwndStmt == IntPtr.Zero)\r
+                       {\r
+                               throw new InvalidOperationException("Nothing to Cancel.");\r
+                       }\r
+                       DB2CLIWrapper.SQLCancel(hwndStmt);\r
                }
                #endregion
 
@@ -371,161 +371,135 @@ namespace IBM.Data.DB2
 
                #region ExecuteNonQuery
 
-               public int ExecuteNonQuery()
-               {
-                       ExecuteNonQueryInternal(CommandBehavior.Default);
-
-                       int numRows;
-
-                       //How many rows affected.  numRows will be -1 if we aren't dealing with an Insert, Delete or Update, or if the statement did not execute successfully
-                       short sqlRet = DB2CLIWrapper.SQLRowCount(hwndStmt, out numRows);
-                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLExecDirect error.", db2Conn);
-
-                       do
-                       {
-                               sqlRet = DB2CLIWrapper.SQLMoreResults(this.hwndStmt);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "DB2ClientDataReader - SQLMoreResults", db2Conn);
-                       } while(sqlRet != DB2Constants.SQL_NO_DATA_FOUND);
-
-                       CloseStatementHandle(false);
-                       
-                       return numRows;
-               }
-
-               public void ExecuteNonQueryInternal(CommandBehavior behavior)
-               {
-                       short sqlRet;
-
-                       if((db2Conn == null) || (db2Conn.State != ConnectionState.Open))
-                               throw new InvalidOperationException("Prepare needs an open connection");
-                       if((refDataReader != null) &&
-                               (refDataReader.IsAlive))
-                               throw new InvalidOperationException("There is already an open DataReader associated with this Connection which must be closed first.");
-                       DB2Transaction connectionTransaction = null;
-                       if(db2Conn.WeakRefTransaction != null)
-                               connectionTransaction = (DB2Transaction)db2Conn.WeakRefTransaction.Target;
-                       if(!Object.ReferenceEquals(connectionTransaction, Transaction))
-                       {
-                               if(Transaction == null)
-                                       throw new InvalidOperationException("A transaction was started in the connection, but the command doesn't specify a transaction");
-                               throw new InvalidOperationException("The transaction specified at the connection doesn't belong to the connection");
-                       }
-
-                       if (hwndStmt == IntPtr.Zero)
-                       {
-                               AllocateStatement("InternalExecuteNonQuery");
-                               previousBehavior = 0;
-                       }
-                       if(previousBehavior != behavior)
-                       {
-                               
-                               if(((previousBehavior ^ behavior) & CommandBehavior.SchemaOnly) != 0)
-                               {
-                                       sqlRet = DB2CLIWrapper.SQLSetStmtAttr(hwndStmt, DB2Constants.SQL_ATTR_DEFERRED_PREPARE, 
-                                               new IntPtr((behavior & CommandBehavior.SchemaOnly) != 0 ? 0 : 1), 0);
-                                       // TODO: don't check. what if it is not supported???
-                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Defered prepare.", db2Conn);
-
-                                       previousBehavior = (previousBehavior & ~CommandBehavior.SchemaOnly) | (behavior & CommandBehavior.SchemaOnly);
-                               }
-                               
-                               if(((previousBehavior ^ behavior) & CommandBehavior.SingleRow) != 0)
-                               {
-                                       sqlRet = DB2CLIWrapper.SQLSetStmtAttr(hwndStmt, DB2Constants.SQL_ATTR_MAX_ROWS, 
-                                               new IntPtr((behavior & CommandBehavior.SingleRow) == 0 ? 0 : 1), 0);
-                                       // TODO: don't check. what if it is not supported???
-                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Set max rows", db2Conn);
-
-                                       previousBehavior = (previousBehavior & ~CommandBehavior.SingleRow) | (behavior & CommandBehavior.SingleRow);
-                               }
-                               previousBehavior = behavior;
-                       }
-                       if((Transaction == null) &&
-                               !db2Conn.openConnection.autoCommit)
-                       {
-                               sqlRet = DB2CLIWrapper.SQLSetConnectAttr(db2Conn.DBHandle, DB2Constants.SQL_ATTR_AUTOCOMMIT, new IntPtr(DB2Constants.SQL_AUTOCOMMIT_ON), 0);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, db2Conn.DBHandle, "Error setting AUTOCOMMIT ON in transaction CTOR.", db2Conn);
-                               db2Conn.openConnection.autoCommit = true;
-
-                               sqlRet = DB2CLIWrapper.SQLSetConnectAttr(db2Conn.DBHandle, DB2Constants.SQL_ATTR_TXN_ISOLATION, new IntPtr(DB2Constants.SQL_TXN_READ_COMMITTED), 0);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, db2Conn.DBHandle, "Error setting isolation level.", db2Conn);
-                       }
-
-                       
-                       if ((commandText == null) ||(commandText.Length == 0))
-                               throw new InvalidOperationException("Command string is empty");
-                               
-                       if(CommandType.StoredProcedure == commandType && !commandText.StartsWith("CALL "))
-                               commandText = "CALL " + commandText;
-                       
-                       //            if(!prepared)
-                       //            {
-                       //                Prepare();
-                       //            }
-                       
-                       if((behavior & CommandBehavior.SchemaOnly) != 0)
-                       {
-                               if(!prepared)
-                               {
-                                       Prepare();
-                               }
-                       }
-                       else
-                       {
-                               if(statementParametersMemory != IntPtr.Zero)
-                               {
-                                       Marshal.FreeHGlobal(statementParametersMemory);
-                                       statementParametersMemory = IntPtr.Zero;
-                               }
-                               
-                               if(parameters.Count > 0)
-                               {
-                                       statementParametersMemorySize = 0;
-                                       for(int i = 0; i < parameters.Count; i++) 
-                                       {
-                                               DB2Parameter param = parameters[i];
-                                               param.CalculateRequiredmemory();
-                                               statementParametersMemorySize += param.requiredMemory + 8;
-                                       }
-                                       statementParametersMemory = Marshal.AllocHGlobal(statementParametersMemorySize);
-                                       int offset = 0;
-                                       
-                                       for(int i = 0; i < parameters.Count; i++) 
-                                       {
-                                               DB2Parameter param = parameters[i];
-                                               //param.internalBuffer = new IntPtr(statementParametersMemory.ToInt64() + offset);
-                                               int memSize = statementParametersMemory.ToInt32() + offset;
-                                               param.internalBuffer = Marshal.AllocHGlobal(memSize);
-                                               offset += param.requiredMemory;
-                                               //param.internalLengthBuffer = new IntPtr(statementParametersMemory.ToInt32() + offset);
-                                               param.internalLengthBuffer = Marshal.AllocHGlobal(4);
-                                               offset += 8;
-                                               
-                                               sqlRet = param.Bind(this.hwndStmt, (short)(i + 1));
-                                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Error binding parameter in DB2Command: ", db2Conn);
-                                       }
-                                       
-                               }
-                               if (prepared)
-                               {
-                                       sqlRet = DB2CLIWrapper.SQLExecute(hwndStmt);
-                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLExecute error.", db2Conn);
-                               }
-                               else
-                               {
-                                       sqlRet = DB2CLIWrapper.SQLExecDirect(hwndStmt, commandText, commandText.Length);
-                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLExecDirect error.", db2Conn);
-                               }
-                               statementOpen = true;
-
-                               parameters.GetOutValues();
-
-                               if(statementParametersMemory != IntPtr.Zero)
-                               {
-                                       Marshal.FreeHGlobal(statementParametersMemory);
-                                       statementParametersMemory = IntPtr.Zero;
-                               }
-                       }
+               public int ExecuteNonQuery()\r
+               {\r
+                       ExecuteNonQueryInternal(CommandBehavior.Default);\r
+\r
+                       int numRows;\r
+\r
+                       //How many rows affected.  numRows will be -1 if we aren't dealing with an Insert, Delete or Update, or if the statement did not execute successfully\r
+                       short sqlRet = DB2CLIWrapper.SQLRowCount(hwndStmt, out numRows);\r
+                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLExecDirect error.", db2Conn);\r
+\r
+                       do\r
+                       {\r
+                               sqlRet = DB2CLIWrapper.SQLMoreResults(this.hwndStmt);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "DB2ClientDataReader - SQLMoreResults", db2Conn);\r
+                       } while(sqlRet != DB2Constants.SQL_NO_DATA_FOUND);\r
+\r
+                       CloseStatementHandle(false);\r
+                       \r
+                       return numRows;\r
+               }\r
+\r
+               public void ExecuteNonQueryInternal(CommandBehavior behavior)\r
+               {\r
+                       short sqlRet;\r
+\r
+                       if(prepared && binded)\r
+                       {\r
+                               sqlRet = DB2CLIWrapper.SQLExecute(hwndStmt);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLExecute error.", db2Conn);\r
+                               return;\r
+                       }\r
+\r
+                       if((db2Conn == null) || (db2Conn.State != ConnectionState.Open))\r
+                               throw new InvalidOperationException("Prepare needs an open connection");\r
+                       if((refDataReader != null) &&\r
+                               (refDataReader.IsAlive))\r
+                               throw new InvalidOperationException("There is already an open DataReader associated with this Connection which must be closed first.");\r
+                       DB2Transaction connectionTransaction = null;\r
+                       if(db2Conn.WeakRefTransaction != null)\r
+                               connectionTransaction = (DB2Transaction)db2Conn.WeakRefTransaction.Target;\r
+                       if(!Object.ReferenceEquals(connectionTransaction, Transaction))\r
+                       {\r
+                               if(Transaction == null)\r
+                                       throw new InvalidOperationException("A transaction was started in the connection, but the command doesn't specify a transaction");\r
+                               throw new InvalidOperationException("The transaction specified at the connection doesn't belong to the connection");\r
+                       }\r
+\r
+                       if (hwndStmt == IntPtr.Zero)\r
+                       {\r
+                               AllocateStatement("InternalExecuteNonQuery");\r
+                               previousBehavior = 0;\r
+                       }\r
+                       if(previousBehavior != behavior)\r
+                       {\r
+                               if(((previousBehavior ^ behavior) & CommandBehavior.SchemaOnly) != 0)\r
+                               {\r
+                                       sqlRet = DB2CLIWrapper.SQLSetStmtAttr(hwndStmt, DB2Constants.SQL_ATTR_DEFERRED_PREPARE, \r
+                                               new IntPtr((behavior & CommandBehavior.SchemaOnly) != 0 ? 0 : 1), 0);\r
+                                       // TODO: don't check. what if it is not supported???\r
+                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Defered prepare.", db2Conn);\r
+\r
+                                       previousBehavior = (previousBehavior & ~CommandBehavior.SchemaOnly) | (behavior & CommandBehavior.SchemaOnly);\r
+                               }\r
+                               if(((previousBehavior ^ behavior) & CommandBehavior.SingleRow) != 0)\r
+                               {\r
+                                       sqlRet = DB2CLIWrapper.SQLSetStmtAttr(hwndStmt, DB2Constants.SQL_ATTR_MAX_ROWS, \r
+                                               new IntPtr((behavior & CommandBehavior.SingleRow) == 0 ? 0 : 1), 0);\r
+                                       // TODO: don't check. what if it is not supported???\r
+                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Set max rows", db2Conn);\r
+\r
+                                       previousBehavior = (previousBehavior & ~CommandBehavior.SingleRow) | (behavior & CommandBehavior.SingleRow);\r
+                               }\r
+                               previousBehavior = behavior;\r
+                       }\r
+                       if((Transaction == null) &&\r
+                               !db2Conn.openConnection.autoCommit)\r
+                       {\r
+                               sqlRet = DB2CLIWrapper.SQLSetConnectAttr(db2Conn.DBHandle, DB2Constants.SQL_ATTR_AUTOCOMMIT, new IntPtr(DB2Constants.SQL_AUTOCOMMIT_ON), 0);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, db2Conn.DBHandle, "Error setting AUTOCOMMIT ON in transaction CTOR.", db2Conn);\r
+                               db2Conn.openConnection.autoCommit = true;\r
+\r
+                               sqlRet = DB2CLIWrapper.SQLSetConnectAttr(db2Conn.DBHandle, DB2Constants.SQL_ATTR_TXN_ISOLATION, new IntPtr(DB2Constants.SQL_TXN_READ_COMMITTED), 0);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, db2Conn.DBHandle, "Error setting isolation level.", db2Conn);\r
+                       }\r
+\r
+\r
+                       if ((commandText == null) ||(commandText.Length == 0))\r
+                               throw new InvalidOperationException("Command string is empty");\r
+                               \r
+                       if(CommandType.StoredProcedure == commandType && !commandText.StartsWith("CALL "))\r
+                               commandText = "CALL " + commandText + " ()";\r
+                       \r
+                       if((behavior & CommandBehavior.SchemaOnly) != 0)\r
+                       {\r
+                               if(!prepared)\r
+                               {\r
+                                       Prepare();\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if(statementParametersMemory != IntPtr.Zero)\r
+                               {\r
+                                       Marshal.FreeHGlobal(statementParametersMemory);\r
+                                       statementParametersMemory = IntPtr.Zero;\r
+                               }\r
+\r
+                               BindParams();\r
+                               \r
+                               if (prepared)\r
+                               {\r
+                                       sqlRet = DB2CLIWrapper.SQLExecute(hwndStmt);\r
+                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLExecute error.", db2Conn);\r
+                               }\r
+                               else\r
+                               {\r
+                                       sqlRet = DB2CLIWrapper.SQLExecDirect(hwndStmt, commandText, commandText.Length);\r
+                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLExecDirect error.", db2Conn);\r
+                               }\r
+                               statementOpen = true;\r
+\r
+                               parameters.GetOutValues();\r
+\r
+                               if(statementParametersMemory != IntPtr.Zero)\r
+                               {\r
+                                       Marshal.FreeHGlobal(statementParametersMemory);\r
+                                       statementParametersMemory = IntPtr.Zero;\r
+                               }\r
+                       }\r
                }
                #endregion
 
@@ -533,34 +507,34 @@ namespace IBM.Data.DB2
                ///
                ///ExecuteReader
                ///
-               IDataReader IDbCommand.ExecuteReader()
-               {
-                       return ExecuteReader(CommandBehavior.Default);
-               }
-
-               IDataReader IDbCommand.ExecuteReader(CommandBehavior behavior)
-               {
-                       return ExecuteReader(behavior);
-               }
-
-               public DB2DataReader ExecuteReader()
-               {
-                       return ExecuteReader(CommandBehavior.Default);
-               }
-
-               public DB2DataReader ExecuteReader(CommandBehavior behavior)
-               {
-                       if((db2Conn == null) || (db2Conn.State != ConnectionState.Open))
-                               throw new InvalidOperationException("Prepare needs an open connection");
-
-                       DB2DataReader reader;
-                       
-                       ExecuteNonQueryInternal(behavior);
-                       reader = new DB2DataReader(db2Conn, this, behavior);
-                       
-                       refDataReader = new WeakReference(reader);
-
-                       return reader;
+               IDataReader IDbCommand.ExecuteReader()\r
+               {\r
+                       return ExecuteReader(CommandBehavior.Default);\r
+               }\r
+\r
+               IDataReader IDbCommand.ExecuteReader(CommandBehavior behavior)\r
+               {\r
+                       return ExecuteReader(behavior);\r
+               }\r
+\r
+               public DB2DataReader ExecuteReader()\r
+               {\r
+                       return ExecuteReader(CommandBehavior.Default);\r
+               }\r
+\r
+               public DB2DataReader ExecuteReader(CommandBehavior behavior)\r
+               {\r
+                       if((db2Conn == null) || (db2Conn.State != ConnectionState.Open))\r
+                               throw new InvalidOperationException("Prepare needs an open connection");\r
+\r
+                       DB2DataReader reader;\r
+                       \r
+                       ExecuteNonQueryInternal(behavior);\r
+                       reader = new DB2DataReader(db2Conn, this, behavior);\r
+                       \r
+                       refDataReader = new WeakReference(reader);\r
+\r
+                       return reader;\r
                }
                #endregion
 
@@ -568,65 +542,102 @@ namespace IBM.Data.DB2
                ///
                /// ExecuteScalar
                /// 
-               public object ExecuteScalar()
-               {
-                       if((db2Conn == null) || (db2Conn.State != ConnectionState.Open))
-                               throw new InvalidOperationException("Prepare needs an open connection");
-
-                       using(DB2DataReader reader = ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.SingleRow))
-                       {
-                               if(reader.Read() && (reader.FieldCount > 0))
-                               {
-                                       return reader[0];
-                               }
-                       }
-                       return null;
+               public object ExecuteScalar()\r
+               {\r
+                       if((db2Conn == null) || (db2Conn.State != ConnectionState.Open))\r
+                               throw new InvalidOperationException("Prepare needs an open connection");\r
+\r
+                       using(DB2DataReader reader = ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.SingleRow))\r
+                       {\r
+                               if(reader.Read() && (reader.FieldCount > 0))\r
+                               {\r
+                                       return reader[0];\r
+                               }\r
+                       }\r
+                       return null;\r
                }
                #endregion
 
                #region Prepare ()
-
-               public void Prepare ()
-               {
-                       if((db2Conn == null) || (db2Conn.State != ConnectionState.Open))
-                               throw new InvalidOperationException("Prepare needs an open connection");
-
-                       CloseStatementHandle(false);
-                       if (hwndStmt == IntPtr.Zero)
-                       {
-                               AllocateStatement("InternalExecuteNonQuery");
-                       }
-
-                       short sqlRet = 0;
-
-                       IntPtr numParams = IntPtr.Zero;
-                       sqlRet = DB2CLIWrapper.SQLPrepare(hwndStmt, commandText, commandText.Length);
-                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLPrepare error.", db2Conn);
-
-                       statementOpen = true;
-                       prepared=true;
+\r
+               public void Prepare ()\r
+               {\r
+                       if((db2Conn == null) || (db2Conn.State != ConnectionState.Open))\r
+                               throw new InvalidOperationException("Prepare needs an open connection");\r
+\r
+                       CloseStatementHandle(false);\r
+                       if (hwndStmt == IntPtr.Zero)\r
+                       {\r
+                               AllocateStatement("InternalExecuteNonQuery");\r
+                       }\r
+\r
+                       short sqlRet = 0;\r
+\r
+                       IntPtr numParams = IntPtr.Zero;\r
+                       sqlRet = DB2CLIWrapper.SQLPrepare(hwndStmt, commandText, commandText.Length);\r
+                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLPrepare error.", db2Conn);\r
+                       \r
+                       \r
+                       statementOpen = true;\r
+                       prepared=true;\r
                }
                #endregion
 
-               #region ICloneable Members
-
-               object ICloneable.Clone()
-               {
-                       DB2Command clone = new DB2Command();
-
-                       clone.Connection = Connection;
-                       clone.commandText = commandText;
-                       clone.commandType = commandType;
-                       clone.Transaction = db2Trans;
-                       clone.commandTimeout = commandTimeout;
-                       clone.updatedRowSource = updatedRowSource;
-                       clone.parameters = new DB2ParameterCollection();
-                       for(int i = 0; i < parameters.Count; i++)
-                               clone.Parameters.Add(((ICloneable)parameters[i]).Clone());
-
-                       return clone;
-               }
-
+               private string AddCallParam( string _cmString)\r
+               {
+                       if(_cmString.IndexOf("()") != -1)\r
+                       {\r
+                               return _cmString.Replace("()","(?)");\r
+                       }\r
+                       return _cmString.Replace(")", ",?)");
+               }
+
+               private void BindParams()\r
+               {
+                       if(parameters.Count > 0)\r
+                       {\r
+                               statementParametersMemorySize = 0;\r
+                               int offset = 0;\r
+                               short sqlRet;\r
+                               for(int i = 0; i < parameters.Count; i++) \r
+                               {\r
+                                       if(commandType == CommandType.StoredProcedure)\r
+                                       {\r
+                                               commandText = AddCallParam(commandText);\r
+                                       }\r
+                                       DB2Parameter param = parameters[i];\r
+                                       param.CalculateRequiredmemory();\r
+                                       statementParametersMemorySize += param.requiredMemory + 8;\r
+                                       param.internalBuffer = Marshal.AllocHGlobal(param.requiredMemory);\r
+                                       offset += param.requiredMemory;\r
+                                       param.internalLengthBuffer = Marshal.AllocHGlobal(4);\r
+                                       Marshal.WriteInt32(param.internalLengthBuffer, param.requiredMemory);\r
+                                       sqlRet = param.Bind(this.hwndStmt, (short)(i + 1));\r
+                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Error binding parameter in DB2Command: ", db2Conn);\r
+                               }\r
+                               binded = true;\r
+                       }
+               }
+
+               #region ICloneable Members\r
+\r
+               object ICloneable.Clone()\r
+               {\r
+                       DB2Command clone = new DB2Command();\r
+\r
+                       clone.Connection = Connection;\r
+                       clone.commandText = commandText;\r
+                       clone.commandType = commandType;\r
+                       clone.Transaction = db2Trans;\r
+                       clone.commandTimeout = commandTimeout;\r
+                       clone.updatedRowSource = updatedRowSource;\r
+                       clone.parameters = new DB2ParameterCollection();\r
+                       for(int i = 0; i < parameters.Count; i++)\r
+                               clone.Parameters.Add(((ICloneable)parameters[i]).Clone());\r
+\r
+                       return clone;\r
+               }\r
+\r
                #endregion
        }
 }
diff --git a/mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2CommandBuilder.cs b/mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2CommandBuilder.cs
new file mode 100755 (executable)
index 0000000..a15f726
--- /dev/null
@@ -0,0 +1,270 @@
+using System;
+using System.Data;
+using System.ComponentModel;
+
+namespace IBM.Data.DB2
+{
+
+       public sealed class DB2CommandBuilder : Component
+       {
+
+               bool disposed = false;
+
+               private DB2DataAdapter dataAdapter;
+               private DB2Command insertCommand;
+               private DB2Command updateCommand;
+               private DB2Command deleteCommand;
+
+               private string tableName = String.Empty;
+
+               public DB2CommandBuilder ()
+               {}
+
+               public DB2CommandBuilder (DB2DataAdapter adapter)
+               {
+                       DataAdapter = adapter;
+               }
+
+               public DB2DataAdapter DataAdapter \r
+               {
+                       get
+                       {
+                               return dataAdapter;
+                       }
+                       set
+                       {
+                               if (dataAdapter != null)
+                               {
+                                       throw new Exception ("DataAdapter is already set");
+                               }
+                               dataAdapter = value;
+                               string select_text = dataAdapter.SelectCommand.CommandText;
+                               string[] words = select_text.Split(new char [] {' '});
+                               bool from_found = false;
+                               for (int i = 0; i < words.Length; i++)
+                               {
+                                       if (from_found && (words[i] != String.Empty))
+                                       {
+                                               tableName = words[i];
+                                               break;
+                                       }
+                                       if (words[i].ToLower() == "from")
+                                       {
+                                               from_found = true;
+                                       }
+                               }
+                       }
+               }
+
+               public string QuotePrefix \r
+               {
+                       get
+                       {
+                               return "";
+                       }
+                       set
+                       { }
+               }
+
+               public string QuoteSuffix \r
+               {
+                       get
+                       {
+                               return "";
+                       }
+                       set
+                       { }
+               }
+
+               public static void DeriveParameters (DB2Command command)
+               {}
+
+               public DB2Command GetInsertCommand ()
+               {
+                       DataTable dt = GetSchema();
+                       if (insertCommand == null)
+                       {
+                               string fields = "";
+                               string values = "";
+                               for (int i = 0; i < dt.Rows.Count; i++)
+                               {
+                                       //DataColumn column = dt.Columns[i];
+                                       DataRow dr = dt.Rows[i];
+                                       DataColumn column = new DataColumn((string)dr["ColumnName"], DB2TypeConverter.GetManagedType((int)dr["ProviderType"]));
+                               
+                                       if (fields.Length != 0 && !((bool)dr["IsAutoIncrement"]))
+                                       {
+                                               fields += ", ";
+                                               values += ", ";
+                                       }
+
+                                       if(!((bool)dr["IsAutoIncrement"]))\r
+                                       {
+                                               fields += column.ColumnName;
+                                               //values += ":v_" + column.ColumnName;
+                                               values += "?";
+                                       }
+                               }
+                               if (tableName == String.Empty)
+                               {
+                                       tableName = dt.TableName;
+                               }
+                               DB2Command cmdaux = new DB2Command("insert into " + tableName + " (" + fields + ") values (" + values + ")", dataAdapter.SelectCommand.Connection);
+                               for (int i = 0;i < dt.Rows.Count;i++)
+                               {
+                                       //DataColumn column = dt.Columns[i];
+                                       DataRow dr = dt.Rows[i];
+                                       DataColumn column = new DataColumn((string)dr["ColumnName"], DB2TypeConverter.GetManagedType((int)dr["ProviderType"]));\r
+                                       if (!((bool)dr["IsAutoIncrement"]))\r
+                                       {
+                                               DB2Parameter aux = new DB2Parameter("v_" + column.ColumnName,  column.DataType);
+                                               aux.Direction = ParameterDirection.Input;
+                                               aux.SourceColumn = column.ColumnName;
+                                               cmdaux.Parameters.Add(aux);
+                                       }
+                               }
+                               insertCommand = cmdaux;
+                       }
+                       return insertCommand;
+               }
+
+               public DB2Command GetUpdateCommand ()
+               {
+                       DataTable dt = GetSchema();
+                       if (updateCommand == null)
+                       {
+                               string sets = "";
+                               string wheres = "";
+                               for (int i = 0; i < dt.Rows.Count; i++)
+                               {
+                                       if (sets.Length != 0 && !((bool)dt.Rows[i]["IsAutoIncrement"]))\r
+                                       {
+                                               sets += ", ";
+                                       }
+                                       if (i != 0)
+                                       {
+                                               wheres += " and ";
+                                       }
+                                       DataRow dr = dt.Rows[i];
+                                       DataColumn column = new DataColumn((string)dr["ColumnName"], DB2TypeConverter.GetManagedType((int)dr["ProviderType"]));
+                                       if(!((bool)dr["IsAutoIncrement"])){sets += String.Format("{0} = ? ", column.ColumnName);}
+                                       wheres += String.Format("(({0} is null) or ({0} = ?))", column.ColumnName);
+                               }
+                               if (tableName == String.Empty)
+                               {
+                                       tableName = (string)dt.Rows[0]["BaseTableName"];
+                               }
+                               DB2Command cmdaux = new DB2Command("update " + tableName + " set " + sets + " where ( " + wheres + " )", dataAdapter.SelectCommand.Connection);
+                               for (int i = 0; i < dt.Rows.Count; i++)
+                               {
+                                       DataRow dr = dt.Rows[i];
+                                       DataColumn column = new DataColumn((string)dr["ColumnName"], DB2TypeConverter.GetManagedType((int)dr["ProviderType"]));
+                                       if (!((bool)dr["IsAutoIncrement"]))\r
+                                       {
+                                               DB2Parameter aux = new DB2Parameter("s_" + column.ColumnName, column.DataType);
+                                               aux.Direction = ParameterDirection.Input;
+                                               aux.SourceColumn = column.ColumnName;
+                                               aux.SourceVersion = DataRowVersion.Current;
+                                               cmdaux.Parameters.Add(aux);
+                                       }
+                               }
+                               for (int i = 0; i < dt.Rows.Count; i++)
+                               {
+                                       DataRow dr = dt.Rows[i];
+                                       DataColumn column = new DataColumn((string)dr["ColumnName"], DB2TypeConverter.GetManagedType((int)dr["ProviderType"]));
+                                       DB2Parameter aux = new DB2Parameter("w_" + column.ColumnName, column.DataType);
+                                       aux.Direction = ParameterDirection.Input;
+                                       aux.SourceColumn = column.ColumnName;
+                                       aux.SourceVersion = DataRowVersion.Original;
+                                       cmdaux.Parameters.Add(aux);
+                               }
+                               updateCommand = cmdaux;
+
+                       }
+                       return updateCommand;
+               }
+
+               public DB2Command GetDeleteCommand ()
+               {
+                       DataTable dt = GetSchema();
+                       if (deleteCommand == null)
+                       {
+                               string wheres = "";
+                               for (int i = 0; i < dt.Rows.Count; i++)
+                               {
+                                       //DataColumn column = row.Table.Columns[i];
+                                       DataRow dr = dt.Rows[i];
+                                       DataColumn column = new DataColumn((string)dr["ColumnName"], DB2TypeConverter.GetManagedType((int)dr["ProviderType"]));
+                                       if (i != 0)
+                                       {
+                                               wheres += " and ";
+                                       }
+                                       //wheres += String.Format("(({0} is null) or ({0} = v_{0}))", column.ColumnName);
+                                       wheres += String.Format("(({0} is null) or ({0} = ?))", column.ColumnName);
+                               }
+                               if (tableName == String.Empty)
+                               {
+                                       tableName = (string)dt.Rows[0]["BaseTableName"];
+                               }
+                               DB2Command cmdaux = new DB2Command("delete from " + tableName + " where ( " + wheres + " )", dataAdapter.SelectCommand.Connection);
+                               for (int i = 0; i < dt.Rows.Count; i++)
+                               {
+                                       DataRow dr = dt.Rows[i];
+                                       DataColumn column = new DataColumn((string)dr["ColumnName"], DB2TypeConverter.GetManagedType((int)dr["ProviderType"]));
+                                       
+                                       DB2Parameter aux = new DB2Parameter("v_" + column.ColumnName, column.DataType);
+                                       aux.Direction = ParameterDirection.Input;
+                                       aux.SourceColumn = column.ColumnName;
+                                       aux.SourceVersion = DataRowVersion.Original;
+                                       cmdaux.Parameters.Add(aux);
+                               }
+                               deleteCommand = cmdaux;
+                       }
+                       return deleteCommand;
+               }
+
+               public void RefreshSchema ()
+               {
+                       insertCommand = null;
+                       updateCommand = null;
+                       deleteCommand = null;
+               }
+
+               private DataTable GetSchema()\r
+               {
+                       dataAdapter.SelectCommand.Connection.Open();
+                       DB2Command cmd = new DB2Command(dataAdapter.SelectCommand.CommandText, dataAdapter.SelectCommand.Connection);
+                       DB2DataReader fake = cmd.ExecuteReader(CommandBehavior.KeyInfo);
+                       
+                       DataTable dt = fake.GetSchemaTable();
+                       fake.Close();
+                       dataAdapter.SelectCommand.Connection.Close();
+
+                       return dt;
+               }
+
+               protected override void Dispose (bool disposing)
+               {
+                       if (!disposed)
+                       {
+                               if (disposing)
+                               {
+                                       if (insertCommand != null)
+                                       {
+                                               insertCommand.Dispose();
+                                       }
+                                       if (updateCommand != null)
+                                       {
+                                               updateCommand.Dispose();
+                                       }
+                                       if (deleteCommand != null)
+                                       {
+                                               deleteCommand.Dispose();
+                                       }
+                               }
+                       }
+               }
+
+       }
+
+}
index a7f1835aa816bb6f7ff511096b550b5a731da5ad..15710eaa0727d9a225293e60165c7ecb5e0a568e 100755 (executable)
@@ -9,7 +9,7 @@ namespace IBM.Data.DB2
 {
 
        
-       public sealed class DB2Connection : System.ComponentModel.Component, IDbConnection, ICloneable
+       public class DB2Connection : System.ComponentModel.Component, IDbConnection, ICloneable
        {
                #region private data members
 
@@ -25,7 +25,9 @@ namespace IBM.Data.DB2
                #region Constructors
 
                public DB2Connection()
-               {       
+               {
+                       connectionTimeout = 15;
+                       
                }
                
                public DB2Connection(string conString)
@@ -84,6 +86,7 @@ namespace IBM.Data.DB2
                {
                        get
                        {   
+                               //if ((long)dbHandle.ToPointer() == DB2Constants.SQL_NULL_HANDLE)
                                if (openConnection == null)
                                        return ConnectionState.Closed;
                                return ConnectionState.Open;
@@ -246,6 +249,7 @@ namespace IBM.Data.DB2
                #endregion
                
                #region Open
+
                unsafe public void Open()\r
                {\r
                        if(disposed)\r
index dd1724299bb92edef614307a8553bb4a136804b7..0404e667925d304ce9c8031a057b9714b5699a4f 100755 (executable)
-using System;
-using System.Collections;
-using System.Text;
-using System.Threading;
-
-namespace IBM.Data.DB2
-{
-       /// <summary>
-       /// 
-       /// </summary>
-       /// <remarks>One connection pool per connectionstring</remarks>
-       internal sealed class DB2ConnectionPool
-       {
-               private ArrayList       openFreeConnections; // list of pooled connections sorted by age. First connection is present at index 'connectionsUsableOffset'
-               private Queue           openFreeMinimalAllocated;
-               private int                     connectionsOpen;        // total number of connections open (in pool, an in use by application)
-               private int                     connectionsInUse;       // total connection in use by application
-               private int                     connectionsUsableOffset; // Offset to the first pooled connection in 'openFreeConnections'
-               private Timer           timer;
-               public string           databaseProductName;
-               public string           databaseVersion;
-               public int                      majorVersion;
-               public int                      minorVersion;
-
-               private DB2ConnectionSettings connectionSettings;
-
-               public DB2ConnectionPool(DB2ConnectionSettings connectionSettings)
-               {
-                       this.connectionSettings = connectionSettings;
-                       openFreeConnections = new ArrayList();
-               }
-
-               public DB2ConnectionSettings ConnectionSettings
-               {
-                       get { return connectionSettings; }
-               }
-
-               public DB2OpenConnection GetOpenConnection(DB2Connection db2Conn)
-               {
-                       DB2OpenConnection connection = null;
-                       lock(openFreeConnections.SyncRoot)
-                       {
-                               if((connectionSettings.ConnectionPoolSizeMax > 0) &&
-                                       (connectionsOpen >= connectionSettings.ConnectionPoolSizeMax))
-                               {
-                                       throw new ArgumentException("Maximum connections reached for connectionstring");
-                               }
-
-                               while(connectionsOpen > connectionsInUse)
-                               {
-                                       connection = (DB2OpenConnection)openFreeConnections[openFreeConnections.Count - 1];
-                                       openFreeConnections.RemoveAt(openFreeConnections.Count - 1);
-
-                                       // check if connection is dead
-                                       int isDead;
-                                       short sqlRet = DB2CLIWrapper.SQLGetConnectAttr(connection.DBHandle, DB2Constants.SQL_ATTR_CONNECTION_DEAD, out isDead, 0, IntPtr.Zero);
-                                       if(((sqlRet == DB2Constants.SQL_SUCCESS_WITH_INFO) || (sqlRet == DB2Constants.SQL_SUCCESS)) &&
-                                               (isDead == DB2Constants.SQL_CD_FALSE))
-                                       {
-                                               connectionsInUse++;
-                                               break;
-                                       }
-                                       else
-                                       {
-                                               connectionsOpen--;
-                                               connection.Dispose();
-                                               connection = null;
-                                       }
-
-                               }
-                               if(connectionsOpen == connectionsInUse)
-                               {
-                                       if(timer != null)
-                                       {
-                                               timer.Dispose();
-                                               timer = null;
-                                       }
-                               }
-                       }
-                       if(connection == null)
-                       {
-                               openFreeConnections.Clear();
-                               connectionsUsableOffset = 0;
-
-                               connection = new DB2OpenConnection(connectionSettings, db2Conn);
-
-                               connectionsOpen++;
-                               connectionsInUse++;
-                       }
-
-                       return connection;
-               }
-
-               private void DisposeTimedoutConnections(object state)
-               {
-                       lock(openFreeConnections.SyncRoot)
-                       {
-                               if(timer != null)
-                               {
-                                       TimeSpan timeToDispose = TimeSpan.Zero;
-                                       DB2OpenConnection connection;
-                                       while(connectionsOpen > connectionsInUse)
-                                       {
-                                               connection = (DB2OpenConnection)openFreeConnections[connectionsUsableOffset];
-                                               timeToDispose = connection.poolDisposalTime.Subtract(DateTime.Now);
-                                               if((timeToDispose.Ticks < 0) ||                                                          // time to die
-                                                       (timeToDispose > connectionSettings.ConnectionLifeTime)) // messing with system clock
-                                               {
-                                                       connection.Dispose();
-                                                       openFreeConnections[connectionsUsableOffset] = null;
-                                                       connectionsOpen--;
-                                                       connectionsUsableOffset++;
-                                               }
-                                               else
-                                               {
-                                                       break;
-                                               }
-                                       }
-                                       if(connectionsOpen > connectionsInUse)
-                                       {
-                                               connection = (DB2OpenConnection)openFreeConnections[connectionsUsableOffset];
-                                               timer.Change(timeToDispose, new TimeSpan(-1));
-                                       }
-                                       else
-                                       {
-                                               timer.Dispose();
-                                               timer = null;
-                                       }
-                               }
-                               if((connectionsUsableOffset > (openFreeConnections.Capacity / 2)) &&
-                                       (connectionsOpen > connectionsInUse))
-                               {
-                                       openFreeConnections.RemoveRange(0, connectionsUsableOffset); // cleanup once in a while
-                                       connectionsUsableOffset = 0;
-                               }
-                       }
-               }
-
-               public void AddToFreeConnections(DB2OpenConnection connection)
-               {
-                       lock(openFreeConnections.SyncRoot)
-                       {
-                               connection.poolDisposalTime = DateTime.Now.Add(connectionSettings.ConnectionLifeTime);
-                               if(timer == null)
-                               {
-                                       timer = new Timer(new TimerCallback(DisposeTimedoutConnections), null, 
-                                               connectionSettings.ConnectionLifeTime, new TimeSpan(-1));
-                               }
-                               connectionsInUse--;
-                               openFreeConnections.Add(connection);
-                       }
-               }
-
-               public void OpenConnectionFinalized()
-               {
-                       lock(openFreeConnections.SyncRoot)
-                       {
-                               connectionsOpen--;
-                               connectionsInUse--;
-                       }
-               }
-
-               /// <summary>
-               /// Find a specific connection pool
-               /// </summary>
-               /// <param name="connectionString"></param>
-               /// <returns></returns>
-               static public DB2ConnectionPool FindConnectionPool(string connectionString)
-               {
-                       return (DB2ConnectionPool)DB2Environment.Instance.connectionPools[connectionString];
-               }
-
-               /// <summary>
-               /// Get a connection pool. If it doesn't exist yet, create it
-               /// </summary>
-               /// <param name="connectionSettings"></param>
-               /// <returns></returns>
-               static public DB2ConnectionPool GetConnectionPool(DB2ConnectionSettings connectionSettings)
-               {
-                       DB2Environment environment = DB2Environment.Instance;
-
-                       lock(environment.connectionPools.SyncRoot)
-                       {
-                               DB2ConnectionPool pool = (DB2ConnectionPool)environment.connectionPools[connectionSettings.ConnectionString];
-                               if(pool == null)
-                               {
-                                       pool = new DB2ConnectionPool(connectionSettings);
-                                       environment.connectionPools.Add(connectionSettings.ConnectionString, pool);
-                               }
-                               return pool;
-                       }
-               }
-       }
-}
+using System;\r
+using System.Collections;\r
+using System.Text;\r
+using System.Threading;\r
+\r
+namespace IBM.Data.DB2\r
+{\r
+       /// <summary>\r
+       /// \r
+       /// </summary>\r
+       /// <remarks>One connection pool per connectionstring</remarks>\r
+       internal sealed class DB2ConnectionPool\r
+       {\r
+               private ArrayList       openFreeConnections; // list of pooled connections sorted by age. First connection is present at index 'connectionsUsableOffset'\r
+               private Queue           openFreeMinimalAllocated;\r
+               private int                     connectionsOpen;        // total number of connections open (in pool, an in use by application)\r
+               private int                     connectionsInUse;       // total connection in use by application\r
+               private int                     connectionsUsableOffset; // Offset to the first pooled connection in 'openFreeConnections'\r
+               private Timer           timer;\r
+               public string           databaseProductName;\r
+               public string           databaseVersion;\r
+               public int                      majorVersion;\r
+               public int                      minorVersion;\r
+\r
+               private DB2ConnectionSettings connectionSettings;\r
+\r
+               public DB2ConnectionPool(DB2ConnectionSettings connectionSettings)\r
+               {\r
+                       this.connectionSettings = connectionSettings;\r
+                       openFreeConnections = new ArrayList();\r
+               }\r
+\r
+               public DB2ConnectionSettings ConnectionSettings\r
+               {\r
+                       get { return connectionSettings; }\r
+               }\r
+\r
+               public DB2OpenConnection GetOpenConnection(DB2Connection db2Conn)\r
+               {\r
+                       DB2OpenConnection connection = null;\r
+                       lock(openFreeConnections.SyncRoot)\r
+                       {\r
+                               if((connectionSettings.ConnectionPoolSizeMax > 0) &&\r
+                                       (connectionsOpen >= connectionSettings.ConnectionPoolSizeMax))\r
+                               {\r
+                                       throw new ArgumentException("Maximum connections reached for connectionstring");\r
+                               }\r
+\r
+                               while(connectionsOpen > connectionsInUse)\r
+                               {\r
+                                       connection = (DB2OpenConnection)openFreeConnections[openFreeConnections.Count - 1];\r
+                                       openFreeConnections.RemoveAt(openFreeConnections.Count - 1);\r
+\r
+                                       // check if connection is dead\r
+                                       int isDead;\r
+                                       short sqlRet = DB2CLIWrapper.SQLGetConnectAttr(connection.DBHandle, DB2Constants.SQL_ATTR_CONNECTION_DEAD, out isDead, 0, IntPtr.Zero);\r
+                                       if(((sqlRet == DB2Constants.SQL_SUCCESS_WITH_INFO) || (sqlRet == DB2Constants.SQL_SUCCESS)) &&\r
+                                               (isDead == DB2Constants.SQL_CD_FALSE))\r
+                                       {\r
+                                               connectionsInUse++;\r
+                                               break;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               connectionsOpen--;\r
+                                               connection.Dispose();\r
+                                               connection = null;\r
+                                       }\r
+\r
+                               }\r
+                               if(connectionsOpen == connectionsInUse)\r
+                               {\r
+                                       if(timer != null)\r
+                                       {\r
+                                               timer.Dispose();\r
+                                               timer = null;\r
+                                       }\r
+                               }\r
+                       }\r
+                       if(connection == null)\r
+                       {\r
+                               openFreeConnections.Clear();\r
+                               connectionsUsableOffset = 0;\r
+\r
+                               connection = new DB2OpenConnection(connectionSettings, db2Conn);\r
+                               connectionsOpen++;\r
+                               connectionsInUse++;\r
+                       }\r
+\r
+                       return connection;\r
+               }\r
+\r
+               private void DisposeTimedoutConnections(object state)\r
+               {\r
+                       lock(openFreeConnections.SyncRoot)\r
+                       {\r
+                               if(timer != null)\r
+                               {\r
+                                       TimeSpan timeToDispose = TimeSpan.Zero;\r
+                                       DB2OpenConnection connection;\r
+                                       while(connectionsOpen > connectionsInUse)\r
+                                       {\r
+                                               connection = (DB2OpenConnection)openFreeConnections[connectionsUsableOffset];\r
+                                               timeToDispose = connection.poolDisposalTime.Subtract(DateTime.Now);\r
+                                               if((timeToDispose.Ticks < 0) ||                                                          // time to die\r
+                                                       (timeToDispose > connectionSettings.ConnectionLifeTime)) // messing with system clock\r
+                                               {\r
+                                                       connection.Dispose();\r
+                                                       openFreeConnections[connectionsUsableOffset] = null;\r
+                                                       connectionsOpen--;\r
+                                                       connectionsUsableOffset++;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                                       if(connectionsOpen > connectionsInUse)\r
+                                       {\r
+                                               connection = (DB2OpenConnection)openFreeConnections[connectionsUsableOffset];\r
+                                               timer.Change(timeToDispose, new TimeSpan(-1));\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               timer.Dispose();\r
+                                               timer = null;\r
+                                       }\r
+                               }\r
+                               if((connectionsUsableOffset > (openFreeConnections.Capacity / 2)) &&\r
+                                       (connectionsOpen > connectionsInUse))\r
+                               {\r
+                                       openFreeConnections.RemoveRange(0, connectionsUsableOffset); // cleanup once in a while\r
+                                       connectionsUsableOffset = 0;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               public void AddToFreeConnections(DB2OpenConnection connection)\r
+               {\r
+                       lock(openFreeConnections.SyncRoot)\r
+                       {\r
+                               connection.poolDisposalTime = DateTime.Now.Add(connectionSettings.ConnectionLifeTime);\r
+                               if(timer == null)\r
+                               {\r
+                                       timer = new Timer(new TimerCallback(DisposeTimedoutConnections), null, \r
+                                               connectionSettings.ConnectionLifeTime, new TimeSpan(-1));\r
+                               }\r
+                               connectionsInUse--;\r
+                               openFreeConnections.Add(connection);\r
+                       }\r
+               }\r
+\r
+               public void OpenConnectionFinalized()\r
+               {\r
+                       lock(openFreeConnections.SyncRoot)\r
+                       {\r
+                               connectionsOpen--;\r
+                               connectionsInUse--;\r
+                       }\r
+               }\r
+\r
+               /// <summary>\r
+               /// Find a specific connection pool\r
+               /// </summary>\r
+               /// <param name="connectionString"></param>\r
+               /// <returns></returns>\r
+               static public DB2ConnectionPool FindConnectionPool(string connectionString)\r
+               {\r
+                       return (DB2ConnectionPool)DB2Environment.Instance.connectionPools[connectionString];\r
+               }\r
+\r
+               /// <summary>\r
+               /// Get a connection pool. If it doesn't exist yet, create it\r
+               /// </summary>\r
+               /// <param name="connectionSettings"></param>\r
+               /// <returns></returns>\r
+               static public DB2ConnectionPool GetConnectionPool(DB2ConnectionSettings connectionSettings)\r
+               {\r
+                       DB2Environment environment = DB2Environment.Instance;\r
+\r
+                       lock(environment.connectionPools.SyncRoot)\r
+                       {\r
+                               DB2ConnectionPool pool = (DB2ConnectionPool)environment.connectionPools[connectionSettings.ConnectionString];\r
+                               if(pool == null)\r
+                               {\r
+                                       pool = new DB2ConnectionPool(connectionSettings);\r
+                                       environment.connectionPools.Add(connectionSettings.ConnectionString, pool);\r
+                               }\r
+                               return pool;\r
+                       }\r
+               }\r
+       }\r
+}\r
index 303a037fc62437a3e1621645148011cd98eadadc..607c6d3e1415fca6238000e7ce01312f6fe011e3 100755 (executable)
-using System;
-using System.Runtime.InteropServices;
-using System.Text;
-
-namespace IBM.Data.DB2
-{
-       internal sealed class DB2ConnectionSettings
-       {
-               private string   connectionString;
-               private string   userName = "";
-               private string   passWord = "";
-               private string   databaseAlias = "";
-               private string   server = "";
-               private bool     pooling = true;
-               private TimeSpan connectTimeout = new TimeSpan(0, 0, 15);
-               private TimeSpan connectionLifeTime = new TimeSpan(0, 0, 15);   // 15 seconds
-               private int              connectionPoolSizeMin = 0;
-               private int              connectionPoolSizeMax = -1;    // no maximum
-
-               private DB2ConnectionPool pool;
-
-               private DB2ConnectionSettings(string connectionString)
-               {
-                       this.connectionString = connectionString;
-                       this.Parse();
-               }
-
-               public static DB2ConnectionSettings GetConnectionSettings(string connectionString)
-               {
-                       DB2ConnectionPool pool = DB2ConnectionPool.FindConnectionPool(connectionString);
-                       if(pool != null)
-                       {
-                               return pool.ConnectionSettings;
-                       }
-                       DB2ConnectionSettings settings = new DB2ConnectionSettings(connectionString);
-                       if(settings.Pooling)
-                       {
-                               settings.pool = DB2ConnectionPool.GetConnectionPool(settings);
-                       }
-                       return settings;
-               }
-
-               public DB2OpenConnection GetRealOpenConnection(DB2Connection connection)
-               {
-                       if(pool != null)
-                       {
-                               return pool.GetOpenConnection(connection);
-                       }
-                       else
-                       {
-                               return new DB2OpenConnection(this, connection);
-                       }
-               }
-
-               public DB2ConnectionPool Pool
-               {
-                       get { return pool; }
-               }
-
-               public string ConnectionString
-               {
-                       get { return connectionString; }
-               }
-
-               public string UserName
-               {
-                       get { return userName; }
-               }
-               
-               public string PassWord
-               {
-                       get { return passWord; }
-               }
-
-               /// <summary>
-               /// database alias (for cataloged database)
-               /// </summary>
-               public string DatabaseAlias
-               {
-                       get { return databaseAlias; }
-               }
-
-               /// <summary>
-               /// server name with optional port number for direct connection (<server name/ip address>[:<port>])
-               /// </summary>
-               public string Server
-               {
-                       get { return server; }
-               }
-
-               public TimeSpan ConnectTimeout
-               {
-                       get { return connectTimeout; }
-               }
-
-               /// <summary>
-               /// Connection pooling yes/no
-               /// </summary>
-               public bool Pooling
-               {
-                       get { return pooling; }
-               }
-
-               public int ConnectionPoolSizeMin
-               {
-                       get { return connectionPoolSizeMin; }
-               }
-
-               public int ConnectionPoolSizeMax
-               {
-                       get { return connectionPoolSizeMin; }
-               }
-
-               public TimeSpan ConnectionLifeTime
-               {
-                       get { return connectionLifeTime; }
-               }
-
-
-               /// <summary>
-               /// parsed according to IBM DB2 .NET data provider help
-               /// </summary>
-               public void Parse()
-               {
-                       string[] parts = connectionString.Split(new char[]{';'});
-                       foreach(string part in parts)
-                       {
-                               string[] pairs = part.Split(new char[]{'='});
-                               switch(pairs[0].ToLower())
-                               {
-                                       case "database":
-                                       case "dsn":
-                                               databaseAlias = pairs[1];
-                                               break;
-                                       case "uid":
-                                       case "user id":
-                                               userName = pairs[1];
-                                               break;
-                                       case "pwd":
-                                       case "password":
-                                               passWord = pairs[1];
-                                               break;
-                                       case "server":
-                                               server = pairs[1];
-                                               break;
-                                       case "pooling":
-                                               pooling = (pairs[1].ToLower() == "true") || (pairs[1]== "1");
-                                               break;
-                                       case "connect timeout":
-                                       case "timeout":
-                                       case "connection timeout":
-                                               connectTimeout = new TimeSpan(0, 0, int.Parse(pairs[1]));
-                                               break;
-                                       case "min pool size":
-                                               connectionPoolSizeMin = int.Parse(pairs[1]);
-                                               break;
-                                       case "max pool size":
-                                               connectionPoolSizeMax = int.Parse(pairs[1]);
-                                               break;
-                                       case "connection lifetime":
-                                               connectionLifeTime = new TimeSpan(0, 0, int.Parse(pairs[1]));
-                                               break;
-                               }
-                       }
-                       if(connectionLifeTime.Ticks <= 0)
-                       {
-                               pooling = false;
-                       }
-               }
-       
-               public override int GetHashCode()
-               {
-                       return connectionString.GetHashCode ();
-               }
-       
-               public override bool Equals(object obj)
-               {
-                       return connectionString.Equals (obj);
-               }
-       }
-}
+using System;\r
+using System.Runtime.InteropServices;\r
+using System.Text;\r
+\r
+namespace IBM.Data.DB2\r
+{\r
+       internal sealed class DB2ConnectionSettings\r
+       {\r
+               private string   connectionString;\r
+               private string   userName = "";\r
+               private string   passWord = "";\r
+               private string   databaseAlias = "";\r
+               private string   server = "";\r
+               private bool     pooling = true;\r
+               private TimeSpan connectTimeout = new TimeSpan(0, 0, 15);\r
+               private TimeSpan connectionLifeTime = new TimeSpan(0, 0, 15);   // 15 seconds\r
+               private int              connectionPoolSizeMin = 0;\r
+               private int              connectionPoolSizeMax = -1;    // no maximum\r
+\r
+               private DB2ConnectionPool pool;\r
+\r
+               private DB2ConnectionSettings(string connectionString)\r
+               {\r
+                       this.connectionString = connectionString;\r
+                       this.Parse();\r
+               }\r
+\r
+               public static DB2ConnectionSettings GetConnectionSettings(string connectionString)\r
+               {\r
+                       DB2ConnectionPool pool = DB2ConnectionPool.FindConnectionPool(connectionString);\r
+                       if(pool != null)\r
+                       {\r
+                               return pool.ConnectionSettings;\r
+                       }\r
+                       DB2ConnectionSettings settings = new DB2ConnectionSettings(connectionString);\r
+                       if(settings.Pooling)\r
+                       {\r
+                               settings.pool = DB2ConnectionPool.GetConnectionPool(settings);\r
+                       }\r
+                       return settings;\r
+               }\r
+\r
+               public DB2OpenConnection GetRealOpenConnection(DB2Connection connection)\r
+               {\r
+                       if(pool != null)\r
+                       {\r
+                               return pool.GetOpenConnection(connection);\r
+                       }\r
+                       else\r
+                       {\r
+                               return new DB2OpenConnection(this, connection);\r
+                       }\r
+               }\r
+\r
+               public DB2ConnectionPool Pool\r
+               {\r
+                       get { return pool; }\r
+               }\r
+\r
+               public string ConnectionString\r
+               {\r
+                       get { return connectionString; }\r
+               }\r
+\r
+               public string UserName\r
+               {\r
+                       get { return userName; }\r
+               }\r
+               \r
+               public string PassWord\r
+               {\r
+                       get { return passWord; }\r
+               }\r
+\r
+               /// <summary>\r
+               /// database alias (for cataloged database)\r
+               /// </summary>\r
+               public string DatabaseAlias\r
+               {\r
+                       get { return databaseAlias; }\r
+               }\r
+\r
+               /// <summary>\r
+               /// server name with optional port number for direct connection (<server name/ip address>[:<port>])\r
+               /// </summary>\r
+               public string Server\r
+               {\r
+                       get { return server; }\r
+               }\r
+\r
+               public TimeSpan ConnectTimeout\r
+               {\r
+                       get { return connectTimeout; }\r
+               }\r
+\r
+               /// <summary>\r
+               /// Connection pooling yes/no\r
+               /// </summary>\r
+               public bool Pooling\r
+               {\r
+                       get { return pooling; }\r
+               }\r
+\r
+               public int ConnectionPoolSizeMin\r
+               {\r
+                       get { return connectionPoolSizeMin; }\r
+               }\r
+\r
+               public int ConnectionPoolSizeMax\r
+               {\r
+                       get { return connectionPoolSizeMin; }\r
+               }\r
+\r
+               public TimeSpan ConnectionLifeTime\r
+               {\r
+                       get { return connectionLifeTime; }\r
+               }\r
+\r
+\r
+               /// <summary>\r
+               /// parsed according to IBM DB2 .NET data provider help\r
+               /// </summary>\r
+               public void Parse()\r
+               {\r
+                       string[] parts = connectionString.Split(new char[]{';'});\r
+                       foreach(string part in parts)\r
+                       {\r
+                               string[] pairs = part.Split(new char[]{'='});\r
+                               switch(pairs[0].ToLower())\r
+                               {\r
+                                       case "database":\r
+                                       case "dsn":\r
+                                               databaseAlias = pairs[1];\r
+                                               break;\r
+                                       case "uid":\r
+                                       case "user id":\r
+                                               userName = pairs[1];\r
+                                               break;\r
+                                       case "pwd":\r
+                                       case "password":\r
+                                               passWord = pairs[1];\r
+                                               break;\r
+                                       case "server":\r
+                                               server = pairs[1];\r
+                                               break;\r
+                                       case "pooling":\r
+                                               pooling = (pairs[1].ToLower() == "true") || (pairs[1]== "1");\r
+                                               break;\r
+                                       case "connect timeout":\r
+                                       case "timeout":\r
+                                       case "connection timeout":\r
+                                               connectTimeout = new TimeSpan(0, 0, int.Parse(pairs[1]));\r
+                                               break;\r
+                                       case "min pool size":\r
+                                               connectionPoolSizeMin = int.Parse(pairs[1]);\r
+                                               break;\r
+                                       case "max pool size":\r
+                                               connectionPoolSizeMax = int.Parse(pairs[1]);\r
+                                               break;\r
+                                       case "connection lifetime":\r
+                                               connectionLifeTime = new TimeSpan(0, 0, int.Parse(pairs[1]));\r
+                                               break;\r
+                               }\r
+                       }\r
+                       if(connectionLifeTime.Ticks <= 0)\r
+                       {\r
+                               pooling = false;\r
+                       }\r
+               }\r
+       \r
+               public override int GetHashCode()\r
+               {\r
+                       return connectionString.GetHashCode ();\r
+               }\r
+       \r
+               public override bool Equals(object obj)\r
+               {\r
+                       return connectionString.Equals (obj);\r
+               }\r
+       }\r
+}\r
index d1ce469950a345a7ad3a64fe4de4ed2990916f30..edc7cbca306bf29d9e3f8dc8710e096397a7ce6f 100755 (executable)
@@ -57,6 +57,12 @@ namespace IBM.Data.DB2
                public const int  SQL_ATTR_MAX_ROWS             = 1;\r
                public const int  SQL_ATTR_DEFERRED_PREPARE = 1277;\r
 \r
+               /*Used for batch operations*/\r
+               public const int  SQL_ATTR_PARAMSET_SIZE = 22;\r
+               public const int  SQL_ATTR_PARAM_STATUS_PTR = 20;\r
+               public const int  SQL_ATTR_PARAMS_PROCESSED_PTR = 21;\r
+               public const int SQL_ATTR_PARAM_BIND_TYPE           = 18;\r
+\r
                public const int  SQL_IS_POINTER        = -4;\r
                public const int  SQL_IS_UINTEGER       = -5;\r
                public const int  SQL_IS_INTEGER        = -6;\r
@@ -141,6 +147,8 @@ namespace IBM.Data.DB2
                public const int  SQL_NULLABLE                  = 1;\r
                public const int  SQL_NULLABLE_UNKNOWN  = 2;\r
 \r
+               public const int SQL_PARAM_BIND_BY_COLUMN    = 0;\r
+\r
                /* Defines for SQLBindParameter and SQLProcedureColumns */\r
                public const int SQL_PARAM_TYPE_UNKNOWN = 0;\r
                public const int SQL_PARAM_INPUT                = 1;\r
diff --git a/mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2DataAdapter.cs b/mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2DataAdapter.cs
new file mode 100755 (executable)
index 0000000..ea3c366
--- /dev/null
@@ -0,0 +1,163 @@
+using System;
+using System.ComponentModel;
+using System.Data;
+using System.Data.Common;
+
+namespace IBM.Data.DB2 {
+       
+       public sealed class DB2DataAdapter : DbDataAdapter, IDbDataAdapter 
+       {
+               #region Fields
+
+               bool disposed = false;  
+               DB2Command deleteCommand;
+               DB2Command insertCommand;
+               DB2Command selectCommand;
+               DB2Command updateCommand;
+
+               #endregion
+
+               #region Constructors
+               
+               public DB2DataAdapter ()        
+                       : this (new DB2Command ())
+               {
+               }
+
+               public DB2DataAdapter (DB2Command selectCommand) 
+               {
+                       DeleteCommand = null;
+                       InsertCommand = null;
+                       SelectCommand = selectCommand;
+                       UpdateCommand = null;
+               }
+
+               public DB2DataAdapter (string selectCommandText, DB2Connection selectConnection) 
+                       : this (new DB2Command (selectCommandText, selectConnection))
+               { 
+               }
+
+               public DB2DataAdapter (string selectCommandText, string selectConnectionString)
+                       : this (selectCommandText, new DB2Connection (selectConnectionString))
+               {
+               }
+
+               #endregion
+
+               #region Properties
+
+
+               public DB2Command DeleteCommand {
+                       get { return deleteCommand; }
+                       set { deleteCommand = value; }
+               }
+
+
+               public DB2Command InsertCommand {
+                       get { return insertCommand; }
+                       set { insertCommand = value; }
+               }
+
+
+               public DB2Command SelectCommand {
+                       get { return selectCommand; }
+                       set { selectCommand = value; }
+               }
+
+
+               public DB2Command UpdateCommand {
+                       get { return updateCommand; }
+                       set { updateCommand = value; }
+               }
+
+               IDbCommand IDbDataAdapter.DeleteCommand {
+                       get { return DeleteCommand; }
+                       set { 
+                               if (!(value is DB2Command)) 
+                                       throw new ArgumentException ();
+                               DeleteCommand = (DB2Command)value;
+                       }
+               }
+
+               IDbCommand IDbDataAdapter.InsertCommand {
+                       get { return InsertCommand; }
+                       set { 
+                               if (!(value is DB2Command)) 
+                                       throw new ArgumentException ();
+                               InsertCommand = (DB2Command)value;
+                       }
+               }
+
+               IDbCommand IDbDataAdapter.SelectCommand {
+                       get { return SelectCommand; }
+                       set { 
+                               if (!(value is DB2Command)) 
+                                       throw new ArgumentException ();
+                               SelectCommand = (DB2Command)value;
+                       }
+               }
+
+               IDbCommand IDbDataAdapter.UpdateCommand {
+                       get { return UpdateCommand; }
+                       set { 
+                               if (!(value is DB2Command)) 
+                                       throw new ArgumentException ();
+                               UpdateCommand = (DB2Command)value;
+                       }
+               }
+
+
+               ITableMappingCollection IDataAdapter.TableMappings {
+                       get { return TableMappings; }
+               }
+
+               #endregion 
+
+               #region Methods
+
+               protected override RowUpdatedEventArgs CreateRowUpdatedEvent (DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) 
+               {
+                       return new DB2RowUpdatedEventArgs (dataRow, command, statementType, tableMapping);
+               }
+
+
+               protected override RowUpdatingEventArgs CreateRowUpdatingEvent (DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) 
+               {
+                       return new DB2RowUpdatingEventArgs (dataRow, command, statementType, tableMapping);
+               }
+
+               protected override void Dispose (bool disposing)
+               {
+                       if (!disposed) {
+                               if (disposing) {
+                                       
+                               }
+                               
+                               disposed = true;
+                       }
+               }
+
+               protected override void OnRowUpdated (RowUpdatedEventArgs value) 
+               {
+                       if (RowUpdated != null)
+                               RowUpdated (this, (DB2RowUpdatedEventArgs) value);
+               }
+
+               protected override void OnRowUpdating (RowUpdatingEventArgs value) 
+               {
+                       if (RowUpdating != null)
+                               RowUpdating (this, (DB2RowUpdatingEventArgs) value);
+               }
+
+               #endregion 
+
+               #region Events and Delegates
+
+               public event DB2RowUpdatedEventHandler RowUpdated;
+
+               public event DB2RowUpdatingEventHandler RowUpdating;
+
+               #endregion 
+
+       }
+}
index 7014c5233b7b8fb18c0403301149568d027c2e70..3c905b1ee237b7ae121c24ee1c975858244e25db 100755 (executable)
@@ -13,65 +13,65 @@ namespace IBM.Data.DB2
        /// </summary>
        public sealed class DB2DataReader : MarshalByRefObject, IDataReader
        {
-               private struct ColumnInfo
-               {
-                       public string   Colname;
-                       public int              Sqltype;
+               private struct ColumnInfo\r
+               {\r
+                       public string   Colname;\r
+                       public int              Sqltype;\r
                }
 
-               private object[] _resultSet;
-               private ColumnInfo[] columnInfo;
-               private Hashtable columnsNames;
-               private const int internalBufferSize = 100;
-               private IntPtr internalBuffer;
-               internal DB2Connection db2Conn; 
-               internal DB2Command db2Comm; 
-               internal IntPtr hwndStmt;
-               private int recordsAffected;
-               private bool hasData;
-               private int fieldCount = -1;
-               private CommandBehavior behavior;
-               private bool hasRows;
-               private bool skipReadOnce;
+               private object[] _resultSet;\r
+               private ColumnInfo[] columnInfo;\r
+               private Hashtable columnsNames;\r
+               private const int internalBufferSize = 100;\r
+               private IntPtr internalBuffer;\r
+               internal DB2Connection db2Conn; \r
+               internal DB2Command db2Comm; \r
+               internal IntPtr hwndStmt;\r
+               private int recordsAffected;\r
+               private bool hasData = false;\r
+               private int fieldCount = -1;\r
+               private CommandBehavior behavior;\r
+               private bool hasRows;\r
+               private bool skipReadOnce;\r
        
                
-               #region Constructors and destructors
-               /// <summary>
-               /// 
-               /// </summary>
-               /// <param name="con"></Connection object to Db2>
-               /// <param name="com"></Command object>
-               internal DB2DataReader(DB2Connection con, DB2Command com, CommandBehavior behavior)
-               {
-                       db2Conn = con;
-                       db2Comm = com;
-                       this.behavior = behavior;
-                       hwndStmt = com.statementHandle;    //We have access to the results through the statement handle
-                       
-                       _resultSet = null;
-                       
-                       GetFieldCountAndAffectedRows();
-                       internalBuffer = Marshal.AllocHGlobal(internalBufferSize);
-
-                       isClosed = false;
-               }
-
-               #endregion
-
-               private void GetFieldCountAndAffectedRows()
-               {
-                       short sqlRet;
-                       recordsAffected = -1;
-                       if((behavior & CommandBehavior.SchemaOnly) == 0)
-                       {
-                               //How many rows affected.  numRows will be -1 if we aren't dealing with an Insert, Delete or Update, or if the statement did not execute successfully
-                               sqlRet = DB2CLIWrapper.SQLRowCount(hwndStmt, out recordsAffected);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLExecDirect error.", db2Conn);
-                       }                       
-                       short colCount;
-                       sqlRet = DB2CLIWrapper.SQLNumResultCols(hwndStmt, out colCount);
-                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "DB2ClientDataReader - SQLNumResultCols", db2Conn);
-                       fieldCount = colCount;
+               #region Constructors and destructors\r
+               /// <summary>\r
+               /// \r
+               /// </summary>\r
+               /// <param name="con"></Connection object to Db2>\r
+               /// <param name="com"></Command object>\r
+               internal DB2DataReader(DB2Connection con, DB2Command com, CommandBehavior behavior)\r
+               {\r
+                       db2Conn = con;\r
+                       db2Comm = com;\r
+                       this.behavior = behavior;\r
+                       hwndStmt = com.statementHandle;    //We have access to the results through the statement handle\r
+                       \r
+                       _resultSet = null;\r
+                       \r
+                       GetFieldCountAndAffectedRows();\r
+                       internalBuffer = Marshal.AllocHGlobal(internalBufferSize);\r
+\r
+                       isClosed = false;\r
+               }\r
+\r
+               #endregion\r
+
+               private void GetFieldCountAndAffectedRows()\r
+               {\r
+                       short sqlRet;\r
+                       recordsAffected = -1;\r
+                       if((behavior & CommandBehavior.SchemaOnly) == 0)\r
+                       {\r
+                               //How many rows affected.  numRows will be -1 if we aren't dealing with an Insert, Delete or Update, or if the statement did not execute successfully\r
+                               sqlRet = DB2CLIWrapper.SQLRowCount(hwndStmt, out recordsAffected);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "SQLExecDirect error.", db2Conn);\r
+                       }                       \r
+                       short colCount;\r
+                       sqlRet = DB2CLIWrapper.SQLNumResultCols(hwndStmt, out colCount);\r
+                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "DB2ClientDataReader - SQLNumResultCols", db2Conn);\r
+                       fieldCount = colCount;\r
                }
 
                #region Properties
@@ -86,9 +86,9 @@ namespace IBM.Data.DB2
                {
                        get
                        {
-                               if(isClosed)
-                               {
-                                       throw new InvalidOperationException("Reader is closed");
+                               if(isClosed)\r
+                               {\r
+                                       throw new InvalidOperationException("Reader is closed");\r
                                }
                                return depth;
                        }
@@ -130,335 +130,332 @@ namespace IBM.Data.DB2
 
 
 
-               #region Close method
-
-               public void Close()
-               {
-                       Dispose();
-               }
-
-               public void Dispose()
-               {
-                       Dispose(true);
-                       GC.SuppressFinalize(this);
-               }
-
-               void Dispose(bool disposing)
-               {
-                       if(!isClosed) 
-                       {
-                               if(disposing)
-                               {
-                                       short sqlRet;
-                                       do
-                                       {
-                                               sqlRet = DB2CLIWrapper.SQLMoreResults(this.hwndStmt);
-                                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Db2ClientDataReader - SQLMoreResults", db2Conn);
-                                       } while(sqlRet != DB2Constants.SQL_NO_DATA_FOUND);
-
-                                       _resultSet = null;
-                                       hasData = false;
-                                       isClosed=true;
-
-                                       if(db2Comm != null)
-                                       {
-                                               db2Comm.DataReaderClosed();
-                                               db2Comm = null;
-                                       }
-                               }
-                               Marshal.FreeHGlobal(internalBuffer);
-                       }
-                       isClosed = true;
-               }
-
-               ~DB2DataReader()
-               {
-                       Dispose(false);
-               }
-
+               #region Close method\r
+\r
+               public void Close()\r
+               {\r
+                       Dispose();\r
+               }\r
+\r
+               public void Dispose()\r
+               {\r
+                       Dispose(true);\r
+                       GC.SuppressFinalize(this);\r
+               }\r
+\r
+               void Dispose(bool disposing)\r
+               {\r
+                       if(!isClosed) \r
+                       {\r
+                               if(disposing)\r
+                               {\r
+                                       short sqlRet;\r
+                                       do\r
+                                       {\r
+                                               sqlRet = DB2CLIWrapper.SQLMoreResults(this.hwndStmt);\r
+                                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Db2ClientDataReader - SQLMoreResults", db2Conn);\r
+                                       } while(sqlRet != DB2Constants.SQL_NO_DATA_FOUND);\r
+\r
+                                       _resultSet = null;\r
+                                       hasData = false;\r
+                                       isClosed=true;\r
+\r
+                                       if(db2Comm != null)\r
+                                       {\r
+                                               db2Comm.DataReaderClosed();\r
+                                               db2Comm = null;\r
+                                       }\r
+                               }\r
+                               Marshal.FreeHGlobal(internalBuffer);\r
+                       }\r
+                       isClosed = true;\r
+               }\r
+\r
+               ~DB2DataReader()\r
+               {\r
+                       Dispose(false);\r
+               }\r
+\r
                #endregion
 
                #region GetSchemaTable 
 
-               public DataTable GetSchemaTable()
-               {
-                       if(isClosed)
-                       {
-                               throw new InvalidOperationException("No data exists for the row/column.");
-                       }
-
-                       DataTable _schemaTable = BuildNewSchemaTable();
-                       
-                       short sqlRet;
-                       IntPtr ptrCharacterAttribute = IntPtr.Zero;
-                       InitMem(256, ref ptrCharacterAttribute);
-                       short buflen = 256;
-                       short strlen = 256;
-                       int numericattr = 0;
-                       int colsize;
-                       string colname;
-                       int sqltype;
-                       int precision;
-                       int scale;
-                       int nullable;
-                       int updatable;
-                       int isautoincrement;
-                       string baseschemaname;
-                       //string basecatalogname;
-                       string basetablename;
-                       string basecolumnname;
-
-                       string previousTableName = null;
-                       string previousSchemaName = null;
-                       bool differentTablesUsed = false;
-
-                       for (short i=1; i<=fieldCount; i++) 
-                       {
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_COLUMN_NAME, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               colname = Marshal.PtrToStringUni(ptrCharacterAttribute);
-                               
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_CONCISE_TYPE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               sqltype = numericattr;
-                               
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_OCTET_LENGTH, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               colsize = numericattr;
-                               
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_PRECISION, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               precision = numericattr;
-                               
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_SCALE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               scale = numericattr;
-
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_NULLABLE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               nullable = numericattr;
-
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_UPDATABLE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               updatable = numericattr;
-                               
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_AUTO_UNIQUE_VALUE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               isautoincrement = numericattr;
-                               
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_BASE_COLUMN_NAME, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               basecolumnname = Marshal.PtrToStringUni(ptrCharacterAttribute);
-
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_BASE_TABLE_NAME, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               basetablename = Marshal.PtrToStringUni(ptrCharacterAttribute);
-                               
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_SCHEMA_NAME, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);
-                               baseschemaname = Marshal.PtrToStringUni(ptrCharacterAttribute);
-                               DataRow r = _schemaTable.NewRow();
-                               
-                               
-                               r["ColumnName"] = colname;
-                               r["ColumnOrdinal"] = i - 1;
-                               r["ColumnSize"] = colsize;
-                               r["NumericPrecision"] = precision;
-                               r["NumericScale"] = scale;
-                               r["DataType"] = GetManagedType((short)sqltype);
-                               r["ProviderType"] = sqltype;
-                               r["IsLong"] = IsLong((short)sqltype);
-                               r["AllowDBNull"] = (nullable==0) ? false : true;
-                               r["IsReadOnly"] = (basecolumnname == null) || (basecolumnname == "");
-                               r["IsRowVersion"] = false;
-                               r["IsUnique"] = false;
-                               r["IsKeyColumn"] = false;
-                               r["IsAutoIncrement"] = (isautoincrement==0) ? false : true;
-                               r["BaseSchemaName"] = baseschemaname;
-                               r["BaseCatalogName"] = "";
-                               r["BaseTableName"] = basetablename;
-                               r["BaseColumnName"] = basecolumnname;
-                               
-                               
-                               _schemaTable.Rows.Add(r);
-                               
-
-                               if(!differentTablesUsed)
-                               {
-                                       if(((previousSchemaName == baseschemaname) && (previousTableName == basetablename)) || 
-                                               (previousTableName == null))
-                                       {
-                                               previousTableName = basetablename;
-                                               previousSchemaName = baseschemaname;
-                                       }
-                                       else
-                                       {
-                                               differentTablesUsed = true;
-                                       }
-                               }
-                       }
-                       if(!differentTablesUsed && 
-                               ((behavior & CommandBehavior.KeyInfo) != 0) &&
-                               (db2Comm.Transaction == null) &&
-                               (previousTableName != null) &&
-                               (previousTableName != ""))
-                       {
-                               DB2Command schemaInfoCommand = db2Conn.CreateCommand();
-                               schemaInfoCommand.CommandText = 
-                                       "select concat(concat(INDSCHEMA,'.'),INDNAME), COLNAMES, UNIQUERULE from syscat.INDEXES " +
-                                       "where TABSCHEMA=? and TABNAME=? and uniquerule in ('P','U') order by UNIQUERULE";
-                               schemaInfoCommand.Parameters.Add("TABSCHEMA", previousSchemaName);
-                               schemaInfoCommand.Parameters.Add("TABNAME", previousTableName);
-                               using(DB2DataReader reader = schemaInfoCommand.ExecuteReader())
-                               {
-                                       bool keyColumnSet = false;
-                                       while(reader.Read())
-                                       {
-                                               string indexName = reader.GetString(0);
-                                               string[] indexColumns = reader.GetString(1).TrimStart('-', '+').Split('-', '+');
-                                               bool primary = reader.GetString(2) == "P";
-
-                                               bool allColumnsFound = true;
-                                               for(int i= 0; i < indexColumns.Length; i++)
-                                               {
-                                                       int ordinal = FieldNameLookup(_schemaTable, indexColumns[i]);
-                                                       if(ordinal < 0)
-                                                       {
-                                                               allColumnsFound = false;
-                                                               break;
-                                                       }
-                                                       if(indexColumns.Length == 1)
-                                                               _schemaTable.Rows[ordinal]["IsUnique"] = true;
-                                               }
-                                               if(allColumnsFound && !keyColumnSet)
-                                               {
-                                                       for(int i= 0; i < indexColumns.Length; i++)
-                                                               _schemaTable.Rows[FieldNameLookup(_schemaTable, indexColumns[i])]["IsKeyColumn"] = true;
-                                                       keyColumnSet = true;
-                                               }
-                                       }
-                               }
-                               if(db2Conn.openConnection.MajorVersion >= 8)
-                               {
-                                       try
-                                       {
-                                               schemaInfoCommand.CommandText = 
-                                                       "select COLNAME from SYSCAT.COLIDENTATTRIBUTES where TABSCHEMA=? and TABNAME=?";
-                                               using(DB2DataReader reader = schemaInfoCommand.ExecuteReader())
-                                               {
-                                                       while(reader.Read())
-                                                       {
-                                                               string columnName = reader.GetString(0);
-
-                                                               int ordinal = FieldNameLookup(_schemaTable, columnName);
-                                                               if(ordinal >= 0)
-                                                                       _schemaTable.Rows[ordinal]["IsAutoIncrement"] = true;
-                                                       }
-                                               }
-                                       }
-                                       catch{}
-                               }
-                       }
-                       return _schemaTable;
+               public DataTable GetSchemaTable()\r
+               {\r
+                       if(isClosed)\r
+                       {\r
+                               throw new InvalidOperationException("No data exists for the row/column.");\r
+                       }\r
+\r
+                       DataTable _schemaTable = BuildNewSchemaTable();\r
+                       \r
+                       short sqlRet;\r
+                       IntPtr ptrCharacterAttribute = IntPtr.Zero;\r
+                       InitMem(256, ref ptrCharacterAttribute);\r
+                       short buflen = 256;\r
+                       short strlen = 256;\r
+                       int numericattr = 0;\r
+                       int colsize;\r
+                       string colname;\r
+                       int sqltype;\r
+                       int precision;\r
+                       int scale;\r
+                       int nullable;\r
+                       int updatable;\r
+                       int isautoincrement;\r
+                       string baseschemaname;\r
+                       //string basecatalogname;\r
+                       string basetablename;\r
+                       string basecolumnname;\r
+\r
+                       string previousTableName = null;\r
+                       string previousSchemaName = null;\r
+                       bool differentTablesUsed = false;\r
+\r
+                       for (short i=1; i<=fieldCount; i++) \r
+                       {\r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_COLUMN_NAME, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               colname = Marshal.PtrToStringUni(ptrCharacterAttribute);\r
+                               \r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_CONCISE_TYPE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               sqltype = numericattr;\r
+                               \r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_OCTET_LENGTH, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               colsize = numericattr;\r
+                               \r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_PRECISION, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               precision = numericattr;\r
+                               \r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_SCALE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               scale = numericattr;\r
+\r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_NULLABLE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               nullable = numericattr;\r
+\r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_UPDATABLE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               updatable = numericattr;\r
+                               \r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_AUTO_UNIQUE_VALUE, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               isautoincrement = numericattr;\r
+                               \r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_BASE_COLUMN_NAME, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               basecolumnname = Marshal.PtrToStringUni(ptrCharacterAttribute);\r
+\r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_BASE_TABLE_NAME, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               basetablename = Marshal.PtrToStringUni(ptrCharacterAttribute);\r
+                               \r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)i, (short)DB2Constants.SQL_DESC_SCHEMA_NAME, ptrCharacterAttribute, buflen, ref strlen, ref numericattr);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable", db2Conn);\r
+                               baseschemaname = Marshal.PtrToStringUni(ptrCharacterAttribute);\r
+                               DataRow r = _schemaTable.NewRow();\r
+                               \r
+                               r["ColumnName"] = colname;\r
+                               r["ColumnOrdinal"] = i - 1;\r
+                               r["ColumnSize"] = colsize;\r
+                               r["NumericPrecision"] = precision;\r
+                               r["NumericScale"] = scale;\r
+                               r["DataType"] = GetManagedType((short)sqltype);\r
+                               r["ProviderType"] = sqltype;\r
+                               r["IsLong"] = IsLong((short)sqltype);\r
+                               r["AllowDBNull"] = (nullable==0) ? false : true;\r
+                               r["IsReadOnly"] = (basecolumnname == null) || (basecolumnname == "");\r
+                               r["IsRowVersion"] = false;\r
+                               r["IsUnique"] = false;\r
+                               r["IsKeyColumn"] = false;\r
+                               r["IsAutoIncrement"] = (isautoincrement==0) ? false : true;\r
+                               r["BaseSchemaName"] = baseschemaname;\r
+                               r["BaseCatalogName"] = "";\r
+                               r["BaseTableName"] = basetablename;\r
+                               r["BaseColumnName"] = basecolumnname;\r
+                               \r
+                               _schemaTable.Rows.Add(r);\r
+\r
+                               if(!differentTablesUsed)\r
+                               {\r
+                                       if(((previousSchemaName == baseschemaname) && (previousTableName == basetablename)) || \r
+                                               (previousTableName == null))\r
+                                       {\r
+                                               previousTableName = basetablename;\r
+                                               previousSchemaName = baseschemaname;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               differentTablesUsed = true;\r
+                                       }\r
+                               }\r
+                       }\r
+                       if(!differentTablesUsed && \r
+                               ((behavior & CommandBehavior.KeyInfo) != 0) &&\r
+                               (db2Comm.Transaction == null) &&\r
+                               (previousTableName != null) &&\r
+                               (previousTableName != ""))\r
+                       {\r
+                               DB2Command schemaInfoCommand = db2Conn.CreateCommand();\r
+                               schemaInfoCommand.CommandText = \r
+                                       "select concat(concat(INDSCHEMA,'.'),INDNAME), COLNAMES, UNIQUERULE from syscat.INDEXES " +\r
+                                       "where TABSCHEMA=? and TABNAME=? and uniquerule in ('P','U') order by UNIQUERULE";\r
+                               schemaInfoCommand.Parameters.Add("TABSCHEMA", previousSchemaName);\r
+                               schemaInfoCommand.Parameters.Add("TABNAME", previousTableName);\r
+                               using(DB2DataReader reader = schemaInfoCommand.ExecuteReader())\r
+                               {\r
+                                       bool keyColumnSet = false;\r
+                                       while(reader.Read())\r
+                                       {\r
+                                               string indexName = reader.GetString(0);\r
+                                               string[] indexColumns = reader.GetString(1).TrimStart('-', '+').Split('-', '+');\r
+                                               bool primary = reader.GetString(2) == "P";\r
+\r
+                                               bool allColumnsFound = true;\r
+                                               for(int i= 0; i < indexColumns.Length; i++)\r
+                                               {\r
+                                                       int ordinal = FieldNameLookup(_schemaTable, indexColumns[i]);\r
+                                                       if(ordinal < 0)\r
+                                                       {\r
+                                                               allColumnsFound = false;\r
+                                                               break;\r
+                                                       }\r
+                                                       if(indexColumns.Length == 1)\r
+                                                               _schemaTable.Rows[ordinal]["IsUnique"] = true;\r
+                                               }\r
+                                               if(allColumnsFound && !keyColumnSet)\r
+                                               {\r
+                                                       for(int i= 0; i < indexColumns.Length; i++)\r
+                                                               _schemaTable.Rows[FieldNameLookup(_schemaTable, indexColumns[i])]["IsKeyColumn"] = true;\r
+                                                       keyColumnSet = true;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               if(db2Conn.openConnection.MajorVersion >= 8)\r
+                               {\r
+                                       try\r
+                                       {\r
+                                               schemaInfoCommand.CommandText = \r
+                                                       "select COLNAME from SYSCAT.COLIDENTATTRIBUTES where TABSCHEMA=? and TABNAME=?";\r
+                                               using(DB2DataReader reader = schemaInfoCommand.ExecuteReader())\r
+                                               {\r
+                                                       while(reader.Read())\r
+                                                       {\r
+                                                               string columnName = reader.GetString(0);\r
+\r
+                                                               int ordinal = FieldNameLookup(_schemaTable, columnName);\r
+                                                               if(ordinal >= 0)\r
+                                                                       _schemaTable.Rows[ordinal]["IsAutoIncrement"] = true;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       catch{}\r
+                               }\r
+                       }\r
+                       return _schemaTable;\r
                }
                #endregion
 
                #region NextResult 
 
-               public bool NextResult()
-               {
-                       hasRows = false;
-                       skipReadOnce = false;
-                       hasData = false;
-                       columnInfo = null;
-                       _resultSet = null;
-               
-                       if((behavior & (CommandBehavior.SchemaOnly | CommandBehavior.SingleResult)) != 0)
-                               return false;
-
-                       short sqlRet = DB2CLIWrapper.SQLMoreResults(this.hwndStmt);
-                       if(sqlRet == DB2Constants.SQL_NO_DATA_FOUND) 
-                               return false;
-                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Db2ClientDataReader - SQLMoreResults", db2Conn);
-                       return true;
+               public bool NextResult()\r
+               {\r
+                       hasRows = false;\r
+                       skipReadOnce = false;\r
+                       hasData = false;\r
+                       columnInfo = null;\r
+                       _resultSet = null;\r
+               \r
+                       if((behavior & (CommandBehavior.SchemaOnly | CommandBehavior.SingleResult)) != 0)\r
+                               return false;\r
+\r
+                       short sqlRet = DB2CLIWrapper.SQLMoreResults(this.hwndStmt);\r
+                       if(sqlRet == DB2Constants.SQL_NO_DATA_FOUND) \r
+                               return false;\r
+                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "Db2ClientDataReader - SQLMoreResults", db2Conn);\r
+                       return true;\r
                }
                #endregion
 
                #region Read
 
-#if !NET_1_0
-               public bool HasRows
-               {
-                       get
-                       {
-                               if(hasData)
-                                       return true;
-
-                               hasRows = Read();
-                               hasData = false;
-                               skipReadOnce = true;
-                               return hasRows;
-                       }
-               }
+#if !NET_1_0\r
+               public bool HasRows\r
+               {\r
+                       get\r
+                       {\r
+                               if(hasData)\r
+                                       return true;\r
+\r
+                               hasRows = Read();\r
+                               hasData = false;\r
+                               skipReadOnce = true;\r
+                               return hasRows;\r
+                       }\r
+               }\r
 #endif
 
-               public bool Read()
-               {
-                       if (isClosed)
-                               throw new InvalidOperationException("Reader is closed");
-                       if((behavior & CommandBehavior.SchemaOnly) != 0)
-                               return false;
-
-                       if(skipReadOnce)
-                       {
-                               skipReadOnce = false;
-                               hasData = hasRows;
-                               return hasRows;
-                       }
-
-                       _resultSet = null;
-                       hasData = false;
-
-                       short sqlRet = DB2CLIWrapper.SQLFetch(hwndStmt);
-                       if(sqlRet == DB2Constants.SQL_NO_DATA_FOUND)
-                               return false;
-                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "DB2ClientDataReader - SQLFetch 1", db2Conn);
-
-                       hasData = true;
-                       return true;
+               public bool Read()\r
+               {\r
+                       if (isClosed)\r
+                               throw new InvalidOperationException("Reader is closed");\r
+                       if((behavior & CommandBehavior.SchemaOnly) != 0)\r
+                               return false;\r
+\r
+                       if(skipReadOnce)\r
+                       {\r
+                               skipReadOnce = false;\r
+                               hasData = hasRows;\r
+                               return hasRows;\r
+                       }\r
+\r
+                       _resultSet = null;\r
+                       hasData = false;\r
+\r
+                       short sqlRet = DB2CLIWrapper.SQLFetch(hwndStmt);\r
+                       if(sqlRet == DB2Constants.SQL_NO_DATA_FOUND)\r
+                               return false;\r
+                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "DB2ClientDataReader - SQLFetch 1", db2Conn);\r
+\r
+                       hasData = true;\r
+                       return true;\r
                }
                #endregion
 
                #region GetColumnInfo
-               private void GetColumnInfo()
-               {
-                       if(isClosed)
-                               throw new InvalidOperationException("Reader is closed");
-                       if(fieldCount <= 0)
-                               throw new InvalidOperationException("No Fields found"); // TODO: check error
-                       if(columnInfo != null)
-                               return;
-               
-                       columnInfo = new ColumnInfo[fieldCount];
-                       columnsNames = new Hashtable(fieldCount);
-                       
-                       StringBuilder sb = new StringBuilder(400);
-                       for(int i = 0; i < columnInfo.Length; i++)
-                       {
-                               short sqlRet;
-                               short strlen;
-                               int numericAttribute;
-
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)(i + 1), (short)DB2Constants.SQL_DESC_BASE_COLUMN_NAME, sb, (short)sb.Capacity, out strlen, out numericAttribute);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable");
-                               columnInfo[i].Colname = sb.ToString();
-                               columnsNames[columnInfo[i].Colname.ToUpper()] = i;
-
-                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)(i + 1), (short)DB2Constants.SQL_DESC_CONCISE_TYPE, sb, (short)sb.Capacity, out strlen, out columnInfo[i].Sqltype);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable");
-
-
-                       }
+               private void GetColumnInfo()\r
+               {\r
+                       if(isClosed)\r
+                               throw new InvalidOperationException("Reader is closed");\r
+                       if(fieldCount <= 0)\r
+                               throw new InvalidOperationException("No Fields found"); // TODO: check error\r
+                       if(columnInfo != null)\r
+                               return;\r
+               \r
+                       columnInfo = new ColumnInfo[fieldCount];\r
+                       columnsNames = new Hashtable(fieldCount);\r
+                       \r
+                       StringBuilder sb = new StringBuilder(400);\r
+                       for(int i = 0; i < columnInfo.Length; i++)\r
+                       {\r
+                               short sqlRet;\r
+                               short strlen;\r
+                               int numericAttribute;\r
+\r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)(i + 1), (short)DB2Constants.SQL_DESC_BASE_COLUMN_NAME, sb, (short)sb.Capacity, out strlen, out numericAttribute);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable");\r
+                               columnInfo[i].Colname = sb.ToString();\r
+                               columnsNames[columnInfo[i].Colname.ToUpper()] = i;\r
+\r
+                               sqlRet = DB2CLIWrapper.SQLColAttribute(hwndStmt, (short)(i + 1), (short)DB2Constants.SQL_DESC_CONCISE_TYPE, sb, (short)sb.Capacity, out strlen, out columnInfo[i].Sqltype);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_STMT, hwndStmt, "GetSchemaTable");\r
+\r
+\r
+                       }\r
                }
                #endregion
 
@@ -475,17 +472,17 @@ namespace IBM.Data.DB2
 /// <param name="dbVals"></param>
 /// <param name="sqlLen_or_IndPtr"></param>
 /// <param name="_resultSet"></param>
-               private int FieldNameLookup(DataTable _schemaTable, string name)
-               {
-                       for(int i = 0; i < _schemaTable.Rows.Count; i++)
-                       {
-                               if(CultureInfo.CurrentCulture.CompareInfo.Compare(name, (string)_schemaTable.Rows[i]["BaseColumnName"],
-                                       CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase) == 0)
-                               {
-                                       return i;
-                               }
-                       }
-                       return -1;
+               private int FieldNameLookup(DataTable _schemaTable, string name)\r
+               {\r
+                       for(int i = 0; i < _schemaTable.Rows.Count; i++)\r
+                       {\r
+                               if(CultureInfo.CurrentCulture.CompareInfo.Compare(name, (string)_schemaTable.Rows[i]["BaseColumnName"],\r
+                                       CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase) == 0)\r
+                               {\r
+                                       return i;\r
+                               }\r
+                       }\r
+                       return -1;\r
                }
                
                #endregion
@@ -496,226 +493,226 @@ namespace IBM.Data.DB2
                #region FieldCount
                ///
                ///
-               public int FieldCount
-               {
-                       get
-                       {
-                               if (isClosed)
-                                       throw new InvalidOperationException("Reader is closed");
-
-                               return fieldCount;
-                       }
+               public int FieldCount\r
+               {\r
+                       get\r
+                       {\r
+                               if (isClosed)\r
+                                       throw new InvalidOperationException("Reader is closed");\r
+\r
+                               return fieldCount;\r
+                       }\r
                }
                #endregion
 
                #region Item accessors
-               public object this[string name]
-               {
-                       get
-                       {
-                               int ordinal = GetOrdinal(name);
-                               return this[ordinal];
-                       }
-               }
-               public object this[int col]
-               {
-                       get
-                       {
-                               if(columnInfo == null)
-                               {
-                                       GetColumnInfo();
-                               }
-                               switch(columnInfo[col].Sqltype)
-                               {
-                                       case DB2Constants.SQL_INTEGER:
-                                               return GetInt32Internal(col);
-                                       case DB2Constants.SQL_SMALLINT:
-                                               return GetInt16Internal(col);
-                                       case DB2Constants.SQL_BIGINT:
-                                               return GetInt64Internal(col);
-                                       case DB2Constants.SQL_DOUBLE:
-                                               return GetDoubleInternal(col);
-                                       case DB2Constants.SQL_REAL:
-                                               return GetFloatInternal(col);
-                                       case DB2Constants.SQL_DECIMAL:
-                                               return GetDecimalInternal(col);
-                                       case DB2Constants.SQL_DATETIME:
-                                       case DB2Constants.SQL_TYPE_TIMESTAMP:
-                                               return GetDateTimeInternal(col);
-                                       case DB2Constants.SQL_TYPE_DATE:
-                                               return GetDateInternal(col);
-                                       case DB2Constants.SQL_TYPE_TIME:
-                                               return GetTimeInternal(col);
-                                       case DB2Constants.SQL_TYPE_CLOB:
-                                       case DB2Constants.SQL_CHAR:
-                                       case DB2Constants.SQL_VARCHAR:
-                                               return GetStringInternal(col);
-                                       case DB2Constants.SQL_TYPE_BLOB:
-                                       case DB2Constants.SQL_TYPE_BINARY:
-                                       case DB2Constants.SQL_LONGVARBINARY:
-                                       case DB2Constants.SQL_VARBINARY:
-                                               return GetBlobDataInternal(col);
-                               }
-                               throw new NotImplementedException("Unknown SQL type " + columnInfo[col].Sqltype);
-                       }
+               public object this[string name]\r
+               {\r
+                       get\r
+                       {\r
+                               int ordinal = GetOrdinal(name);\r
+                               return this[ordinal];\r
+                       }\r
+               }\r
+               public object this[int col]\r
+               {\r
+                       get\r
+                       {\r
+                               if(columnInfo == null)\r
+                               {\r
+                                       GetColumnInfo();\r
+                               }\r
+                               switch(columnInfo[col].Sqltype)\r
+                               {\r
+                                       case DB2Constants.SQL_INTEGER:\r
+                                               return GetInt32Internal(col);\r
+                                       case DB2Constants.SQL_SMALLINT:\r
+                                               return GetInt16Internal(col);\r
+                                       case DB2Constants.SQL_BIGINT:\r
+                                               return GetInt64Internal(col);\r
+                                       case DB2Constants.SQL_DOUBLE:\r
+                                               return GetDoubleInternal(col);\r
+                                       case DB2Constants.SQL_REAL:\r
+                                               return GetFloatInternal(col);\r
+                                       case DB2Constants.SQL_DECIMAL:\r
+                                               return GetDecimalInternal(col);\r
+                                       case DB2Constants.SQL_DATETIME:\r
+                                       case DB2Constants.SQL_TYPE_TIMESTAMP:\r
+                                               return GetDateTimeInternal(col);\r
+                                       case DB2Constants.SQL_TYPE_DATE:\r
+                                               return GetDateInternal(col);\r
+                                       case DB2Constants.SQL_TYPE_TIME:\r
+                                               return GetTimeInternal(col);\r
+                                       case DB2Constants.SQL_TYPE_CLOB:\r
+                                       case DB2Constants.SQL_CHAR:\r
+                                       case DB2Constants.SQL_VARCHAR:\r
+                                               return GetStringInternal(col);\r
+                                       case DB2Constants.SQL_TYPE_BLOB:\r
+                                       case DB2Constants.SQL_TYPE_BINARY:\r
+                                       case DB2Constants.SQL_LONGVARBINARY:\r
+                                       case DB2Constants.SQL_VARBINARY:\r
+                                               return GetBlobDataInternal(col);\r
+                               }\r
+                               throw new NotImplementedException("Unknown SQL type " + columnInfo[col].Sqltype);\r
+                       }\r
                }
                #endregion
 
-               #region GetBytes
-               ///
-               ///  GetBytes, return a stream of bytes
-               ///
-               public long GetBytes(int col, long fieldOffset, byte[] buffer, int bufferOffset, int length)
-               {
-                       // TODO: need better implementation for big BLOBs
-
-                       byte[] sourceArray = (byte[])this[col];
-#if NET_1_0
-                       if(buffer == null)
-                       {
-                               Array.Copy(sourceArray, (int)fieldOffset, buffer, bufferOffset, length);
-                       }
-                       return sourceArray.Length;
-#else
-                       if(buffer == null)
-                       {
-                               Array.Copy(sourceArray, fieldOffset, buffer, bufferOffset, length);
-                       }
-                       return sourceArray.LongLength;
-#endif
-               }
+               #region GetBytes\r
+               ///\r
+               ///  GetBytes, return a stream of bytes\r
+               ///\r
+               public long GetBytes(int col, long fieldOffset, byte[] buffer, int bufferOffset, int length)\r
+               {\r
+                       // TODO: need better implementation for big BLOBs\r
+\r
+                       byte[] sourceArray = (byte[])this[col];\r
+#if NET_1_0\r
+                       if(buffer == null)\r
+                       {\r
+                               Array.Copy(sourceArray, (int)fieldOffset, buffer, bufferOffset, length);\r
+                       }\r
+                       return sourceArray.Length;\r
+#else\r
+                       if(buffer == null)\r
+                       {\r
+                               Array.Copy(sourceArray, fieldOffset, buffer, bufferOffset, length);\r
+                       }\r
+                       return sourceArray.LongLength;\r
+#endif\r
+               }\r
                #endregion
 
-               #region GetChars
-               ///
-               ///GetChars, returns char array
-               ///
-               public long GetChars(int col, long fieldOffset, char[] buffer, int bufferOffset, int length)
-               {
-                       // TODO: need better implementation for big CLOBs
-
-                       string sourceString = GetString(col);
-                       if(buffer == null)
-                       {
-                               sourceString.CopyTo((int)fieldOffset, buffer, bufferOffset, length);
-                       }
-                       return (long)sourceString.Length;
-               }
+               #region GetChars\r
+               ///\r
+               ///GetChars, returns char array\r
+               ///\r
+               public long GetChars(int col, long fieldOffset, char[] buffer, int bufferOffset, int length)\r
+               {\r
+                       // TODO: need better implementation for big CLOBs\r
+\r
+                       string sourceString = GetString(col);\r
+                       if(buffer == null)\r
+                       {\r
+                               sourceString.CopyTo((int)fieldOffset, buffer, bufferOffset, length);\r
+                       }\r
+                       return (long)sourceString.Length;\r
+               }\r
                #endregion
 
                #region GetBoolean method
 
-               public Boolean GetBoolean(int col)
-               {
-                       return (Boolean)GetBooleanInternal(col);
-               }
-               internal object GetBooleanInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_BIT, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = Marshal.ReadByte(internalBuffer) != 0;
-                               }
-                       }               
-                       return _resultSet[col];
+               public Boolean GetBoolean(int col)\r
+               {\r
+                       return (Boolean)GetBooleanInternal(col);\r
+               }\r
+               internal object GetBooleanInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_BIT, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = Marshal.ReadByte(internalBuffer) != 0;\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
                }
                #endregion
 
-               #region GetGuid
-               ///
-               /// GetDateTime method
-               /// 
-               public Guid GetGuid(int col)
-               {
-                       return (Guid)GetGuidInternal(col);
-               }
-               internal object GetGuidInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_GUID, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(Guid)); 
-                               }
-                       }               
-                       return _resultSet[col];
-               }
-
+               #region GetGuid\r
+               ///\r
+               /// GetDateTime method\r
+               /// \r
+               public Guid GetGuid(int col)\r
+               {\r
+                       return (Guid)GetGuidInternal(col);\r
+               }\r
+               internal object GetGuidInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_GUID, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(Guid)); \r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
+               }\r
+\r
                #endregion
 
                #region GetByte
                ///
                ///GetByte
                ///
-               public Byte GetByte(int col)
-               {
-                       return (Byte)GetByteInternal(col);
-               }
-               internal object GetByteInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_UTINYINT, internalBuffer, 10, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = Marshal.ReadByte(internalBuffer);
-                               }
-                       }               
-                       return _resultSet[col];
+               public Byte GetByte(int col)\r
+               {\r
+                       return (Byte)GetByteInternal(col);\r
+               }\r
+               internal object GetByteInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_UTINYINT, internalBuffer, 10, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = Marshal.ReadByte(internalBuffer);\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
                }
                #endregion
 
@@ -723,38 +720,38 @@ namespace IBM.Data.DB2
                ///
                ///GetChar, return column as a char
                ///
-               public Char GetChar(int col)
-               {
-                       return (Char)GetCharInternal(col);
-               }
-               internal object GetCharInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_WCHAR, internalBuffer, 10, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(char));
-                               }
-                       }               
-                       return _resultSet[col];
+               public Char GetChar(int col)\r
+               {\r
+                       return (Char)GetCharInternal(col);\r
+               }\r
+               internal object GetCharInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_WCHAR, internalBuffer, 10, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(char));\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
                }
                #endregion
 
@@ -774,50 +771,50 @@ namespace IBM.Data.DB2
                ///
                ///GetDataTypeName return the type of data
                ///
-               public string GetDataTypeName(int col)
-               {
-                       if(columnInfo == null)
-                       {
-                               GetColumnInfo();
-                       }
-                       switch(columnInfo[col].Sqltype)
-                       {
-                               case DB2Constants.SQL_INTEGER:
-                                       return "INTEGER";
-                               case DB2Constants.SQL_SMALLINT:
-                                       return "SMALLINT";
-                               case DB2Constants.SQL_BIGINT:
-                                       return "BIGINT";
-                               case DB2Constants.SQL_DOUBLE:
-                                       return "DOUBLE";
-                               case DB2Constants.SQL_REAL:
-                                       return "REAL";
-                               case DB2Constants.SQL_DECIMAL:
-                                       return "DECIMAL";
-                               case DB2Constants.SQL_DATETIME:
-                                       return "DATETIME";
-                               case DB2Constants.SQL_TYPE_TIMESTAMP:
-                                       return "TIMESTAMP";
-                               case DB2Constants.SQL_TYPE_DATE:
-                                       return "DATE";
-                               case DB2Constants.SQL_TYPE_TIME:
-                                       return "TIME";
-                               case DB2Constants.SQL_TYPE_CLOB:
-                                       return "CLOB";
-                               case DB2Constants.SQL_CHAR:
-                                       return "CHAR";
-                               case DB2Constants.SQL_VARCHAR:
-                                       return "VARCHAR";
-                               case DB2Constants.SQL_TYPE_BLOB:
-                                       return "BLOB";
-                               case DB2Constants.SQL_TYPE_BINARY:
-                                       return "BINARY";
-                               case DB2Constants.SQL_LONGVARBINARY:
-                                       return "LONGVARBINARY";
-                               case DB2Constants.SQL_VARBINARY:
-                                       return "VARBINARY";
-                       }
-                       throw new NotImplementedException("Unknown SQL type " + columnInfo[col].Sqltype);
+               public string GetDataTypeName(int col)\r
+               {\r
+                       if(columnInfo == null)\r
+                       {\r
+                               GetColumnInfo();\r
+                       }\r
+                       switch(columnInfo[col].Sqltype)\r
+                       {\r
+                               case DB2Constants.SQL_INTEGER:\r
+                                       return "INTEGER";\r
+                               case DB2Constants.SQL_SMALLINT:\r
+                                       return "SMALLINT";\r
+                               case DB2Constants.SQL_BIGINT:\r
+                                       return "BIGINT";\r
+                               case DB2Constants.SQL_DOUBLE:\r
+                                       return "DOUBLE";\r
+                               case DB2Constants.SQL_REAL:\r
+                                       return "REAL";\r
+                               case DB2Constants.SQL_DECIMAL:\r
+                                       return "DECIMAL";\r
+                               case DB2Constants.SQL_DATETIME:\r
+                                       return "DATETIME";\r
+                               case DB2Constants.SQL_TYPE_TIMESTAMP:\r
+                                       return "TIMESTAMP";\r
+                               case DB2Constants.SQL_TYPE_DATE:\r
+                                       return "DATE";\r
+                               case DB2Constants.SQL_TYPE_TIME:\r
+                                       return "TIME";\r
+                               case DB2Constants.SQL_TYPE_CLOB:\r
+                                       return "CLOB";\r
+                               case DB2Constants.SQL_CHAR:\r
+                                       return "CHAR";\r
+                               case DB2Constants.SQL_VARCHAR:\r
+                                       return "VARCHAR";\r
+                               case DB2Constants.SQL_TYPE_BLOB:\r
+                                       return "BLOB";\r
+                               case DB2Constants.SQL_TYPE_BINARY:\r
+                                       return "BINARY";\r
+                               case DB2Constants.SQL_LONGVARBINARY:\r
+                                       return "LONGVARBINARY";\r
+                               case DB2Constants.SQL_VARBINARY:\r
+                                       return "VARBINARY";\r
+                       }\r
+                       throw new NotImplementedException("Unknown SQL type " + columnInfo[col].Sqltype);\r
                }
                #endregion
 
@@ -826,136 +823,136 @@ namespace IBM.Data.DB2
                /// GetDateTime method
                /// 
 
-               public DateTime GetDateTime(int col)
-               {
-                       return (DateTime)GetDateTimeInternal(col);
-               }
-               internal object GetDateTimeInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_TIMESTAMP, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       DateTime ret = new DateTime(
-                                               Marshal.ReadInt16(internalBuffer, 0),  // year
-                                               Marshal.ReadInt16(internalBuffer, 2),  // month
-                                               Marshal.ReadInt16(internalBuffer, 4),  // day
-                                               Marshal.ReadInt16(internalBuffer, 6),  // hour
-                                               Marshal.ReadInt16(internalBuffer, 8),  // minute
-                                               Marshal.ReadInt16(internalBuffer, 10));// second
-                                       _resultSet[col] = ret.AddTicks(Marshal.ReadInt32(internalBuffer, 12) / 100); // nanoseconds 
-                               }
-                       }               
-                       return _resultSet[col];
+               public DateTime GetDateTime(int col)\r
+               {\r
+                       return (DateTime)GetDateTimeInternal(col);\r
+               }\r
+               internal object GetDateTimeInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_TIMESTAMP, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       DateTime ret = new DateTime(\r
+                                               Marshal.ReadInt16(internalBuffer, 0),  // year\r
+                                               Marshal.ReadInt16(internalBuffer, 2),  // month\r
+                                               Marshal.ReadInt16(internalBuffer, 4),  // day\r
+                                               Marshal.ReadInt16(internalBuffer, 6),  // hour\r
+                                               Marshal.ReadInt16(internalBuffer, 8),  // minute\r
+                                               Marshal.ReadInt16(internalBuffer, 10));// second\r
+                                       _resultSet[col] = ret.AddTicks(Marshal.ReadInt32(internalBuffer, 12) / 100); // nanoseconds \r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
                }
                #endregion
 
-               #region GetDate
-               ///
-               /// GetDate method
-               /// 
-               public DateTime GetDate(int col)
-               {
-                       return (DateTime)GetDateInternal(col);
-               }
-               internal object GetDateInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_DATE, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = new DateTime(
-                                               Marshal.ReadInt16(internalBuffer, 0),  // year
-                                               Marshal.ReadInt16(internalBuffer, 2),  // month
-                                               Marshal.ReadInt16(internalBuffer, 4));  // day
-                               }
-                       }               
-                       return _resultSet[col];
-               }
-
+               #region GetDate\r
+               ///\r
+               /// GetDate method\r
+               /// \r
+               public DateTime GetDate(int col)\r
+               {\r
+                       return (DateTime)GetDateInternal(col);\r
+               }\r
+               internal object GetDateInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_DATE, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = new DateTime(\r
+                                               Marshal.ReadInt16(internalBuffer, 0),  // year\r
+                                               Marshal.ReadInt16(internalBuffer, 2),  // month\r
+                                               Marshal.ReadInt16(internalBuffer, 4));  // day\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
+               }\r
+\r
                #endregion
 
-               #region GetTime
-               ///
-               /// GetTime method
-               /// 
-               public TimeSpan GetTimeSpan(int col)
-               {
-                       return (TimeSpan)GetTimeInternal(col);
-               }
-               public TimeSpan GetTime(int col)
-               {
-                       return (TimeSpan)GetTimeInternal(col);
-               }
-               internal object GetTimeInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_TIME, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = new TimeSpan(
-                                               Marshal.ReadInt16(internalBuffer, 0),  // Hour
-                                               Marshal.ReadInt16(internalBuffer, 2),  // Minute
-                                               Marshal.ReadInt16(internalBuffer, 4)); // Second
-                               }
-                       }               
-                       return _resultSet[col];
-               }
-
+               #region GetTime\r
+               ///\r
+               /// GetTime method\r
+               /// \r
+               public TimeSpan GetTimeSpan(int col)\r
+               {\r
+                       return (TimeSpan)GetTimeInternal(col);\r
+               }\r
+               public TimeSpan GetTime(int col)\r
+               {\r
+                       return (TimeSpan)GetTimeInternal(col);\r
+               }\r
+               internal object GetTimeInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_TIME, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = new TimeSpan(\r
+                                               Marshal.ReadInt16(internalBuffer, 0),  // Hour\r
+                                               Marshal.ReadInt16(internalBuffer, 2),  // Minute\r
+                                               Marshal.ReadInt16(internalBuffer, 4)); // Second\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
+               }\r
+\r
                #endregion
 
 
@@ -963,45 +960,45 @@ namespace IBM.Data.DB2
                ///
                ///GetDecimal method
                ///
-
-               public Decimal GetDecimal(int col)
-               {
-                       return (Decimal)GetDecimalInternal(col);
-               }
-               internal object GetDecimalInternal(int col)
-               {
-                       object tmp = GetStringInternal(col);
-                       if(tmp is string)
-                       {
-                               _resultSet[col] = decimal.Parse(((string)_resultSet[col]).Replace(',','.'),     // sometimes we get a '.' and sometimes we get a ','
-                                       System.Globalization.CultureInfo.InvariantCulture);
-                       }
-                       //                      if((col < 0) || (col >= fieldCount))    // only works on windows UDB DB2 V8?
-                       //                      {
-                       //                              throw new IndexOutOfRangeException("col");
-                       //                      }
-                       //                      if(!hasData)
-                       //                      {
-                       //                              throw new InvalidOperationException("No data");
-                       //                      }
-                       //                      if(_resultSet == null)
-                       //                      {
-                       //                              _resultSet = new object[fieldCount];
-                       //                      }
-                       //                      if(_resultSet[col] == null)
-                       //                      {
-                       //                              int len;
-                       //                              short sqlRet = Db2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)Db2Constants.SQL_C_DECIMAL_OLEDB, internalBuffer, internalBufferSize, out len);
-                       //                              if(len == Db2Constants.SQL_NULL_DATA)
-                       //                              {
-                       //                                      _resultSet[col] = DBNull.Value;
-                       //                              }
-                       //                              else
-                       //                              {
-                       //                                      _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(decimal));
-                       //                              }
-                       //                      }               
-                       return _resultSet[col];
+\r
+               public Decimal GetDecimal(int col)\r
+               {\r
+                       return (Decimal)GetDecimalInternal(col);\r
+               }\r
+               internal object GetDecimalInternal(int col)\r
+               {\r
+                       object tmp = GetStringInternal(col);\r
+                       if(tmp is string)\r
+                       {\r
+                               _resultSet[col] = decimal.Parse(((string)_resultSet[col]).Replace(',','.'),     // sometimes we get a '.' and sometimes we get a ','\r
+                                       System.Globalization.CultureInfo.InvariantCulture);\r
+                       }\r
+                       //                      if((col < 0) || (col >= fieldCount))    // only works on windows UDB DB2 V8?\r
+                       //                      {\r
+                       //                              throw new IndexOutOfRangeException("col");\r
+                       //                      }\r
+                       //                      if(!hasData)\r
+                       //                      {\r
+                       //                              throw new InvalidOperationException("No data");\r
+                       //                      }\r
+                       //                      if(_resultSet == null)\r
+                       //                      {\r
+                       //                              _resultSet = new object[fieldCount];\r
+                       //                      }\r
+                       //                      if(_resultSet[col] == null)\r
+                       //                      {\r
+                       //                              int len;\r
+                       //                              short sqlRet = Db2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)Db2Constants.SQL_C_DECIMAL_OLEDB, internalBuffer, internalBufferSize, out len);\r
+                       //                              if(len == Db2Constants.SQL_NULL_DATA)\r
+                       //                              {\r
+                       //                                      _resultSet[col] = DBNull.Value;\r
+                       //                              }\r
+                       //                              else\r
+                       //                              {\r
+                       //                                      _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(decimal));\r
+                       //                              }\r
+                       //                      }               \r
+                       return _resultSet[col];\r
                }
                #endregion
 
@@ -1009,38 +1006,38 @@ namespace IBM.Data.DB2
                ///
                /// GetDouble 
                /// 
-               public Double GetDouble(int col)
-               {
-                       return (Double)GetDoubleInternal(col);
-               }
-               internal object GetDoubleInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_DOUBLE, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(double));
-                               }
-                       }               
-                       return _resultSet[col];
+               public Double GetDouble(int col)\r
+               {\r
+                       return (Double)GetDoubleInternal(col);\r
+               }\r
+               internal object GetDoubleInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_DOUBLE, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(double));\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
                }
                #endregion
 
@@ -1048,13 +1045,13 @@ namespace IBM.Data.DB2
                ///
                /// Type GetFieldType
                ///
-               public Type GetFieldType(int col)
-               {
-                       if(columnInfo == null)
-                       {
-                               GetColumnInfo();
-                       }
-                       return GetManagedType(columnInfo[col].Sqltype);
+               public Type GetFieldType(int col)\r
+               {\r
+                       if(columnInfo == null)\r
+                       {\r
+                               GetColumnInfo();\r
+                       }\r
+                       return GetManagedType(columnInfo[col].Sqltype);\r
                }
                #endregion
 
@@ -1062,38 +1059,38 @@ namespace IBM.Data.DB2
                ///
                /// GetFloat
                /// 
-               public float GetFloat(int col)
-               {
-                       return (float)GetFloatInternal(col);
-               }
-               internal object GetFloatInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_REAL, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(float));
-                               }
-                       }               
-                       return _resultSet[col];
+               public float GetFloat(int col)\r
+               {\r
+                       return (float)GetFloatInternal(col);\r
+               }\r
+               internal object GetFloatInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_REAL, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(float));\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
                }
                #endregion
 
@@ -1101,115 +1098,115 @@ namespace IBM.Data.DB2
                ///
                ///GetInt16
                ///
-               public short GetInt16(int col)
-               {
-                       return (short)GetInt16Internal(col);
-               }
-
-               internal object GetInt16Internal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_SSHORT, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(short));
-                               }
-                       }               
-                       return _resultSet[col];
-               }
-               ///
-               ///GetInt32
-               ///
-               public int GetInt32(int col)
-               {
-                       return (int)GetInt32Internal(col);
-               }
-
-               internal object GetInt32Internal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_SLONG, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(int));
-                               }
-                       }               
-                       return _resultSet[col];
-               }
-
-               ///
-               ///GetInt64
-               ///
-               public long GetInt64(int col)
-               {
-                       return (long)GetInt64Internal(col);
-               }
-
-               internal object GetInt64Internal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int len;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_SBIGINT, internalBuffer, internalBufferSize, out len);
-                               if(len == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(long));
-                               }
-                       }               
-                       return _resultSet[col];
-               }
+               public short GetInt16(int col)\r
+               {\r
+                       return (short)GetInt16Internal(col);\r
+               }\r
+\r
+               internal object GetInt16Internal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_SSHORT, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(short));\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
+               }\r
+               ///\r
+               ///GetInt32\r
+               ///\r
+               public int GetInt32(int col)\r
+               {\r
+                       return (int)GetInt32Internal(col);\r
+               }\r
+\r
+               internal object GetInt32Internal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_SLONG, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(int));\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
+               }\r
+\r
+               ///\r
+               ///GetInt64\r
+               ///\r
+               public long GetInt64(int col)\r
+               {\r
+                       return (long)GetInt64Internal(col);\r
+               }\r
+\r
+               internal object GetInt64Internal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int len;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_SBIGINT, internalBuffer, internalBufferSize, out len);\r
+                               if(len == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       _resultSet[col] = Marshal.PtrToStructure(internalBuffer, typeof(long));\r
+                               }\r
+                       }               \r
+                       return _resultSet[col];\r
+               }\r
 
                #endregion
 
@@ -1217,13 +1214,13 @@ namespace IBM.Data.DB2
                ///
                ///GetName, returns the name of the field
                ///
-               public string GetName(int col)
-               {
-                       if(columnInfo == null)
-                       {
-                               GetColumnInfo();
-                       }
-                       return columnInfo[col].Colname;
+               public string GetName(int col)\r
+               {\r
+                       if(columnInfo == null)\r
+                       {\r
+                               GetColumnInfo();\r
+                       }\r
+                       return columnInfo[col].Colname;\r
                }
                #endregion
 
@@ -1231,18 +1228,18 @@ namespace IBM.Data.DB2
                ///
                /// GetOrdinal, return the index of the named column
                /// 
-               public int GetOrdinal(string name)
-               {
-                       if(columnInfo == null)
-                       {
-                               GetColumnInfo();
-                       }
-                       object ordinal = columnsNames[name.ToUpper()];
-                       if(ordinal == null)
-                       {
-                               throw new IndexOutOfRangeException("name");
-                       }
-                       return (int)ordinal;
+               public int GetOrdinal(string name)\r
+               {\r
+                       if(columnInfo == null)\r
+                       {\r
+                               GetColumnInfo();\r
+                       }\r
+                       object ordinal = columnsNames[name.ToUpper()];\r
+                       if(ordinal == null)\r
+                       {\r
+                               throw new IndexOutOfRangeException("name");\r
+                       }\r
+                       return (int)ordinal;\r
                }
                #endregion
 
@@ -1250,42 +1247,42 @@ namespace IBM.Data.DB2
                ///
                /// GetString returns a string
                /// 
-               public string GetString(int col)
-               {
-                       return (string)GetStringInternal(col);
-               }
-
-               public object GetStringInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int length;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_WCHAR, (StringBuilder)null, 0, out length);
-                               if(length == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       IntPtr mem = Marshal.AllocHGlobal(length + 2);
-                                       sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_WCHAR, mem, length + 2, out length);
-                                       _resultSet[col] = Marshal.PtrToStringUni(mem);
-                                       Marshal.FreeHGlobal(mem);
-                               }
-                       }                       
-                       return _resultSet[col];
+               public string GetString(int col)\r
+               {\r
+                       return (string)GetStringInternal(col);\r
+               }\r
+\r
+               public object GetStringInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int length;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_WCHAR, (StringBuilder)null, 0, out length);\r
+                               if(length == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       IntPtr mem = Marshal.AllocHGlobal(length + 2);\r
+                                       sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_WCHAR, mem, length + 2, out length);\r
+                                       _resultSet[col] = Marshal.PtrToStringUni(mem);\r
+                                       Marshal.FreeHGlobal(mem);\r
+                               }\r
+                       }                       \r
+                       return _resultSet[col];\r
                }
                #endregion
 
@@ -1303,17 +1300,17 @@ namespace IBM.Data.DB2
                ///
                /// GetValues returns all columns in the row through the argument, and the number of columns in the return value
                /// 
-               public int GetValues(object[] values)
-               {
-                       int count = Math.Min(fieldCount, values.Length);
-
-                       for (int i = 0; i < count; i++)
-                       {
-                               values[i] = this[i];
-                        
-                       }
-                         
-                       return count;
+               public int GetValues(object[] values)\r
+               {\r
+                       int count = Math.Min(fieldCount, values.Length);\r
+\r
+                       for (int i = 0; i < count; i++)\r
+                       {\r
+                               values[i] = this[i];\r
+                        \r
+                       }\r
+                         \r
+                       return count;\r
                }
                #endregion
 
@@ -1321,10 +1318,10 @@ namespace IBM.Data.DB2
                ///
                /// IsDBNull Is the column null
                /// 
-               public bool IsDBNull(int col)
-               {
-                       //Proper implementation once I get the SQLDescribe/SQLBind/SQLFetch stuff in place
-                       return Convert.IsDBNull(this[col]);
+               public bool IsDBNull(int col)\r
+               {\r
+                       //Proper implementation once I get the SQLDescribe/SQLBind/SQLFetch stuff in place\r
+                       return Convert.IsDBNull(this[col]);\r
                }
                #endregion
 
@@ -1332,31 +1329,31 @@ namespace IBM.Data.DB2
 
                #region private methods
                
-               private DataTable BuildNewSchemaTable()
-               {
-                       DataTable schemaTable = new DataTable("SchemaTable");
-
-                       schemaTable.Columns.Add(new DataColumn("ColumnName", typeof(string)));
-                       schemaTable.Columns.Add(new DataColumn("ColumnOrdinal", typeof(int)));
-                       schemaTable.Columns.Add(new DataColumn("ColumnSize", typeof(int)));
-                       schemaTable.Columns.Add(new DataColumn("NumericPrecision", typeof(short)));
-                       schemaTable.Columns.Add(new DataColumn("NumericScale", typeof(short)));
-                       schemaTable.Columns.Add(new DataColumn("DataType", typeof(System.Type)));
-                       schemaTable.Columns.Add(new DataColumn("ProviderType", typeof(int)));
-                       schemaTable.Columns.Add(new DataColumn("IsLong", typeof(bool)));
-                       schemaTable.Columns.Add(new DataColumn("AllowDBNull", typeof(bool)));
-                       schemaTable.Columns.Add(new DataColumn("IsReadOnly", typeof(bool)));
-                       schemaTable.Columns.Add(new DataColumn("IsRowVersion", typeof(bool)));
-                       schemaTable.Columns.Add(new DataColumn("IsUnique", typeof(bool)));
-                       schemaTable.Columns.Add(new DataColumn("IsKey", typeof(bool)));
-                       schemaTable.Columns.Add(new DataColumn("IsKeyColumn", typeof(bool)));
-                       schemaTable.Columns.Add(new DataColumn("IsAutoIncrement", typeof(bool)));
-                       schemaTable.Columns.Add(new DataColumn("BaseSchemaName", typeof(string)));
-                       schemaTable.Columns.Add(new DataColumn("BaseCatalogName", typeof(string)));
-                       schemaTable.Columns.Add(new DataColumn("BaseTableName", typeof(string)));
-                       schemaTable.Columns.Add(new DataColumn("BaseColumnName", typeof(string)));
-
-                       return schemaTable;
+               private DataTable BuildNewSchemaTable()\r
+               {\r
+                       DataTable schemaTable = new DataTable("SchemaTable");\r
+\r
+                       schemaTable.Columns.Add(new DataColumn("ColumnName", typeof(string)));\r
+                       schemaTable.Columns.Add(new DataColumn("ColumnOrdinal", typeof(int)));\r
+                       schemaTable.Columns.Add(new DataColumn("ColumnSize", typeof(int)));\r
+                       schemaTable.Columns.Add(new DataColumn("NumericPrecision", typeof(short)));\r
+                       schemaTable.Columns.Add(new DataColumn("NumericScale", typeof(short)));\r
+                       schemaTable.Columns.Add(new DataColumn("DataType", typeof(System.Type)));\r
+                       schemaTable.Columns.Add(new DataColumn("ProviderType", typeof(int)));\r
+                       schemaTable.Columns.Add(new DataColumn("IsLong", typeof(bool)));\r
+                       schemaTable.Columns.Add(new DataColumn("AllowDBNull", typeof(bool)));\r
+                       schemaTable.Columns.Add(new DataColumn("IsReadOnly", typeof(bool)));\r
+                       schemaTable.Columns.Add(new DataColumn("IsRowVersion", typeof(bool)));\r
+                       schemaTable.Columns.Add(new DataColumn("IsUnique", typeof(bool)));\r
+                       schemaTable.Columns.Add(new DataColumn("IsKey", typeof(bool)));\r
+                       schemaTable.Columns.Add(new DataColumn("IsKeyColumn", typeof(bool)));\r
+                       schemaTable.Columns.Add(new DataColumn("IsAutoIncrement", typeof(bool)));\r
+                       schemaTable.Columns.Add(new DataColumn("BaseSchemaName", typeof(string)));\r
+                       schemaTable.Columns.Add(new DataColumn("BaseCatalogName", typeof(string)));\r
+                       schemaTable.Columns.Add(new DataColumn("BaseTableName", typeof(string)));\r
+                       schemaTable.Columns.Add(new DataColumn("BaseColumnName", typeof(string)));\r
+\r
+                       return schemaTable;\r
                }
                #endregion
                
@@ -1370,79 +1367,79 @@ namespace IBM.Data.DB2
                        }       
                }
                
-               private Type GetManagedType(int sql_type)
-               {
-                       switch(sql_type)
-                       {
-                               case DB2Constants.SQL_INTEGER:
-                                       return typeof(int);
-                               case DB2Constants.SQL_SMALLINT:
-                                       return typeof(short);
-                               case DB2Constants.SQL_BIGINT:
-                                       return typeof(long);
-                               case DB2Constants.SQL_DOUBLE:
-                                       return typeof(double);
-                               case DB2Constants.SQL_DECIMAL:
-                                       return typeof(decimal);
-                               case DB2Constants.SQL_DATETIME:
-                               case DB2Constants.SQL_TYPE_DATE:
-                               case DB2Constants.SQL_TYPE_TIMESTAMP:
-                                       return typeof(DateTime);
-                               case DB2Constants.SQL_TYPE_TIME:
-                                       return typeof(TimeSpan);
-                               case DB2Constants.SQL_CHAR:
-                               case DB2Constants.SQL_VARCHAR:
-                               case DB2Constants.SQL_TYPE_CLOB:
-                                       return typeof(string);
-                               case DB2Constants.SQL_TYPE_BLOB:
-                               case DB2Constants.SQL_TYPE_BINARY:
-                               case DB2Constants.SQL_LONGVARBINARY:
-                               case DB2Constants.SQL_VARBINARY:
-                                       return typeof(byte[]);
-                       }
-                       throw new NotImplementedException("Unknown SQL type " + sql_type);
+               private Type GetManagedType(int sql_type)\r
+               {\r
+                       switch(sql_type)\r
+                       {\r
+                               case DB2Constants.SQL_INTEGER:\r
+                                       return typeof(int);\r
+                               case DB2Constants.SQL_SMALLINT:\r
+                                       return typeof(short);\r
+                               case DB2Constants.SQL_BIGINT:\r
+                                       return typeof(long);\r
+                               case DB2Constants.SQL_DOUBLE:\r
+                                       return typeof(double);\r
+                               case DB2Constants.SQL_DECIMAL:\r
+                                       return typeof(decimal);\r
+                               case DB2Constants.SQL_DATETIME:\r
+                               case DB2Constants.SQL_TYPE_DATE:\r
+                               case DB2Constants.SQL_TYPE_TIMESTAMP:\r
+                                       return typeof(DateTime);\r
+                               case DB2Constants.SQL_TYPE_TIME:\r
+                                       return typeof(TimeSpan);\r
+                               case DB2Constants.SQL_CHAR:\r
+                               case DB2Constants.SQL_VARCHAR:\r
+                               case DB2Constants.SQL_TYPE_CLOB:\r
+                                       return typeof(string);\r
+                               case DB2Constants.SQL_TYPE_BLOB:\r
+                               case DB2Constants.SQL_TYPE_BINARY:\r
+                               case DB2Constants.SQL_LONGVARBINARY:\r
+                               case DB2Constants.SQL_VARBINARY:\r
+                                       return typeof(byte[]);\r
+                       }\r
+                       throw new NotImplementedException("Unknown SQL type " + sql_type);\r
                }
                
-               private bool IsLong(short sql_type)
-               {
-                       switch(sql_type)
-                       {
-                               case DB2Constants.SQL_TYPE_CLOB:
-                               case DB2Constants.SQL_TYPE_BLOB:
-                                       return true;
-                       }
-                       return false;
+               private bool IsLong(short sql_type)\r
+               {\r
+                       switch(sql_type)\r
+                       {\r
+                               case DB2Constants.SQL_TYPE_CLOB:\r
+                               case DB2Constants.SQL_TYPE_BLOB:\r
+                                       return true;\r
+                       }\r
+                       return false;\r
                }
-               private object GetBlobDataInternal(int col)
-               {
-                       if((col < 0) || (col >= fieldCount))
-                       {
-                               throw new IndexOutOfRangeException("col");
-                       }
-                       if(!hasData)
-                       {
-                               throw new InvalidOperationException("No data");
-                       }
-                       if(_resultSet == null)
-                       {
-                               _resultSet = new object[fieldCount];
-                       }
-                       if(_resultSet[col] == null)
-                       {
-                               int length;
-                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_BINARY, (StringBuilder)null, 0, out length);
-                               if(length == DB2Constants.SQL_NULL_DATA)
-                               {
-                                       _resultSet[col] = DBNull.Value;
-                               }
-                               else
-                               {
-                                       byte[] result = new byte[length];
-                                       sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_BINARY, result, length, out length);
-                                       _resultSet[col] = result;
-                               }
-                       }                       
-                       return _resultSet[col];
+               private object GetBlobDataInternal(int col)\r
+               {\r
+                       if((col < 0) || (col >= fieldCount))\r
+                       {\r
+                               throw new IndexOutOfRangeException("col");\r
+                       }\r
+                       if(!hasData)\r
+                       {\r
+                               throw new InvalidOperationException("No data");\r
+                       }\r
+                       if(_resultSet == null)\r
+                       {\r
+                               _resultSet = new object[fieldCount];\r
+                       }\r
+                       if(_resultSet[col] == null)\r
+                       {\r
+                               int length;\r
+                               short sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_BINARY, (StringBuilder)null, 0, out length);\r
+                               if(length == DB2Constants.SQL_NULL_DATA)\r
+                               {\r
+                                       _resultSet[col] = DBNull.Value;\r
+                               }\r
+                               else\r
+                               {\r
+                                       byte[] result = new byte[length];\r
+                                       sqlRet = DB2CLIWrapper.SQLGetData(this.hwndStmt, (short)(col + 1), (short)DB2Constants.SQL_C_TYPE_BINARY, result, length, out length);\r
+                                       _resultSet[col] = result;\r
+                               }\r
+                       }                       \r
+                       return _resultSet[col];\r
                }
        }
 
diff --git a/mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2InfoMessageEventHandler.cs b/mcs/class/IBM.Data.DB2/IBM.Data.DB2/DB2InfoMessageEventHandler.cs
new file mode 100755 (executable)
index 0000000..27bf04d
--- /dev/null
@@ -0,0 +1,48 @@
+using System;\r
+using System.Data;\r
+using System.Runtime.InteropServices;\r
+\r
+namespace IBM.Data.DB2\r
+{\r
+       public delegate void DB2InfoMessageEventHandler(object sender, DB2InfoMessageEventArgs e);\r
+\r
+       public sealed class DB2InfoMessageEventArgs : EventArgs\r
+       {\r
+               private DB2ErrorCollection errors;\r
+\r
+               public DB2InfoMessageEventArgs(DB2ErrorCollection errors)\r
+               {\r
+                       this.errors = errors;\r
+               }\r
+\r
+               public DB2ErrorCollection Errors\r
+               {\r
+                       get\r
+                       {\r
+                               return errors;\r
+                       }\r
+               }\r
+               public string Message\r
+               {\r
+                       get\r
+                       {\r
+                               if(errors.Count > 0)\r
+                               {\r
+                                       string result = "";\r
+                                       for(int i = 0; i < errors.Count; i++)\r
+                                       {\r
+                                               if(i > 0)\r
+                                               {\r
+                                                       result += " ";\r
+                                               }\r
+                                               result += "INFO [" + errors[i].SQLState + "] " + errors[i].Message;\r
+                                       }\r
+                                       return result;\r
+                               }\r
+                               return "No information";\r
+                       }\r
+               }\r
+\r
+       }\r
+}\r
+\r
index 668df8b7f0beb9cf135d9d75bd3a5f5955d542e3..c0ef428d623af187219be9f1bb644dedae6af7e6 100755 (executable)
-using System;
-using System.Collections;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading;
-
-namespace IBM.Data.DB2
-{
-
-       internal sealed class DB2OpenConnection : IDisposable
-       {
-               private IntPtr dbHandle = IntPtr.Zero;
-
-               private DB2ConnectionSettings settings;
-               private bool disposed = false;
-               internal DateTime poolDisposalTime; // time to live used for disposal of connections in the connection pool
-               public bool transactionOpen;
-               public bool autoCommit = true;
-               private string          databaseProductName;
-               private string          databaseVersion;
-               private int                     majorVersion;
-               private int                     minorVersion;
-
-               public IntPtr DBHandle
-               {
-                       get { return dbHandle; }
-               }
-               public string DatabaseProductName
-               {
-                       get { return databaseProductName; }
-               }
-               public string DatabaseVersion
-               {
-                       get { return databaseVersion; }
-               }
-               public int MajorVersion
-               {
-                       get { return majorVersion; }
-               }
-               public int MinorVersion
-               {
-                       get { return minorVersion; }
-               }
-
-               public DB2OpenConnection(DB2ConnectionSettings settings, DB2Connection connection)
-               {
-                       this.settings = settings;
-                       try
-                       {
-                               short sqlRet = DB2CLIWrapper.SQLAllocHandle(DB2Constants.SQL_HANDLE_DBC, DB2Environment.Instance.penvHandle, out dbHandle);
-                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, DB2Environment.Instance.penvHandle, "Unable to allocate database handle in DB2Connection.", connection);
-
-                               if(settings.Server.Length > 0)
-                               {
-                                       StringBuilder outConnectStr = new StringBuilder(60);  // TODO: ????
-                                       short numOutCharsReturned;
-
-                                       sqlRet = DB2CLIWrapper.SQLDriverConnect(dbHandle, IntPtr.Zero,
-                                               settings.ConnectionString,      (short)settings.ConnectionString.Length,
-                                               outConnectStr,                          (short)outConnectStr.Length, out numOutCharsReturned,
-                                               DB2Constants.SQL_DRIVER_NOPROMPT /*SQL_DRIVER_COMPLETE*/);
-
-                               }
-                               else
-                               {
-                                       sqlRet = DB2CLIWrapper.SQLConnect(dbHandle,
-                                               settings.DatabaseAlias, (short)settings.DatabaseAlias.Length,
-                                               settings.UserName,              (short)settings.UserName.Length,
-                                               settings.PassWord,              (short)settings.PassWord.Length);
-                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, dbHandle, "Unable to connect to the database.", connection);
-                               }
-
-
-
-                               if((settings.Pool == null) || (settings.Pool.databaseProductName == null))
-                               {
-                                       StringBuilder sb = new StringBuilder(256);
-                                       short stringLength;
-                                       sqlRet = DB2CLIWrapper.SQLGetInfo(dbHandle, /*SQL_DBMS_NAME*/17, sb, (short)(sb.Capacity / 2), out stringLength);
-                                       new DB2ErrorCollection(DB2Constants.SQL_HANDLE_DBC, dbHandle).ToString();
-
-
-
-                                       if(sqlRet == 0)
-                                               databaseProductName = sb.ToString();  //(0, Math.Min(sb.Capacity, stringLength / 2));
-                                       sqlRet = DB2CLIWrapper.SQLGetInfo(dbHandle, /*SQL_DBMS_VER*/18, sb, (short)(sb.Capacity / 2), out stringLength);
-                                       if(sqlRet == 0)
-                                       {
-                                               databaseVersion = sb.ToString(0, Math.Min(sb.Capacity, stringLength / 2));
-                                               try
-                                               {
-                                                       string[] splitVersion = databaseVersion.Split('.');
-                                                       majorVersion = int.Parse(splitVersion[0]);
-                                                       minorVersion = int.Parse(splitVersion[1]);
-                                               }
-                                               catch{}
-                                       }
-                                       if(settings.Pool != null)
-                                       {
-                                               settings.Pool.databaseProductName = databaseProductName;
-                                               settings.Pool.databaseVersion     = databaseVersion;
-                                               settings.Pool.majorVersion                = majorVersion;
-                                               settings.Pool.minorVersion                = minorVersion;
-                                       }
-                               }
-                               else if(settings.Pool != null)
-                               {
-                                       if(settings.Pool != null)
-                                       {
-                                               databaseProductName = settings.Pool.databaseProductName;
-                                               databaseVersion         = settings.Pool.databaseVersion;
-                                               majorVersion            = settings.Pool.majorVersion;
-                                               minorVersion            = settings.Pool.minorVersion;
-                                       }
-                               }
-                       }
-                       catch
-                       {
-                               if(dbHandle != IntPtr.Zero)
-                               {
-                                       DB2CLIWrapper.SQLFreeHandle(DB2Constants.SQL_HANDLE_DBC, dbHandle);
-                                       dbHandle = IntPtr.Zero;
-                               }
-                               throw;
-                       }
-               }
-
-               public void RollbackDeadTransaction()
-               {
-                       DB2CLIWrapper.SQLEndTran(DB2Constants.SQL_HANDLE_DBC, DBHandle, DB2Constants.SQL_ROLLBACK);
-                       transactionOpen = false;
-               }
-
-               public void Close()
-               {
-                       if(transactionOpen)
-                               RollbackDeadTransaction();
-
-                       if(settings.Pool != null)
-                       {
-                               settings.Pool.AddToFreeConnections(this);
-                       }
-                       else
-                       {
-                               Dispose();
-                       }
-               }
-
-               private void FreeHandles()
-               {
-                       if(dbHandle != IntPtr.Zero)
-                       {
-                               short sqlRet = DB2CLIWrapper.SQLDisconnect(dbHandle);
-                               // Note that SQLDisconnect() automatically drops any statements and
-                               // descriptors open on the connection.
-                               sqlRet = DB2CLIWrapper.SQLFreeHandle(DB2Constants.SQL_HANDLE_DBC, dbHandle);
-
-                               dbHandle = IntPtr.Zero;
-                       }
-               }
-
-               #region IDisposable Members
-
-               public void Dispose()
-               {
-                       Dispose(true);
-                       GC.SuppressFinalize(this);
-               }
-
-               private void Dispose(bool disposing)
-               {
-                       if(!disposed) 
-                       {
-                               if(disposing)
-                               {
-                                       // dispose managed resources
-                               }
-                               FreeHandles();
-                       }
-                       disposed = true;
-               }
-
-
-               ~DB2OpenConnection()
-               {
-                       if(settings.Pool != null)
-                       {
-                               settings.Pool.OpenConnectionFinalized();
-                       }
-                       Dispose(false);
-               }
-               #endregion
-       }
-
-
-}
+using System;\r
+using System.Collections;\r
+using System.Runtime.InteropServices;\r
+using System.Text;\r
+using System.Threading;\r
+\r
+namespace IBM.Data.DB2\r
+{\r
+\r
+       internal sealed class DB2OpenConnection : IDisposable\r
+       {\r
+               private IntPtr dbHandle = IntPtr.Zero;\r
+\r
+               private DB2ConnectionSettings settings;\r
+               private bool disposed = false;\r
+               internal DateTime poolDisposalTime; // time to live used for disposal of connections in the connection pool\r
+               public bool transactionOpen;\r
+               public bool autoCommit = true;\r
+               private string          databaseProductName;\r
+               private string          databaseVersion;\r
+               private int                     majorVersion;\r
+               private int                     minorVersion;\r
+\r
+               public IntPtr DBHandle\r
+               {\r
+                       get { return dbHandle; }\r
+               }\r
+               public string DatabaseProductName\r
+               {\r
+                       get { return databaseProductName; }\r
+               }\r
+               public string DatabaseVersion\r
+               {\r
+                       get { return databaseVersion; }\r
+               }\r
+               public int MajorVersion\r
+               {\r
+                       get { return majorVersion; }\r
+               }\r
+               public int MinorVersion\r
+               {\r
+                       get { return minorVersion; }\r
+               }\r
+\r
+               public DB2OpenConnection(DB2ConnectionSettings settings, DB2Connection connection)\r
+               {\r
+                       this.settings = settings;\r
+                       try\r
+                       {\r
+                               short sqlRet = DB2CLIWrapper.SQLAllocHandle(DB2Constants.SQL_HANDLE_DBC, DB2Environment.Instance.penvHandle, out dbHandle);\r
+                               DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, DB2Environment.Instance.penvHandle, "Unable to allocate database handle in DB2Connection.", connection);\r
+\r
+                               if(settings.Server.Length > 0)\r
+                               {\r
+                                       StringBuilder outConnectStr = new StringBuilder(60);  // TODO: ????\r
+                                       short numOutCharsReturned;\r
+\r
+                                       sqlRet = DB2CLIWrapper.SQLDriverConnect(dbHandle, IntPtr.Zero, \r
+                                               settings.ConnectionString,      (short)settings.ConnectionString.Length,\r
+                                               outConnectStr,                          (short)outConnectStr.Length, out numOutCharsReturned, \r
+                                               DB2Constants.SQL_DRIVER_NOPROMPT /*SQL_DRIVER_COMPLETE*/);\r
+                               }\r
+                               else\r
+                               {\r
+                                       sqlRet = DB2CLIWrapper.SQLConnect(dbHandle, \r
+                                               settings.DatabaseAlias, (short)settings.DatabaseAlias.Length, \r
+                                               settings.UserName,              (short)settings.UserName.Length,\r
+                                               settings.PassWord,              (short)settings.PassWord.Length);\r
+                                       DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, dbHandle, "Unable to connect to the database.", connection);\r
+                               }\r
+\r
+                               if((settings.Pool == null) || (settings.Pool.databaseProductName == null))\r
+                               {\r
+                                       StringBuilder sb = new StringBuilder(256);\r
+                                       short stringLength;\r
+                                       sqlRet = DB2CLIWrapper.SQLGetInfo(dbHandle, /*SQL_DBMS_NAME*/17, sb, (short)(sb.Capacity / 2), out stringLength);\r
+                                       new DB2ErrorCollection(DB2Constants.SQL_HANDLE_DBC, dbHandle).ToString();\r
+                                       if(sqlRet == 0)\r
+                                               databaseProductName = sb.ToString(0, Math.Min(sb.Capacity, stringLength / 2));\r
+                                       sqlRet = DB2CLIWrapper.SQLGetInfo(dbHandle, /*SQL_DBMS_VER*/18, sb, (short)(sb.Capacity / 2), out stringLength);\r
+                                       if(sqlRet == 0)\r
+                                       {\r
+                                               databaseVersion = sb.ToString(0, Math.Min(sb.Capacity, stringLength / 2));\r
+                                               try\r
+                                               {\r
+                                                       string[] splitVersion = databaseVersion.Split('.');\r
+                                                       majorVersion = int.Parse(splitVersion[0]);\r
+                                                       minorVersion = int.Parse(splitVersion[1]);\r
+                                               }\r
+                                               catch{}\r
+                                       }\r
+                                       if(settings.Pool != null)\r
+                                       {\r
+                                               settings.Pool.databaseProductName = databaseProductName;\r
+                                               settings.Pool.databaseVersion     = databaseVersion;\r
+                                               settings.Pool.majorVersion                = majorVersion;\r
+                                               settings.Pool.minorVersion                = minorVersion;\r
+                                       }\r
+                               }\r
+                               else if(settings.Pool != null)\r
+                               {\r
+                                       if(settings.Pool != null)\r
+                                       {\r
+                                               databaseProductName = settings.Pool.databaseProductName;\r
+                                               databaseVersion         = settings.Pool.databaseVersion;\r
+                                               majorVersion            = settings.Pool.majorVersion;\r
+                                               minorVersion            = settings.Pool.minorVersion;\r
+                                       }\r
+                               }\r
+                       }\r
+                       catch\r
+                       {\r
+                               if(dbHandle != IntPtr.Zero)\r
+                               {\r
+                                       DB2CLIWrapper.SQLFreeHandle(DB2Constants.SQL_HANDLE_DBC, dbHandle);\r
+                                       dbHandle = IntPtr.Zero;\r
+                               }\r
+                               throw;\r
+                       }\r
+               }\r
+\r
+               public void RollbackDeadTransaction()\r
+               {\r
+                       DB2CLIWrapper.SQLEndTran(DB2Constants.SQL_HANDLE_DBC, DBHandle, DB2Constants.SQL_ROLLBACK);\r
+                       transactionOpen = false;\r
+               }\r
+\r
+               public void Close()\r
+               {\r
+                       if(transactionOpen)\r
+                               RollbackDeadTransaction();\r
+\r
+                       if(settings.Pool != null)\r
+                       {\r
+                               settings.Pool.AddToFreeConnections(this);\r
+                       }\r
+                       else\r
+                       {\r
+                               Dispose();\r
+                       }\r
+               }\r
+\r
+               private void FreeHandles()\r
+               {\r
+                       if(dbHandle != IntPtr.Zero)\r
+                       {\r
+                               short sqlRet = DB2CLIWrapper.SQLDisconnect(dbHandle);\r
+                               // Note that SQLDisconnect() automatically drops any statements and\r
+                               // descriptors open on the connection.\r
+                               sqlRet = DB2CLIWrapper.SQLFreeHandle(DB2Constants.SQL_HANDLE_DBC, dbHandle);\r
+\r
+                               dbHandle = IntPtr.Zero;\r
+                       }\r
+               }\r
+\r
+               #region IDisposable Members\r
+\r
+               public void Dispose()\r
+               {\r
+                       Dispose(true);\r
+                       GC.SuppressFinalize(this);\r
+               }\r
+\r
+               private void Dispose(bool disposing)\r
+               {\r
+                       if(!disposed) \r
+                       {\r
+                               if(disposing)\r
+                               {\r
+                                       // dispose managed resources\r
+                               }\r
+                               FreeHandles();\r
+                       }\r
+                       disposed = true;\r
+               }\r
+\r
+\r
+               ~DB2OpenConnection()\r
+               {\r
+                       if(settings.Pool != null)\r
+                       {\r
+                               settings.Pool.OpenConnectionFinalized();\r
+                       }\r
+                       Dispose(false);\r
+               }\r
+               #endregion\r
+       }\r
+\r
+\r
+}
\ No newline at end of file
index 11554dd972435384c93bbdd797a6dc0fda4280bf..4609ab96f3f5a3e5e54dcd0cf7e88961c04f0922 100755 (executable)
-using System;
-using System.Data;
-using System.Runtime.InteropServices;
-
-namespace IBM.Data.DB2
-{
-
-       public sealed class DB2Parameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable
-       {
-               private DbType dbType = DbType.Object;
-               private DB2Type db2Type = DB2Type.Invalid;
-               private short db2DataType = DB2Constants.SQL_UNKNOWN_TYPE;
-               private short db2LastUsedDataType = DB2Constants.SQL_UNKNOWN_TYPE;
-
-               private ParameterDirection direction;
-               private short db2Direction = DB2Constants.SQL_PARAM_INPUT;
-               private bool nullable = true;
-               private string parameterName;
-               private string sourceColumn;
-               private DataRowVersion sourceVersion;
-               private object dataVal;
-               private byte scale, precision;
-               private int size;
-               internal IntPtr internalBuffer;
-               internal IntPtr internalLengthBuffer;
-               internal int requiredMemory;
-
-               #region Contructors and destructors
-               public DB2Parameter()
-               {
-                       direction = ParameterDirection.Input;
-                       sourceVersion = DataRowVersion.Current;
-               } 
-
-               public DB2Parameter(string name, DB2Type type)
-               {
-                       direction = ParameterDirection.Input;
-                       sourceVersion = DataRowVersion.Current;
-                       this.ParameterName = name;
-                       this.DB2Type = type;
-               } 
-
-               public DB2Parameter(string name, DB2Type type, int size)
-               {
-                       direction = ParameterDirection.Input;
-                       sourceVersion = DataRowVersion.Current;
-                       this.ParameterName = name;
-                       this.DB2Type = type;
-                       this.Size = size;
-               }
-
-               public DB2Parameter(string name, DB2Type type, int size, string sourceColumn)
-               {
-                       direction = ParameterDirection.Input;
-                       sourceVersion = DataRowVersion.Current;
-                       this.ParameterName = name;
-                       this.DB2Type = type;
-                       this.Size = size;
-                       this.SourceColumn = sourceColumn;
-               }
-               
-               //only for testing purposes!!! 
-               public DB2Parameter(string name, short type, int size, string sourceColumn)
-               {
-                       direction = ParameterDirection.Input;
-                       sourceVersion = DataRowVersion.Current;
-                       this.ParameterName = name;
-                       this.db2DataType = type;
-                       this.Size = size;
-                       this.SourceColumn = sourceColumn;
-               }
-
-               public DB2Parameter(string parameterName, object value)
-               {
-                       direction = ParameterDirection.Input;
-                       sourceVersion = DataRowVersion.Current;
-                       this.ParameterName = parameterName;
-                       this.Value = value;
-               }
-
-               public DB2Parameter(string parameterName, DB2Type db2Type, int size, ParameterDirection parameterDirection, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value)
-               {
-                       this.ParameterName = parameterName;
-                       this.DB2Type = db2Type;
-                       this.Size = size;
-                       this.Direction = parameterDirection;
-                       this.IsNullable = isNullable;
-                       this.Precision = precision;
-                       this.Scale = scale;
-                       this.SourceColumn = srcColumn;
-                       this.SourceVersion = srcVersion;
-                       this.Value = value;
-               }
-
-               #endregion
-               #region Properties
-               #region DbType Property
-               public DB2Type DB2Type
-               {
-                       get 
-                       {
-                               return db2Type;
-                       }
-                       set 
-                       {
-                               db2Type = value;
-                               switch(db2Type)
-                               {
-                                       case DB2Type.Invalid:        dbType = DbType.Object;            db2DataType = DB2Constants.SQL_UNKNOWN_TYPE;   break;
-                                       case DB2Type.SmallInt:       dbType = DbType.Int16;             db2DataType = DB2Constants.SQL_SMALLINT;       break;
-                                       case DB2Type.Integer:        dbType = DbType.Int32;             db2DataType = DB2Constants.SQL_INTEGER;        break;
-                                       case DB2Type.BigInt:         dbType = DbType.Int64;             db2DataType = DB2Constants.SQL_BIGINT;         break;
-                                       case DB2Type.Real:           dbType = DbType.Single;            db2DataType = DB2Constants.SQL_REAL;           break;
-                                       case DB2Type.Double:         dbType = DbType.Double;            db2DataType = DB2Constants.SQL_DOUBLE;         break;
-                                       case DB2Type.Float:          dbType = DbType.Single;            db2DataType = DB2Constants.SQL_REAL;           break;
-                                       case DB2Type.Decimal:        dbType = DbType.Decimal;           db2DataType = DB2Constants.SQL_DECIMAL;        break;
-                                       case DB2Type.Numeric:        dbType = DbType.VarNumeric;        db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.Date:           dbType = DbType.Date;              db2DataType = DB2Constants.SQL_TYPE_DATE;      break;
-                                       case DB2Type.Time:           dbType = DbType.Time;              db2DataType = DB2Constants.SQL_TYPE_TIME;      break;
-                                       case DB2Type.Timestamp:      dbType = DbType.DateTime;          db2DataType = DB2Constants.SQL_TYPE_TIMESTAMP; break;
-                                       case DB2Type.Char:           dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.VarChar:        dbType = DbType.StringFixedLength; db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.LongVarChar:    dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.Binary:         dbType = DbType.Binary;            db2DataType = DB2Constants.SQL_VARBINARY;      break;
-                                       case DB2Type.VarBinary:      dbType = DbType.Binary;            db2DataType = DB2Constants.SQL_VARBINARY;      break;
-                                       case DB2Type.LongVarBinary:  dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.Graphic:        dbType = DbType.StringFixedLength; db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.VarGraphic:     dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.LongVarGraphic: dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.Clob:           dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.Blob:           dbType = DbType.Binary;            db2DataType = DB2Constants.SQL_VARBINARY;      break;
-                                       case DB2Type.DbClob:         dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DB2Type.Datalink:       dbType = DbType.Byte;              db2DataType = DB2Constants.SQL_VARBINARY;      break;
-                                       case DB2Type.RowId:          dbType = DbType.Decimal;           db2DataType = DB2Constants.SQL_DECIMAL;        break;
-                                       case DB2Type.XmlReader:      dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       default:
-                                               throw new NotSupportedException("Value is of unknown data type");
-                               }
-                       }
-               }
-               ///
-               /// Parameter data type
-               /// 
-               public DbType DbType
-               {
-                       get 
-                       {
-                               return dbType;
-                       }
-                       set 
-                       {
-                               dbType = value;
-                               switch(dbType)
-                               {
-                                       case DbType.AnsiString:             db2Type = DB2Type.VarChar;    db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DbType.AnsiStringFixedLength:  db2Type = DB2Type.Char;       db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DbType.Binary:                 db2Type = DB2Type.Binary;     db2DataType = DB2Constants.SQL_VARBINARY;      break;
-                                       case DbType.Boolean:                db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_BIT;            break;
-                                       case DbType.Byte:                   db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_UTINYINT;       break;
-                                       case DbType.Currency:               db2Type = DB2Type.Decimal;    db2DataType = DB2Constants.SQL_DECIMAL;        break;
-                                       case DbType.Date:                   db2Type = DB2Type.Date;       db2DataType = DB2Constants.SQL_TYPE_DATE;      break;
-                                       case DbType.DateTime:               db2Type = DB2Type.Timestamp;  db2DataType = DB2Constants.SQL_TYPE_TIMESTAMP; break;
-                                       case DbType.Decimal:                db2Type = DB2Type.Decimal;    db2DataType = DB2Constants.SQL_DECIMAL;        break;
-                                       case DbType.Double:                 db2Type = DB2Type.Double;     db2DataType = DB2Constants.SQL_DOUBLE;         break;
-                                       case DbType.Guid:                   db2Type = DB2Type.Binary;     db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DbType.Int16:                  db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_SMALLINT;       break;
-                                       case DbType.Int32:                  db2Type = DB2Type.Integer;    db2DataType = DB2Constants.SQL_INTEGER;        break;
-                                       case DbType.Int64:                  db2Type = DB2Type.BigInt;     db2DataType = DB2Constants.SQL_BIGINT;         break;
-                                       case DbType.Object:                 db2Type = DB2Type.Invalid;    db2DataType = DB2Constants.SQL_UNKNOWN_TYPE;   break;
-                                       case DbType.SByte:                  db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_UTINYINT;       break;
-                                       case DbType.Single:                 db2Type = DB2Type.Float;      db2DataType = DB2Constants.SQL_REAL;           break;
-                                       case DbType.String:                 db2Type = DB2Type.VarChar;    db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DbType.StringFixedLength:      db2Type = DB2Type.Char;       db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       case DbType.Time:                   db2Type = DB2Type.Time;       db2DataType = DB2Constants.SQL_TYPE_TIME;      break;
-                                       case DbType.UInt16:                 db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_SMALLINT;       break;
-                                       case DbType.UInt32:                 db2Type = DB2Type.Integer;    db2DataType = DB2Constants.SQL_INTEGER;        break;
-                                       case DbType.UInt64:                 db2Type = DB2Type.BigInt;     db2DataType = DB2Constants.SQL_BIGINT;         break;
-                                       case DbType.VarNumeric:             db2Type = DB2Type.Numeric;    db2DataType = DB2Constants.SQL_WCHAR;          break;
-                                       default:
-                                               throw new NotSupportedException("Value is of unknown data type");
-                               }
-                       }
-               }
-
-               #endregion
-               #region Direction
-               ///
-               /// In or out parameter, or both
-               /// 
-               public ParameterDirection Direction
-               {
-                       get 
-                       {
-                               return direction;
-                       }
-                       set 
-                       {
-                               direction = value;
-                               switch(direction)
-                               {
-                                       default:
-                                       case ParameterDirection.Input:                  db2Direction = DB2Constants.SQL_PARAM_INPUT;            break;
-                                       case ParameterDirection.Output:                 db2Direction = DB2Constants.SQL_PARAM_OUTPUT;           break;
-                                       case ParameterDirection.InputOutput:    db2Direction = DB2Constants.SQL_PARAM_INPUT_OUTPUT;     break;
-                                       case ParameterDirection.ReturnValue:    db2Direction = DB2Constants.SQL_RETURN_VALUE;           break;
-                               }
-                       }
-               }
-               #endregion
-               #region IsNullable
-               ///
-               /// Does this parameter support a null value
-               /// 
-               public bool IsNullable 
-               {
-                       get 
-                       {
-                               return nullable;
-                       }
-                       set 
-                       {
-                               nullable = value;
-                       }
-               }
-               #endregion
-               #region ParameterName
-               public string ParameterName
-               {
-                       get 
-                       {
-                               return parameterName;
-                       }
-                       set 
-                       {
-                               parameterName = value;
-                       }
-               }
-               #endregion
-               #region SourceColumn
-               ///
-               /// Gets or sets the name of the source column that is mapped to the DataSet
-               /// 
-               public string SourceColumn
-               {
-                       get 
-                       {
-                               return sourceColumn;
-                       }
-                       set 
-                       {
-                               sourceColumn = value;
-                       }
-               }
-               #endregion
-               #region SourceVersion
-               ///
-               /// DataRowVersion property
-               /// 
-               public DataRowVersion SourceVersion 
-               {
-                       get 
-                       {
-                               return sourceVersion;
-                       }
-                       set 
-                       {
-                               sourceVersion = value;
-                       }
-               }
-               #endregion
-               #region IDbDataParameter properties
-               public byte Precision 
-               {
-                       get 
-                       { 
-                               return precision;
-                       }
-                       set 
-                       { 
-                               precision = value; 
-                       }
-               }
-               
-               public byte Scale 
-               {
-                       get 
-                       { 
-                               return scale;
-                       }
-                       set 
-                       { 
-                               scale = value; 
-                       }
-               }
-               
-               public int Size 
-               {
-                       get 
-                       {
-                               return size;
-                       }
-                       set 
-                       { 
-                               size = value;
-                       }
-               }
-               #endregion
-               #region Value
-               ///
-               /// The actual parameter data
-               /// 
-               public object Value 
-               {
-                       get
-                       {
-                               return dataVal;
-                       }
-                       set 
-                       {
-                               this.dataVal = value;
-                       }
-               }
-               #endregion
-               #endregion
-               #region inferType Method
-               /// <summary>
-               /// Determine the data type based on the value
-               /// </summary>
-               private void InferType()
-               {
-                       if(Value == null)
-                               throw new ArgumentException("No DB2Parameter.Value found");
-
-                       if(Value is IConvertible)
-                       {
-                               switch(((IConvertible)Value).GetTypeCode())
-                               {
-                                       case TypeCode.Char:      dbType = DbType.Byte;       db2Type = DB2Type.SmallInt;    db2DataType = DB2Constants.SQL_WCHAR;           break;
-                                       case TypeCode.Boolean:   dbType = DbType.Byte;       db2Type = DB2Type.SmallInt;    db2DataType = DB2Constants.SQL_BIT;             break;
-                                       case TypeCode.SByte:
-                                       case TypeCode.Byte:      dbType = DbType.Byte;       db2Type = DB2Type.SmallInt;    db2DataType = DB2Constants.SQL_UTINYINT;        break;
-                                       case TypeCode.UInt16:
-                                       case TypeCode.Int16:     dbType = DbType.Int16;      db2Type = DB2Type.SmallInt;    db2DataType = DB2Constants.SQL_SMALLINT;        break;
-                                       case TypeCode.UInt32:
-                                       case TypeCode.Int32:     dbType = DbType.Int32;      db2Type = DB2Type.Integer;     db2DataType = DB2Constants.SQL_INTEGER;         break;
-                                       case TypeCode.UInt64:
-                                       case TypeCode.Int64:     dbType = DbType.Int64;      db2Type = DB2Type.BigInt;      db2DataType = DB2Constants.SQL_BIGINT;          break;
-                                       case TypeCode.Single:    dbType = DbType.Single;     db2Type = DB2Type.Float;       db2DataType = DB2Constants.SQL_REAL;            break;
-                                       case TypeCode.Double:    dbType = DbType.Double;     db2Type = DB2Type.Double;      db2DataType = DB2Constants.SQL_DOUBLE;          break;
-                                       case TypeCode.Decimal:   dbType = DbType.Decimal;    db2Type = DB2Type.Decimal;     db2DataType = DB2Constants.SQL_DECIMAL;         break;
-                                       case TypeCode.DateTime:  dbType = DbType.DateTime;   db2Type = DB2Type.Timestamp;   db2DataType = DB2Constants.SQL_TYPE_TIMESTAMP;  break;
-                                       case TypeCode.String:    dbType = DbType.String;     db2Type = DB2Type.VarChar;     db2DataType = DB2Constants.SQL_WCHAR;           break;
-
-                                       case TypeCode.Object:
-                                       case TypeCode.DBNull:
-                                       case TypeCode.Empty:
-                                               throw new SystemException("Unknown data type");
-                                       default:
-                                               throw new SystemException("Value is of unknown data type");
-                               }
-                       }
-                       else if(Value is byte[])
-                       {
-                               dbType = DbType.Binary;
-                               db2Type = DB2Type.VarBinary;
-                               db2DataType = DB2Constants.SQL_VARBINARY;
-                       }
-                       else if(Value is TimeSpan)
-                       {
-                               dbType = DbType.Time;
-                               db2Type = DB2Type.Time;
-                               db2DataType = DB2Constants.SQL_TYPE_TIME;
-                       }
-                       else
-                       {
-                               throw new NotSupportedException("Value is of unsupported data type");
-                       }
-               }
-               #endregion
-               
-               internal void CalculateRequiredmemory()
-               {
-                       if((direction == ParameterDirection.Input) || (direction == ParameterDirection.InputOutput))
-                       {
-                               if(Value == null)
-                                       throw new ArgumentException("Value missing");
-                       }
-                       if(dbType == DbType.Object)
-                       {
-                               if((direction == ParameterDirection.Output) || (direction == ParameterDirection.ReturnValue))
-                                       throw new ArgumentException("Unknown type");
-
-                               if((direction != ParameterDirection.Input) || !Convert.IsDBNull(Value))
-                               {
-                                       InferType();
-                               }
-                       }
-
-                       if((db2DataType == DB2Constants.SQL_VARBINARY) ||
-                               (db2DataType == DB2Constants.SQL_WCHAR))
-                       {
-                               if(Size <= 0)
-                               {
-                                       if(direction != ParameterDirection.Input)
-                                               throw new ArgumentException("Size not specified");
-                                       if(Value == DBNull.Value)
-                                               requiredMemory = 0;
-                                       else if(Value is string)
-                                               requiredMemory = ((string)Value).Length;
-                                       else if(Value is byte[])
-                                               requiredMemory = ((byte[])Value).Length;
-                                       else
-                                               throw new ArgumentException("wrong type!?");
-                               }
-                               else
-                               {
-                                       requiredMemory = Size;
-                               }
-                               if(db2DataType == DB2Constants.SQL_WCHAR)
-                                       requiredMemory = (requiredMemory * 2) + 2;
-                               requiredMemory = (requiredMemory | 0xf) + 1;
-                       }
-                       requiredMemory = Math.Max(128, requiredMemory);
-               }
-
-               #region Bind 
-               ///
-               /// Bind this parameter
-               /// 
-               internal short Bind(IntPtr hwndStmt, short paramNum)
-               {
-                       int inLength = requiredMemory;
-                       db2LastUsedDataType = db2DataType;
-                       short db2CType = DB2Constants.SQL_C_DEFAULT;
-                       if((direction == ParameterDirection.Input) || (direction == ParameterDirection.InputOutput))
-                       {
-                               if(Convert.IsDBNull(Value))
-                               {
-                                       inLength = DB2Constants.SQL_NULL_DATA;
-                                       if((db2DataType == DB2Constants.SQL_UNKNOWN_TYPE) || 
-                                               (db2DataType == DB2Constants.SQL_DECIMAL))
-                                       {
-                                               db2LastUsedDataType = DB2Constants.SQL_VARGRAPHIC;
-                                               db2CType = DB2Constants.SQL_C_WCHAR;
-                                       }
-                               }
-                       }
-                       if((direction == ParameterDirection.Input) || (direction == ParameterDirection.InputOutput))
-                       {
-                               
-                               switch (db2DataType) 
-                               {
-                                       
-                                       case DB2Constants.SQL_WCHAR:
-                                               string tmpString = Convert.ToString(Value);
-                                               inLength =  tmpString.Length;
-                                               if((Size > 0) && (inLength > Size))
-                                                       inLength = Size;
-                                               
-                                               
-                                               Marshal.Copy(tmpString.ToCharArray(), 0, internalBuffer, inLength);
-                                               inLength *= 2;
-                                               
-                                               db2LastUsedDataType = DB2Constants.SQL_VARGRAPHIC;
-                                               db2CType = DB2Constants.SQL_C_WCHAR;
-                                               break;
-                                       case DB2Constants.SQL_VARBINARY:
-                                               byte[] tmpBytes = (byte[])Value;
-                                               inLength = tmpBytes.Length;
-                                               if((Size > 0) && (inLength > Size))
-                                                       inLength = Size;
-                                               
-                                               Marshal.Copy(tmpBytes, 0, internalBuffer, inLength);
-                                               db2CType = DB2Constants.SQL_TYPE_BINARY;
-                                               break;
-                                       case DB2Constants.SQL_BIT:
-                                       case DB2Constants.SQL_UTINYINT:
-                                       case DB2Constants.SQL_SMALLINT:
-                                               
-                                               Marshal.WriteInt16(internalBuffer, Convert.ToInt16(Value));
-                                               db2CType = DB2Constants.SQL_C_SSHORT;
-                                               break;
-                                       case DB2Constants.SQL_INTEGER:
-                                               
-                                               Marshal.WriteInt32(internalBuffer, Convert.ToInt32(Value));
-                                               db2CType = DB2Constants.SQL_C_SLONG;
-                                               break;
-                                       case DB2Constants.SQL_BIGINT:
-                                               
-                                               Marshal.WriteInt64(internalBuffer, Convert.ToInt64(Value));
-                                               db2CType = DB2Constants.SQL_C_SBIGINT;
-                                               break;
-                                       case DB2Constants.SQL_REAL:
-                                               
-                                               Marshal.StructureToPtr((float)Convert.ToDouble(Value), internalBuffer, false);
-                                               db2CType = DB2Constants.SQL_C_TYPE_REAL;
-                                               break;
-                                       case DB2Constants.SQL_DOUBLE:
-                                               
-                                               Marshal.StructureToPtr(Convert.ToDouble(Value), internalBuffer, false);
-                                               db2CType = DB2Constants.SQL_C_DOUBLE;
-                                               break;
-                                       case DB2Constants.SQL_DECIMAL:
-                                               byte[] tmpDecimalData = System.Text.Encoding.UTF8.GetBytes(
-                                                       Convert.ToDecimal(Value).ToString(System.Globalization.CultureInfo.InvariantCulture));
-                                               inLength =  Math.Min(tmpDecimalData.Length, requiredMemory);
-                                               
-                                               Marshal.Copy(tmpDecimalData, 0, internalBuffer, inLength);
-                                               db2LastUsedDataType = DB2Constants.SQL_VARCHAR;
-                                               db2CType = DB2Constants.SQL_C_CHAR;
-                                               break;
-                                       case DB2Constants.SQL_TYPE_DATE:
-                                               DateTime tmpDate = Convert.ToDateTime(Value);
-                                               Marshal.WriteInt16(internalBuffer, 0,  (short)tmpDate.Year);
-                                               Marshal.WriteInt16(internalBuffer, 2,  (short)tmpDate.Month);
-                                               Marshal.WriteInt16(internalBuffer, 4,  (short)tmpDate.Day);
-                                               db2CType = DB2Constants.SQL_C_TYPE_DATE;
-                                               break;
-                                       case DB2Constants.SQL_TYPE_TIMESTAMP:
-                                               DateTime tmpDateTime = Convert.ToDateTime(Value);
-                                               Marshal.WriteInt16(internalBuffer, 0,  (short)tmpDateTime.Year);
-                                               Marshal.WriteInt16(internalBuffer, 2,  (short)tmpDateTime.Month);
-                                               Marshal.WriteInt16(internalBuffer, 4,  (short)tmpDateTime.Day);
-                                               Marshal.WriteInt16(internalBuffer, 6,  (short)tmpDateTime.Hour);
-                                               Marshal.WriteInt16(internalBuffer, 8,  (short)tmpDateTime.Minute);
-                                               Marshal.WriteInt16(internalBuffer, 10, (short)tmpDateTime.Second);
-                                               Marshal.WriteInt32(internalBuffer, 12, (int)((tmpDateTime.Ticks % 10000000) * 100));
-                                               db2CType = DB2Constants.SQL_C_TYPE_TIMESTAMP;
-                                               break;
-                                       case DB2Constants.SQL_TYPE_TIME:
-                                               TimeSpan tmpTime = (TimeSpan)Value;
-                                               Marshal.WriteInt16(internalBuffer, 0,  (short)tmpTime.Hours);
-                                               Marshal.WriteInt16(internalBuffer, 2,  (short)tmpTime.Minutes);
-                                               Marshal.WriteInt16(internalBuffer, 4,  (short)tmpTime.Seconds);
-                                               db2CType = DB2Constants.SQL_C_TYPE_TIME;
-                                               break;
-                               }
-                       }
-                       else
-                       {
-                               switch (db2DataType) 
-                               {
-                                       case DB2Constants.SQL_WCHAR:
-                                               db2LastUsedDataType = DB2Constants.SQL_VARGRAPHIC;
-                                               db2CType = DB2Constants.SQL_C_WCHAR;
-                                               break;
-                                       case DB2Constants.SQL_VARBINARY:
-                                               db2CType = DB2Constants.SQL_TYPE_BINARY;
-                                               break;
-                                       case DB2Constants.SQL_BIT:
-                                       case DB2Constants.SQL_UTINYINT:
-                                       case DB2Constants.SQL_SMALLINT:
-                                               db2CType = DB2Constants.SQL_C_SSHORT;
-                                               break;
-                                       case DB2Constants.SQL_INTEGER:
-                                               db2CType = DB2Constants.SQL_C_SLONG;
-                                               break;
-                                       case DB2Constants.SQL_BIGINT:
-                                               db2CType = DB2Constants.SQL_C_SBIGINT;
-                                               break;
-                                       case DB2Constants.SQL_REAL:
-                                               db2CType = DB2Constants.SQL_C_TYPE_REAL;
-                                               break;
-                                       case DB2Constants.SQL_DOUBLE:
-                                               db2CType = DB2Constants.SQL_C_DOUBLE;
-                                               break;
-                                       case DB2Constants.SQL_DECIMAL:
-                                               db2LastUsedDataType = DB2Constants.SQL_VARCHAR;
-                                               db2CType = DB2Constants.SQL_C_CHAR;
-                                               break;
-                                       case DB2Constants.SQL_TYPE_DATE:
-                                               db2CType = DB2Constants.SQL_C_TYPE_DATE;
-                                               break;
-                                       case DB2Constants.SQL_TYPE_TIMESTAMP:
-                                               db2CType = DB2Constants.SQL_C_TYPE_TIMESTAMP;
-                                               break;
-                                       case DB2Constants.SQL_TYPE_TIME:
-                                               db2CType = DB2Constants.SQL_C_TYPE_TIME;
-                                               break;
-                               }
-                       }
-                       Marshal.WriteInt32(internalLengthBuffer, inLength);
-                       short sqlRet = DB2CLIWrapper.SQLBindParameter(hwndStmt, paramNum, db2Direction, 
-                               db2CType, db2LastUsedDataType, Size, Scale,
-                               internalBuffer, requiredMemory, internalLengthBuffer);
-
-                       return sqlRet;
-               }
-               #endregion
-               object ICloneable.Clone ()
-               {
-                       DB2Parameter clone = new DB2Parameter();
-                       clone.dbType = dbType;
-                       clone.db2Type = db2Type;
-                       clone.db2DataType = db2DataType;
-                       clone.db2LastUsedDataType = db2LastUsedDataType;
-                       clone.direction = direction;
-                       clone.db2Direction = db2Direction;
-                       clone.nullable = nullable;
-                       clone.parameterName = parameterName;
-                       clone.sourceColumn = sourceColumn;
-                       clone.sourceVersion = sourceVersion;
-                       clone.dataVal = dataVal;
-                       clone.scale = scale;
-                       clone.precision = precision;
-                       clone.size = size;
-                       if(dataVal is ICloneable)
-                       {
-                               clone.dataVal = ((ICloneable)dataVal).Clone();
-                       }
-                       return clone;
-               }
-               
-               internal void GetOutValue()
-               {
-                       int length = Marshal.ReadInt32(internalLengthBuffer);
-                       if(length == DB2Constants.SQL_NULL_DATA)
-                       {
-                               dataVal = DBNull.Value;
-                               return;
-                       }
-                       switch(DB2Type) 
-                       {
-                               case DB2Type.SmallInt:
-                                       dataVal = Marshal.ReadInt16(internalBuffer);
-                                       break;
-                               case DB2Type.Integer:
-                                       dataVal = Marshal.ReadInt32(internalBuffer);
-                                       break;
-                               case DB2Type.BigInt:
-                                       dataVal = Marshal.ReadInt64(internalBuffer);
-                                       break;
-                               case DB2Type.Double:
-                                       dataVal = Marshal.PtrToStructure(internalBuffer, typeof(Double));
-                                       break;
-                               case DB2Type.Float:
-                                       dataVal = Marshal.PtrToStructure(internalBuffer, typeof(Single));
-                                       break;
-                               case DB2Type.Char:
-                               case DB2Type.VarChar:
-                               case DB2Type.LongVarChar:
-                               case DB2Type.Graphic:
-                               case DB2Type.VarGraphic:
-                               case DB2Type.LongVarGraphic:
-                               case DB2Type.Clob:
-                               case DB2Type.DbClob:
-                                       dataVal = Marshal.PtrToStringUni(internalBuffer, Math.Min(Size, length / 2));
-                                       break;
-                               case DB2Type.Binary:
-                               case DB2Type.VarBinary:
-                               case DB2Type.LongVarBinary:
-                               case DB2Type.Blob:
-                               case DB2Type.Datalink:
-                                       length = Math.Min(Size, length);
-                                       dataVal = new byte[length];
-                                       Marshal.Copy(internalBuffer, (byte[])dataVal, 0, length);
-                                       break;
-                               case DB2Type.Decimal:
-                                       dataVal = decimal.Parse(Marshal.PtrToStringAnsi(internalBuffer, length), 
-                                               System.Globalization.CultureInfo.InvariantCulture);
-                                       break;
-                               case DB2Type.Timestamp:
-                                       DateTime dtTmp = new DateTime(
-                                               Marshal.ReadInt16(internalBuffer, 0),  // year
-                                               Marshal.ReadInt16(internalBuffer, 2),  // month
-                                               Marshal.ReadInt16(internalBuffer, 4),  // day
-                                               Marshal.ReadInt16(internalBuffer, 6),  // hour
-                                               Marshal.ReadInt16(internalBuffer, 8),  // minute
-                                               Marshal.ReadInt16(internalBuffer, 10));// second
-                                       dataVal = dtTmp.AddTicks(Marshal.ReadInt32(internalBuffer, 12) / 100); // nanoseconds 
-                                       break;
-                               case DB2Type.Date:
-                                       dataVal = new DateTime(
-                                               Marshal.ReadInt16(internalBuffer, 0),
-                                               Marshal.ReadInt16(internalBuffer, 2),
-                                               Marshal.ReadInt16(internalBuffer, 4));
-                                       break;
-                               case DB2Type.Time:
-                                       dataVal = new TimeSpan(
-                                               Marshal.ReadInt16(internalBuffer, 0),  // Hour
-                                               Marshal.ReadInt16(internalBuffer, 2),  // Minute
-                                               Marshal.ReadInt16(internalBuffer, 4)); // Second
-                                       break;
-
-                               case DB2Type.Invalid:
-                               case DB2Type.Real:
-                               case DB2Type.Numeric:
-                               case DB2Type.RowId:
-                               case DB2Type.XmlReader:
-                                       throw new NotImplementedException();
-                               default:
-                                       throw new NotSupportedException("unknown data type");
-                       }
-               }
-       }
-}
+using System;\r
+using System.Data;\r
+using System.Runtime.InteropServices;\r
+\r
+namespace IBM.Data.DB2\r
+{\r
+\r
+       public sealed class DB2Parameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable\r
+       {\r
+               private DbType dbType = DbType.Object;\r
+               private DB2Type db2Type = DB2Type.Invalid;\r
+               private short db2DataType = DB2Constants.SQL_UNKNOWN_TYPE;\r
+               private short db2LastUsedDataType = DB2Constants.SQL_UNKNOWN_TYPE;\r
+\r
+               private ParameterDirection direction;\r
+               private short db2Direction = DB2Constants.SQL_PARAM_INPUT;\r
+               private bool nullable = true;\r
+               private string parameterName;\r
+               private string sourceColumn;\r
+               private DataRowVersion sourceVersion;\r
+               private object dataVal;\r
+               private byte scale, precision;\r
+               private int size;\r
+               internal IntPtr internalBuffer;\r
+               internal IntPtr internalLengthBuffer;\r
+               internal int requiredMemory;\r
+\r
+               #region Contructors and destructors\r
+               public DB2Parameter()\r
+               {\r
+                       direction = ParameterDirection.Input;\r
+                       sourceVersion = DataRowVersion.Current;\r
+               } \r
+\r
+               public DB2Parameter(string name, DB2Type type)\r
+               {\r
+                       direction = ParameterDirection.Input;\r
+                       sourceVersion = DataRowVersion.Current;\r
+                       this.ParameterName = name;\r
+                       this.DB2Type = type;\r
+               } \r
+\r
+               public DB2Parameter(string name, DB2Type type, int size)\r
+               {\r
+                       direction = ParameterDirection.Input;\r
+                       sourceVersion = DataRowVersion.Current;\r
+                       this.ParameterName = name;\r
+                       this.DB2Type = type;\r
+                       this.Size = size;\r
+               }\r
+\r
+               public DB2Parameter(string name, DB2Type type, int size, string sourceColumn)\r
+               {\r
+                       direction = ParameterDirection.Input;\r
+                       sourceVersion = DataRowVersion.Current;\r
+                       this.ParameterName = name;\r
+                       this.DB2Type = type;\r
+                       this.Size = size;\r
+                       this.SourceColumn = sourceColumn;\r
+               }\r
+\r
+               public DB2Parameter(string parameterName, object value)\r
+               {\r
+                       direction = ParameterDirection.Input;\r
+                       sourceVersion = DataRowVersion.Current;\r
+                       this.ParameterName = parameterName;\r
+                       this.Value = value;\r
+               }\r
+\r
+               public DB2Parameter(string parameterName, DB2Type db2Type, int size, ParameterDirection parameterDirection, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value)\r
+               {\r
+                       this.ParameterName = parameterName;\r
+                       this.DB2Type = db2Type;\r
+                       this.Size = size;\r
+                       this.Direction = parameterDirection;\r
+                       this.IsNullable = isNullable;\r
+                       this.Precision = precision;\r
+                       this.Scale = scale;\r
+                       this.SourceColumn = srcColumn;\r
+                       this.SourceVersion = srcVersion;\r
+                       this.Value = value;\r
+               }\r
+\r
+               #endregion\r
+\r
+               #region Properties\r
+               #region DbType Property\r
+               public DB2Type DB2Type\r
+               {\r
+                       get \r
+                       {\r
+                               return db2Type;\r
+                       }\r
+                       set \r
+                       {\r
+                               db2Type = value;\r
+                               switch(db2Type)\r
+                               {\r
+                                       case DB2Type.Invalid:        dbType = DbType.Object;            db2DataType = DB2Constants.SQL_UNKNOWN_TYPE;   break;\r
+                                       case DB2Type.SmallInt:       dbType = DbType.Int16;             db2DataType = DB2Constants.SQL_SMALLINT;       break;\r
+                                       case DB2Type.Integer:        dbType = DbType.Int32;             db2DataType = DB2Constants.SQL_INTEGER;        break;\r
+                                       case DB2Type.BigInt:         dbType = DbType.Int64;             db2DataType = DB2Constants.SQL_BIGINT;         break;\r
+                                       case DB2Type.Real:           dbType = DbType.Single;            db2DataType = DB2Constants.SQL_REAL;           break;\r
+                                       case DB2Type.Double:         dbType = DbType.Double;            db2DataType = DB2Constants.SQL_DOUBLE;         break;\r
+                                       case DB2Type.Float:          dbType = DbType.Single;            db2DataType = DB2Constants.SQL_REAL;           break;\r
+                                       case DB2Type.Decimal:        dbType = DbType.Decimal;           db2DataType = DB2Constants.SQL_DECIMAL;        break;\r
+                                       case DB2Type.Numeric:        dbType = DbType.VarNumeric;        db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.Date:           dbType = DbType.Date;              db2DataType = DB2Constants.SQL_TYPE_DATE;      break;\r
+                                       case DB2Type.Time:           dbType = DbType.Time;              db2DataType = DB2Constants.SQL_TYPE_TIME;      break;\r
+                                       case DB2Type.Timestamp:      dbType = DbType.DateTime;          db2DataType = DB2Constants.SQL_TYPE_TIMESTAMP; break;\r
+                                       case DB2Type.Char:           dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.VarChar:        dbType = DbType.StringFixedLength; db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.LongVarChar:    dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.Binary:         dbType = DbType.Binary;            db2DataType = DB2Constants.SQL_VARBINARY;      break;\r
+                                       case DB2Type.VarBinary:      dbType = DbType.Binary;            db2DataType = DB2Constants.SQL_VARBINARY;      break;\r
+                                       case DB2Type.LongVarBinary:  dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.Graphic:        dbType = DbType.StringFixedLength; db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.VarGraphic:     dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.LongVarGraphic: dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.Clob:           dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.Blob:           dbType = DbType.Binary;            db2DataType = DB2Constants.SQL_VARBINARY;      break;\r
+                                       case DB2Type.DbClob:         dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DB2Type.Datalink:       dbType = DbType.Byte;              db2DataType = DB2Constants.SQL_VARBINARY;      break;\r
+                                       case DB2Type.RowId:          dbType = DbType.Decimal;           db2DataType = DB2Constants.SQL_DECIMAL;        break;\r
+                                       case DB2Type.XmlReader:      dbType = DbType.String;            db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       default:\r
+                                               throw new NotSupportedException("Value is of unknown data type");\r
+                               }\r
+                       }\r
+               }\r
+               ///\r
+               /// Parameter data type\r
+               /// \r
+               public DbType DbType\r
+               {\r
+                       get \r
+                       {\r
+                               return dbType;\r
+                       }\r
+                       set \r
+                       {\r
+                               dbType = value;\r
+                               switch(dbType)\r
+                               {\r
+                                       case DbType.AnsiString:             db2Type = DB2Type.VarChar;    db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DbType.AnsiStringFixedLength:  db2Type = DB2Type.Char;       db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DbType.Binary:                 db2Type = DB2Type.Binary;     db2DataType = DB2Constants.SQL_VARBINARY;      break;\r
+                                       case DbType.Boolean:                db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_BIT;            break;\r
+                                       case DbType.Byte:                   db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_UTINYINT;       break;\r
+                                       case DbType.Currency:               db2Type = DB2Type.Decimal;    db2DataType = DB2Constants.SQL_DECIMAL;        break;\r
+                                       case DbType.Date:                   db2Type = DB2Type.Date;       db2DataType = DB2Constants.SQL_TYPE_DATE;      break;\r
+                                       case DbType.DateTime:               db2Type = DB2Type.Timestamp;  db2DataType = DB2Constants.SQL_TYPE_TIMESTAMP; break;\r
+                                       case DbType.Decimal:                db2Type = DB2Type.Decimal;    db2DataType = DB2Constants.SQL_DECIMAL;        break;\r
+                                       case DbType.Double:                 db2Type = DB2Type.Double;     db2DataType = DB2Constants.SQL_DOUBLE;         break;\r
+                                       case DbType.Guid:                   db2Type = DB2Type.Binary;     db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DbType.Int16:                  db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_SMALLINT;       break;\r
+                                       case DbType.Int32:                  db2Type = DB2Type.Integer;    db2DataType = DB2Constants.SQL_INTEGER;        break;\r
+                                       case DbType.Int64:                  db2Type = DB2Type.BigInt;     db2DataType = DB2Constants.SQL_BIGINT;         break;\r
+                                       case DbType.Object:                 db2Type = DB2Type.Invalid;    db2DataType = DB2Constants.SQL_UNKNOWN_TYPE;   break;\r
+                                       case DbType.SByte:                  db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_UTINYINT;       break;\r
+                                       case DbType.Single:                 db2Type = DB2Type.Float;      db2DataType = DB2Constants.SQL_REAL;           break;\r
+                                       case DbType.String:                 db2Type = DB2Type.VarChar;    db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DbType.StringFixedLength:      db2Type = DB2Type.Char;       db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       case DbType.Time:                   db2Type = DB2Type.Time;       db2DataType = DB2Constants.SQL_TYPE_TIME;      break;\r
+                                       case DbType.UInt16:                 db2Type = DB2Type.SmallInt;   db2DataType = DB2Constants.SQL_SMALLINT;       break;\r
+                                       case DbType.UInt32:                 db2Type = DB2Type.Integer;    db2DataType = DB2Constants.SQL_INTEGER;        break;\r
+                                       case DbType.UInt64:                 db2Type = DB2Type.BigInt;     db2DataType = DB2Constants.SQL_BIGINT;         break;\r
+                                       case DbType.VarNumeric:             db2Type = DB2Type.Numeric;    db2DataType = DB2Constants.SQL_WCHAR;          break;\r
+                                       default:\r
+                                               throw new NotSupportedException("Value is of unknown data type");\r
+                               }\r
+                       }\r
+               }\r
+\r
+               #endregion\r
+               #region Direction\r
+               ///\r
+               /// In or out parameter, or both\r
+               /// \r
+               public ParameterDirection Direction\r
+               {\r
+                       get \r
+                       {\r
+                               return direction;\r
+                       }\r
+                       set \r
+                       {\r
+                               direction = value;\r
+                               switch(direction)\r
+                               {\r
+                                       default:\r
+                                       case ParameterDirection.Input:                  db2Direction = DB2Constants.SQL_PARAM_INPUT;            break;\r
+                                       case ParameterDirection.Output:                 db2Direction = DB2Constants.SQL_PARAM_OUTPUT;           break;\r
+                                       case ParameterDirection.InputOutput:    db2Direction = DB2Constants.SQL_PARAM_INPUT_OUTPUT;     break;\r
+                                       case ParameterDirection.ReturnValue:    db2Direction = DB2Constants.SQL_RETURN_VALUE;           break;\r
+                               }\r
+                       }\r
+               }\r
+               #endregion\r
+               #region IsNullable\r
+               ///\r
+               /// Does this parameter support a null value\r
+               /// \r
+               public bool IsNullable \r
+               {\r
+                       get \r
+                       {\r
+                               return nullable;\r
+                       }\r
+                       set \r
+                       {\r
+                               nullable = value;\r
+                       }\r
+               }\r
+               #endregion\r
+               #region ParameterName\r
+               public string ParameterName\r
+               {\r
+                       get \r
+                       {\r
+                               return parameterName;\r
+                       }\r
+                       set \r
+                       {\r
+                               parameterName = value;\r
+                       }\r
+               }\r
+               #endregion\r
+               #region SourceColumn\r
+               ///\r
+               /// Gets or sets the name of the source column that is mapped to the DataSet\r
+               /// \r
+               public string SourceColumn\r
+               {\r
+                       get \r
+                       {\r
+                               return sourceColumn;\r
+                       }\r
+                       set \r
+                       {\r
+                               sourceColumn = value;\r
+                       }\r
+               }\r
+               #endregion\r
+               #region SourceVersion\r
+               ///\r
+               /// DataRowVersion property\r
+               /// \r
+               public DataRowVersion SourceVersion \r
+               {\r
+                       get \r
+                       {\r
+                               return sourceVersion;\r
+                       }\r
+                       set \r
+                       {\r
+                               sourceVersion = value;\r
+                       }\r
+               }\r
+               #endregion\r
+               #region IDbDataParameter properties\r
+               public byte Precision \r
+               {\r
+                       get \r
+                       { \r
+                               return precision;\r
+                       }\r
+                       set \r
+                       { \r
+                               precision = value; \r
+                       }\r
+               }\r
+               \r
+               public byte Scale \r
+               {\r
+                       get \r
+                       { \r
+                               return scale;\r
+                       }\r
+                       set \r
+                       { \r
+                               scale = value; \r
+                       }\r
+               }\r
+               \r
+               public int Size \r
+               {\r
+                       get \r
+                       {\r
+                               return size;\r
+                       }\r
+                       set \r
+                       { \r
+                               size = value;\r
+                       }\r
+               }\r
+               #endregion\r
+               #region Value\r
+               ///\r
+               /// The actual parameter data\r
+               /// \r
+               public object Value \r
+               {\r
+                       get\r
+                       {\r
+                               return dataVal;\r
+                       }\r
+                       set \r
+                       {\r
+                               this.dataVal = value;\r
+                       }\r
+               }\r
+               #endregion\r
+               #endregion\r
+               \r
+               #region inferType Method\r
+               /// <summary>\r
+               /// Determine the data type based on the value\r
+               /// </summary>\r
+               private void InferType()\r
+               {\r
+                       if(Value == null)\r
+                               throw new ArgumentException("No DB2Parameter.Value found");\r
+\r
+                       if(Value is IConvertible)\r
+                       {\r
+                               switch(((IConvertible)Value).GetTypeCode())\r
+                               {\r
+                                       case TypeCode.Char:      dbType = DbType.Byte;       db2Type = DB2Type.SmallInt;    db2DataType = DB2Constants.SQL_WCHAR;           break;\r
+                                       case TypeCode.Boolean:   dbType = DbType.Byte;       db2Type = DB2Type.SmallInt;    db2DataType = DB2Constants.SQL_BIT;             break;\r
+                                       case TypeCode.SByte:\r
+                                       case TypeCode.Byte:      dbType = DbType.Byte;       db2Type = DB2Type.SmallInt;    db2DataType = DB2Constants.SQL_UTINYINT;        break;\r
+                                       case TypeCode.UInt16:\r
+                                       case TypeCode.Int16:     dbType = DbType.Int16;      db2Type = DB2Type.SmallInt;    db2DataType = DB2Constants.SQL_SMALLINT;        break;\r
+                                       case TypeCode.UInt32:\r
+                                       case TypeCode.Int32:     dbType = DbType.Int32;      db2Type = DB2Type.Integer;     db2DataType = DB2Constants.SQL_INTEGER;         break;\r
+                                       case TypeCode.UInt64:\r
+                                       case TypeCode.Int64:     dbType = DbType.Int64;      db2Type = DB2Type.BigInt;      db2DataType = DB2Constants.SQL_BIGINT;          break;\r
+                                       case TypeCode.Single:    dbType = DbType.Single;     db2Type = DB2Type.Float;       db2DataType = DB2Constants.SQL_REAL;            break;\r
+                                       case TypeCode.Double:    dbType = DbType.Double;     db2Type = DB2Type.Double;      db2DataType = DB2Constants.SQL_DOUBLE;          break;\r
+                                       case TypeCode.Decimal:   dbType = DbType.Decimal;    db2Type = DB2Type.Decimal;     db2DataType = DB2Constants.SQL_DECIMAL;         break;\r
+                                       case TypeCode.DateTime:  dbType = DbType.DateTime;   db2Type = DB2Type.Timestamp;   db2DataType = DB2Constants.SQL_TYPE_TIMESTAMP;  break;\r
+                                       case TypeCode.String:    dbType = DbType.String;     db2Type = DB2Type.VarChar;     db2DataType = DB2Constants.SQL_WCHAR;           break;\r
+\r
+                                       case TypeCode.Object:\r
+                                       case TypeCode.DBNull:\r
+                                       case TypeCode.Empty:\r
+                                               throw new SystemException("Unknown data type");\r
+                                       default:\r
+                                               throw new SystemException("Value is of unknown data type");\r
+                               }\r
+                       }\r
+                       else if(Value is byte[])\r
+                       {\r
+                               dbType = DbType.Binary;\r
+                               db2Type = DB2Type.VarBinary;\r
+                               db2DataType = DB2Constants.SQL_VARBINARY;\r
+                       }\r
+                       else if(Value is TimeSpan)\r
+                       {\r
+                               dbType = DbType.Time;\r
+                               db2Type = DB2Type.Time;\r
+                               db2DataType = DB2Constants.SQL_TYPE_TIME;\r
+                       }\r
+                       else\r
+                       {\r
+                               throw new NotSupportedException("Value is of unsupported data type");\r
+                       }\r
+               }\r
+               #endregion\r
+               \r
+               internal void CalculateRequiredmemory()\r
+               {\r
+                       //if((direction == ParameterDirection.Input) || (direction == ParameterDirection.InputOutput))\r
+                       //{\r
+                       //      if(Value == null)\r
+                       //              throw new ArgumentException("Value missing");\r
+                       //}\r
+                       if(dbType == DbType.Object)\r
+                       {\r
+                               if((direction == ParameterDirection.Output) || (direction == ParameterDirection.ReturnValue))\r
+                                       throw new ArgumentException("Unknown type");\r
+\r
+                               if((direction != ParameterDirection.Input) || !Convert.IsDBNull(Value))\r
+                               {\r
+                                       InferType();\r
+                               }\r
+                       }\r
+                       if (db2DataType == DB2Constants.SQL_INTEGER)\r
+                       {\r
+                               requiredMemory = 4;\r
+                       }\r
+                       if((db2DataType == DB2Constants.SQL_VARBINARY) ||\r
+                               (db2DataType == DB2Constants.SQL_WCHAR))\r
+                       {\r
+                               if(Size <= 0)\r
+                               {\r
+                                       if(direction != ParameterDirection.Input)\r
+                                               throw new ArgumentException("Size not specified");\r
+                                       if(Value == DBNull.Value)\r
+                                               requiredMemory = 0;\r
+                                       else if(Value is string)\r
+                                               requiredMemory = ((string)Value).Length;\r
+                                       else if(Value is byte[])\r
+                                               requiredMemory = ((byte[])Value).Length;\r
+                                       else\r
+                                               throw new ArgumentException("wrong type!?");\r
+                               }\r
+                               else\r
+                               {\r
+                                       requiredMemory = Size;\r
+                               }\r
+                               if(db2DataType == DB2Constants.SQL_WCHAR)\r
+                                       requiredMemory = (requiredMemory * 2) + 2;\r
+                               requiredMemory = (requiredMemory | 0xf) + 1;\r
+                       }\r
+                       requiredMemory = Math.Max(128, requiredMemory);\r
+               }\r
+\r
+               #region Bind \r
+               ///\r
+               /// Bind this parameter\r
+               /// \r
+               internal short Bind(IntPtr hwndStmt, short paramNum)\r
+               {\r
+                       int inLength = requiredMemory;\r
+                       db2LastUsedDataType = db2DataType;\r
+                       short db2CType = DB2Constants.SQL_C_DEFAULT;\r
+                       if((direction == ParameterDirection.Input) || (direction == ParameterDirection.InputOutput))\r
+                       {\r
+                               if(Convert.IsDBNull(Value))\r
+                               {\r
+                                       inLength = DB2Constants.SQL_NULL_DATA;\r
+                                       if((db2DataType == DB2Constants.SQL_UNKNOWN_TYPE) || \r
+                                               (db2DataType == DB2Constants.SQL_DECIMAL))\r
+                                       {\r
+                                               db2LastUsedDataType = DB2Constants.SQL_VARGRAPHIC;\r
+                                               db2CType = DB2Constants.SQL_C_WCHAR;\r
+                                       }\r
+                               }\r
+                       }\r
+                       if((direction == ParameterDirection.Input) || (direction == ParameterDirection.InputOutput))\r
+                       {\r
+                               switch (db2DataType) \r
+                               {\r
+                                       case DB2Constants.SQL_WCHAR:\r
+                                               string tmpString = Convert.ToString(Value);\r
+                                               inLength =  tmpString.Length;\r
+                                               if((Size > 0) && (inLength > Size))\r
+                                                       inLength = Size;\r
+                                               Marshal.Copy(tmpString.ToCharArray(), 0, internalBuffer, inLength);\r
+                                               inLength *= 2;\r
+                                               db2LastUsedDataType = DB2Constants.SQL_VARGRAPHIC;\r
+                                               db2CType = DB2Constants.SQL_C_WCHAR;\r
+                                               if(inLength > 32000)\r
+                                               {\r
+                                                       db2LastUsedDataType = DB2Constants.SQL_TYPE_BLOB;\r
+                                               }\r
+                                               break;\r
+                                       case DB2Constants.SQL_VARBINARY:\r
+                                               byte[] tmpBytes = (byte[])Value;\r
+                                               inLength = tmpBytes.Length;\r
+                                               if((Size > 0) && (inLength > Size))\r
+                                                       inLength = Size;\r
+                                               Marshal.Copy(tmpBytes, 0, internalBuffer, inLength);\r
+                                               db2CType = DB2Constants.SQL_TYPE_BINARY;\r
+                                               break;\r
+                                       case DB2Constants.SQL_BIT:\r
+                                       case DB2Constants.SQL_UTINYINT:\r
+                                       case DB2Constants.SQL_SMALLINT:\r
+                                               Marshal.WriteInt16(internalBuffer, Convert.ToInt16(Value));\r
+                                               db2CType = DB2Constants.SQL_C_SSHORT;\r
+                                               break;\r
+                                       case DB2Constants.SQL_INTEGER:\r
+                                               Marshal.WriteInt32(internalBuffer, Convert.ToInt32(Value));\r
+                                               db2CType = DB2Constants.SQL_C_SLONG;\r
+                                               break;\r
+                                       case DB2Constants.SQL_BIGINT:\r
+                                               Marshal.WriteInt64(internalBuffer, Convert.ToInt64(Value));\r
+                                               db2CType = DB2Constants.SQL_C_SBIGINT;\r
+                                               break;\r
+                                       case DB2Constants.SQL_REAL:\r
+                                               Marshal.StructureToPtr((float)Convert.ToDouble(Value), internalBuffer, false);\r
+                                               db2CType = DB2Constants.SQL_C_TYPE_REAL;\r
+                                               break;\r
+                                       case DB2Constants.SQL_DOUBLE:\r
+                                               Marshal.StructureToPtr(Convert.ToDouble(Value), internalBuffer, false);\r
+                                               db2CType = DB2Constants.SQL_C_DOUBLE;\r
+                                               break;\r
+                                       case DB2Constants.SQL_DECIMAL:\r
+                                               byte[] tmpDecimalData = System.Text.Encoding.UTF8.GetBytes(\r
+                                                       Convert.ToDecimal(Value).ToString(System.Globalization.CultureInfo.InvariantCulture));\r
+                                               inLength =  Math.Min(tmpDecimalData.Length, requiredMemory);\r
+                                               Marshal.Copy(tmpDecimalData, 0, internalBuffer, inLength);\r
+                                               db2LastUsedDataType = DB2Constants.SQL_VARCHAR;\r
+                                               db2CType = DB2Constants.SQL_C_CHAR;\r
+                                               break;\r
+                                       case DB2Constants.SQL_TYPE_DATE:\r
+                                               DateTime tmpDate = Convert.ToDateTime(Value);\r
+                                               Marshal.WriteInt16(internalBuffer, 0,  (short)tmpDate.Year);\r
+                                               Marshal.WriteInt16(internalBuffer, 2,  (short)tmpDate.Month);\r
+                                               Marshal.WriteInt16(internalBuffer, 4,  (short)tmpDate.Day);\r
+                                               db2CType = DB2Constants.SQL_C_TYPE_DATE;\r
+                                               break;\r
+                                       case DB2Constants.SQL_TYPE_TIMESTAMP:\r
+                                               DateTime tmpDateTime = Convert.ToDateTime(Value);\r
+                                               Marshal.WriteInt16(internalBuffer, 0,  (short)tmpDateTime.Year);\r
+                                               Marshal.WriteInt16(internalBuffer, 2,  (short)tmpDateTime.Month);\r
+                                               Marshal.WriteInt16(internalBuffer, 4,  (short)tmpDateTime.Day);\r
+                                               Marshal.WriteInt16(internalBuffer, 6,  (short)tmpDateTime.Hour);\r
+                                               Marshal.WriteInt16(internalBuffer, 8,  (short)tmpDateTime.Minute);\r
+                                               Marshal.WriteInt16(internalBuffer, 10, (short)tmpDateTime.Second);\r
+                                               Marshal.WriteInt32(internalBuffer, 12, (int)((tmpDateTime.Ticks % 10000000) * 100));\r
+                                               db2CType = DB2Constants.SQL_C_TYPE_TIMESTAMP;\r
+                                               break;\r
+                                       case DB2Constants.SQL_TYPE_TIME:\r
+                                               TimeSpan tmpTime = (TimeSpan)Value;\r
+                                               Marshal.WriteInt16(internalBuffer, 0,  (short)tmpTime.Hours);\r
+                                               Marshal.WriteInt16(internalBuffer, 2,  (short)tmpTime.Minutes);\r
+                                               Marshal.WriteInt16(internalBuffer, 4,  (short)tmpTime.Seconds);\r
+                                               db2CType = DB2Constants.SQL_C_TYPE_TIME;\r
+                                               break;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               switch (db2DataType) \r
+                               {\r
+                                       case DB2Constants.SQL_WCHAR:\r
+                                               db2LastUsedDataType = DB2Constants.SQL_VARGRAPHIC;\r
+                                               db2CType = DB2Constants.SQL_C_WCHAR;\r
+                                               break;\r
+                                       case DB2Constants.SQL_VARBINARY:\r
+                                               db2CType = DB2Constants.SQL_TYPE_BINARY;\r
+                                               break;\r
+                                       case DB2Constants.SQL_BIT:\r
+                                       case DB2Constants.SQL_UTINYINT:\r
+                                       case DB2Constants.SQL_SMALLINT:\r
+                                               db2CType = DB2Constants.SQL_C_SSHORT;\r
+                                               break;\r
+                                       case DB2Constants.SQL_INTEGER:\r
+                                               db2CType = DB2Constants.SQL_C_SLONG;\r
+                                               break;\r
+                                       case DB2Constants.SQL_BIGINT:\r
+                                               db2CType = DB2Constants.SQL_C_SBIGINT;\r
+                                               break;\r
+                                       case DB2Constants.SQL_REAL:\r
+                                               db2CType = DB2Constants.SQL_C_TYPE_REAL;\r
+                                               break;\r
+                                       case DB2Constants.SQL_DOUBLE:\r
+                                               db2CType = DB2Constants.SQL_C_DOUBLE;\r
+                                               break;\r
+                                       case DB2Constants.SQL_DECIMAL:\r
+                                               db2LastUsedDataType = DB2Constants.SQL_VARCHAR;\r
+                                               db2CType = DB2Constants.SQL_C_CHAR;\r
+                                               break;\r
+                                       case DB2Constants.SQL_TYPE_DATE:\r
+                                               db2CType = DB2Constants.SQL_C_TYPE_DATE;\r
+                                               break;\r
+                                       case DB2Constants.SQL_TYPE_TIMESTAMP:\r
+                                               db2CType = DB2Constants.SQL_C_TYPE_TIMESTAMP;\r
+                                               break;\r
+                                       case DB2Constants.SQL_TYPE_TIME:\r
+                                               db2CType = DB2Constants.SQL_C_TYPE_TIME;\r
+                                               break;\r
+                               }\r
+                       }\r
+                       Marshal.WriteInt32(internalLengthBuffer, inLength);\r
+                       short sqlRet = DB2CLIWrapper.SQLBindParameter(hwndStmt, paramNum, db2Direction, \r
+                               db2CType, db2LastUsedDataType, Size, Scale,\r
+                               internalBuffer, requiredMemory, internalLengthBuffer);\r
+\r
+                       return sqlRet;\r
+               }\r
+               #endregion\r
+               object ICloneable.Clone ()\r
+               {\r
+                       DB2Parameter clone = new DB2Parameter();\r
+                       clone.dbType = dbType;\r
+                       clone.db2Type = db2Type;\r
+                       clone.db2DataType = db2DataType;\r
+                       clone.db2LastUsedDataType = db2LastUsedDataType;\r
+                       clone.direction = direction;\r
+                       clone.db2Direction = db2Direction;\r
+                       clone.nullable = nullable;\r
+                       clone.parameterName = parameterName;\r
+                       clone.sourceColumn = sourceColumn;\r
+                       clone.sourceVersion = sourceVersion;\r
+                       clone.dataVal = dataVal;\r
+                       clone.scale = scale;\r
+                       clone.precision = precision;\r
+                       clone.size = size;\r
+                       if(dataVal is ICloneable)\r
+                       {\r
+                               clone.dataVal = ((ICloneable)dataVal).Clone();\r
+                       }\r
+                       return clone;\r
+               }\r
+               \r
+               internal void GetOutValue()\r
+               {\r
+                       int length = Marshal.ReadInt32(internalLengthBuffer);\r
+                       if(length == DB2Constants.SQL_NULL_DATA)\r
+                       {\r
+                               dataVal = DBNull.Value;\r
+                               return;\r
+                       }\r
+                       switch(DB2Type) \r
+                       {\r
+                               case DB2Type.SmallInt:\r
+                                       dataVal = Marshal.ReadInt16(internalBuffer);\r
+                                       break;\r
+                               case DB2Type.Integer:\r
+                                       dataVal = Marshal.ReadInt32(internalBuffer);\r
+                                       break;\r
+                               case DB2Type.BigInt:\r
+                                       dataVal = Marshal.ReadInt64(internalBuffer);\r
+                                       break;\r
+                               case DB2Type.Double:\r
+                                       dataVal = Marshal.PtrToStructure(internalBuffer, typeof(Double));\r
+                                       break;\r
+                               case DB2Type.Float:\r
+                                       dataVal = Marshal.PtrToStructure(internalBuffer, typeof(Single));\r
+                                       break;\r
+                               case DB2Type.Char:\r
+                               case DB2Type.VarChar:\r
+                               case DB2Type.LongVarChar:\r
+                               case DB2Type.Graphic:\r
+                               case DB2Type.VarGraphic:\r
+                               case DB2Type.LongVarGraphic:\r
+                               case DB2Type.Clob:\r
+                               case DB2Type.DbClob:\r
+                                       dataVal = Marshal.PtrToStringUni(internalBuffer, Math.Min(Size, length / 2));\r
+                                       break;\r
+                               case DB2Type.Binary:\r
+                               case DB2Type.VarBinary:\r
+                               case DB2Type.LongVarBinary:\r
+                               case DB2Type.Blob:\r
+                               case DB2Type.Datalink:\r
+                                       length = Math.Min(Size, length);\r
+                                       dataVal = new byte[length];\r
+                                       Marshal.Copy(internalBuffer, (byte[])dataVal, 0, length);\r
+                                       break;\r
+                               case DB2Type.Decimal:\r
+                                       dataVal = decimal.Parse(Marshal.PtrToStringAnsi(internalBuffer, length), \r
+                                               System.Globalization.CultureInfo.InvariantCulture);\r
+                                       break;\r
+                               case DB2Type.Timestamp:\r
+                                       DateTime dtTmp = new DateTime(\r
+                                               Marshal.ReadInt16(internalBuffer, 0),  // year\r
+                                               Marshal.ReadInt16(internalBuffer, 2),  // month\r
+                                               Marshal.ReadInt16(internalBuffer, 4),  // day\r
+                                               Marshal.ReadInt16(internalBuffer, 6),  // hour\r
+                                               Marshal.ReadInt16(internalBuffer, 8),  // minute\r
+                                               Marshal.ReadInt16(internalBuffer, 10));// second\r
+                                       dataVal = dtTmp.AddTicks(Marshal.ReadInt32(internalBuffer, 12) / 100); // nanoseconds \r
+                                       break;\r
+                               case DB2Type.Date:\r
+                                       dataVal = new DateTime(\r
+                                               Marshal.ReadInt16(internalBuffer, 0),\r
+                                               Marshal.ReadInt16(internalBuffer, 2),\r
+                                               Marshal.ReadInt16(internalBuffer, 4));\r
+                                       break;\r
+                               case DB2Type.Time:\r
+                                       dataVal = new TimeSpan(\r
+                                               Marshal.ReadInt16(internalBuffer, 0),  // Hour\r
+                                               Marshal.ReadInt16(internalBuffer, 2),  // Minute\r
+                                               Marshal.ReadInt16(internalBuffer, 4)); // Second\r
+                                       break;\r
+\r
+                               case DB2Type.Invalid:\r
+                               case DB2Type.Real:\r
+                               case DB2Type.Numeric:\r
+                               case DB2Type.RowId:\r
+                               case DB2Type.XmlReader:\r
+                                       throw new NotImplementedException();\r
+                               default:\r
+                                       throw new NotSupportedException("unknown data type");\r
+                       }\r
+               }\r
+       }\r
+}\r
index fc2516301c1350620f2e89fb0f2b7b0d45409a85..856288d7dd6eadf32bccb06236a32f5728394df4 100755 (executable)
@@ -32,4 +32,39 @@ namespace IBM.Data.DB2
                RowId = 25,\r
                XmlReader = 26,\r
        }\r
+       public class DB2TypeConverter\r
+       {\r
+               public static Type GetManagedType(int sql_type)\r
+               {\r
+                       switch(sql_type)\r
+                       {\r
+                               case DB2Constants.SQL_INTEGER:\r
+                                       return typeof(int);\r
+                               case DB2Constants.SQL_SMALLINT:\r
+                                       return typeof(short);\r
+                               case DB2Constants.SQL_BIGINT:\r
+                                       return typeof(long);\r
+                               case DB2Constants.SQL_DOUBLE:\r
+                                       return typeof(double);\r
+                               case DB2Constants.SQL_DECIMAL:\r
+                                       return typeof(decimal);\r
+                               case DB2Constants.SQL_DATETIME:\r
+                               case DB2Constants.SQL_TYPE_DATE:\r
+                               case DB2Constants.SQL_TYPE_TIMESTAMP:\r
+                                       return typeof(DateTime);\r
+                               case DB2Constants.SQL_TYPE_TIME:\r
+                                       return typeof(TimeSpan);\r
+                               case DB2Constants.SQL_CHAR:\r
+                               case DB2Constants.SQL_VARCHAR:\r
+                               case DB2Constants.SQL_TYPE_CLOB:\r
+                                       return typeof(string);\r
+                               case DB2Constants.SQL_TYPE_BLOB:\r
+                               case DB2Constants.SQL_TYPE_BINARY:\r
+                               case DB2Constants.SQL_LONGVARBINARY:\r
+                               case DB2Constants.SQL_VARBINARY:\r
+                                       return typeof(byte[]);\r
+                       }\r
+                       throw new NotImplementedException("Unknown SQL type " + sql_type);\r
+               }\r
+       }\r
 }\r