public void ConnectThrowsExceptionIfAlreadyConnected() { const string anyConnectionStringWillDo = "x"; var driver = new Mock<IOdbcDriver>(); using (var environmentHandle = new OdbcEnvironmentHandle(OdbcVersion.Version38, OdbcConnectionPooling.None, driver.Object)) { using (IOdbcConnection sut = new OdbcConnectionHandle(environmentHandle, driver.Object)) { sut.SetPrivateFieldValue("_connected", true); var bc = sut; try { TestHelper.AssertThrows<InvalidOperationException>(() => bc.Connect(anyConnectionStringWillDo)); } finally { sut.SetPrivateFieldValue("_connected", false); } } } }
internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLDriverConnectW( /*SQLHDBC*/ OdbcConnectionHandle hdbc, /*SQLHWND*/ IntPtr hwnd, /*SQLCHAR* */ string connectionstring, /*SQLSMALLINT*/ Int16 cbConnectionstring, /*SQLCHAR* */ IntPtr connectionstringout, /*SQLSMALLINT*/ Int16 cbConnectionstringoutMax, /*SQLSMALLINT* */ out Int16 cbConnectionstringout, /*SQLUSMALLINT*/ Int16 fDriverCompletion);
internal static partial ODBC32.SQLRETURN SQLDriverConnectW( /*SQLHDBC*/ OdbcConnectionHandle hdbc, /*SQLHWND*/ IntPtr hwnd, /*SQLCHAR* */ string connectionstring, /*SQLSMALLINT*/ short cbConnectionstring, /*SQLCHAR* */ IntPtr connectionstringout, /*SQLSMALLINT*/ short cbConnectionstringoutMax, /*SQLSMALLINT* */ out short cbConnectionstringout, /*SQLUSMALLINT*/ short fDriverCompletion);
internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLDriverConnectW( /*SQLHDBC*/ OdbcConnectionHandle hdbc, /*SQLHWND*/ IntPtr hwnd, [In, MarshalAs(UnmanagedType.LPWStr)] /*SQLCHAR* */ string connectionstring, /*SQLSMALLINT*/ short cbConnectionstring, /*SQLCHAR* */ IntPtr connectionstringout, /*SQLSMALLINT*/ short cbConnectionstringoutMax, /*SQLSMALLINT* */ out short cbConnectionstringout, /*SQLUSMALLINT*/ short fDriverCompletion);
internal static IntPtr AllocateStatementHandle(OdbcConnectionHandle connectionHandle) { if (connectionHandle == null) throw new ArgumentNullException("connectionHandle"); IntPtr handle; var result = NativeMethods.SQLAllocHandle(OdbcHandleType.Statement, connectionHandle, out handle); if ((result == OdbcReturnCode.Success) || (result == OdbcReturnCode.SuccessWithInfo)) return handle; var ex = GetException(connectionHandle, "Unable to allocate ODBC statement handle."); throw ex; }
public void ConnectThrowsExceptionWhenTableNameIsNullOrEmpty() { var driver = new Mock<IOdbcDriver>(); using (var environmentHandle = new OdbcEnvironmentHandle(OdbcVersion.Version38, OdbcConnectionPooling.None, driver.Object)) { using (IOdbcConnection sut = new OdbcConnectionHandle(environmentHandle, driver.Object)) { var bc = sut; TestHelper.AssertThrows<ArgumentException>(() => bc.Connect(null)); TestHelper.AssertThrows<ArgumentException>(() => bc.Connect(string.Empty)); } } }
internal OdbcStatementHandle(OdbcConnectionHandle parentHandle) { if (parentHandle == null) throw new ArgumentNullException("parentHandle"); handle = OdbcMethods.AllocateStatementHandle(parentHandle); var success = false; parentHandle.DangerousAddRef(ref success); if (!success) { throw new Exception("Unable to increment ODBC connection handle reference count."); } _parentHandle = parentHandle; }
internal static partial ODBC32.SQLRETURN SQLSetConnectAttrW( /*SQLHBDC*/ OdbcConnectionHandle ConnectionHandle, /*SQLINTEGER*/ ODBC32.SQL_ATTR Attribute, /*SQLPOINTER*/ string Value, /*SQLINTEGER*/ int StringLength);
internal static extern ODBC32.RetCode SQLDriverConnectW(OdbcConnectionHandle hdbc, IntPtr hwnd, [In, MarshalAs(UnmanagedType.LPWStr)] string connectionstring, short cbConnectionstring, IntPtr connectionstringout, short cbConnectionstringoutMax, out short cbConnectionstringout, short fDriverCompletion);
internal static extern ODBC32.RetCode SQLSetConnectAttrW(OdbcConnectionHandle ConnectionHandle, ODBC32.SQL_ATTR Attribute, IDtcTransaction Value, int StringLength);
internal static extern OdbcReturnCode SQLAllocHandle(OdbcHandleType handleType, OdbcConnectionHandle inputHandle, out IntPtr outputHandle);
internal static extern OdbcReturnCode SQLDriverConnectW(OdbcConnectionHandle connectionHandle, IntPtr windowHandle, [In, MarshalAs(UnmanagedType.LPWStr)] string inConnectionString, short inConnectionStringLength, StringBuilder outConnectionStringBuffer, short bufferLength, out short bufferLengthNeeded, short fDriverCompletion);
internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLSetConnectAttrW( /*SQLHBDC*/ OdbcConnectionHandle ConnectionHandle, /*SQLINTEGER*/ ODBC32.SQL_ATTR Attribute, /*SQLPOINTER*/ System.Transactions.IDtcTransaction Value, /*SQLINTEGER*/ Int32 StringLength);
internal static void SetBcpFlag(OdbcConnectionHandle connectionHandle) { if (connectionHandle == null) throw new ArgumentNullException("connectionHandle"); const int bcpOn = 1; // SQL_BCP_ON: enables bulk copy functions on a connection. var result = NativeMethods.SQLSetConnectAttr(connectionHandle, OdbcConnectionAttribute.EnableBcp, bcpOn, 0); if ((result == OdbcReturnCode.Success) || (result == OdbcReturnCode.SuccessWithInfo)) return; var ex = GetException(connectionHandle, "Unable to set BCP connection flag."); throw ex; }
protected override bool bcp_initW(OdbcConnectionHandle hdbc, string szTable, int eDirection) { return NativeMethods.bcp_initW(hdbc, szTable, Constants.IntPtrZero, Constants.IntPtrZero, eDirection); }
protected override bool bcp_moretext(OdbcConnectionHandle hdbc, int cbData, byte* pData) { return NativeMethods.bcp_moretext(hdbc, cbData, pData); }
protected override bool bcp_collen(OdbcConnectionHandle hdbc, int cbData, int idxServerCol) { return NativeMethods.bcp_collen(hdbc, cbData, idxServerCol); }
protected override int bcp_done(OdbcConnectionHandle hdbc) { return NativeMethods.bcp_done(hdbc); }
protected override bool bcp_bind(OdbcConnectionHandle hdbc, byte* pData, int cbIndicator, int cbData, byte* pTerm, int cbTerm, int eDataType, int idxServerCol) { return NativeMethods.bcp_bind(hdbc, pData, cbIndicator, cbData, pTerm, cbTerm, eDataType, idxServerCol); }
public void ConstructorThrowsExceptionWhenParentHandleIsNull() { var driver = new Mock<IOdbcDriver>(); var sut = new OdbcConnectionHandle(null, driver.Object); }
public void ConstructorThrowsExceptionWhenDriverIsNull() { var driver = new Mock<IOdbcDriver>(); using (var environmentHandle = new OdbcEnvironmentHandle(OdbcVersion.Version38, OdbcConnectionPooling.None, driver.Object)) { var sut = new OdbcConnectionHandle(environmentHandle, null); } }
public override bool SendMoreText(OdbcConnectionHandle connectionHandle, IMaxDataType column) { if (connectionHandle == null) throw new ArgumentNullException("connectionHandle"); if (column == null) throw new ArgumentNullException("column"); var data = column.Data; int length; if (data == null || (length = data.Length) == 0) { var result = bcp_moretext(connectionHandle, column.IsNullable ? Constants.SqlNullData : 0, (byte*)0); return result; } const int chunkSize = 2048; fixed (byte* ptr = column.Data) { var pData = ptr; while (length > 0) // here we use > 0. In all other drivers we use >= . Go figure. { var cbData = length >= chunkSize ? chunkSize : length; var result = bcp_moretext(connectionHandle, cbData, pData); if (!result) { return false; } if (length == 0) { return true; } unchecked { length -= cbData; pData += cbData; } } } return true; }
protected override bool bcp_sendrow(OdbcConnectionHandle hdbc) { return NativeMethods.bcp_sendrow(hdbc); }
internal static extern ODBC32.RetCode SQLGetConnectAttrW(OdbcConnectionHandle ConnectionHandle, ODBC32.SQL_ATTR Attribute, byte[] Value, int BufferLength, out int StringLength);
internal static extern int bcp_batch(OdbcConnectionHandle hdbc);
internal static void Disconnect(OdbcConnectionHandle connectionHandle) { if (connectionHandle == null) throw new ArgumentNullException("connectionHandle"); var result = NativeMethods.SQLDisconnect(connectionHandle); if ((result == OdbcReturnCode.Success) || (result == OdbcReturnCode.SuccessWithInfo)) return; var ex = GetException(connectionHandle, "Unable to disconnect the database."); throw ex; }
internal static extern bool bcp_bind(OdbcConnectionHandle hdbc, byte* pData, int cbIndicator, int cbData, byte* pTerm, int cbTerm, int eDataType, int idxServerCol);
internal static void SetIntConnectionAttribute(OdbcConnectionHandle connectionHandle, OdbcConnectionAttribute attribute, int value) { if (connectionHandle == null) throw new ArgumentNullException("connectionHandle"); var result = NativeMethods.SQLSetConnectAttr(connectionHandle, attribute, value, 0); if ((result != OdbcReturnCode.Success) && (result != OdbcReturnCode.SuccessWithInfo)) { var ex = GetException(connectionHandle, string.Format("Unable to set ODBC connection attribute '{0:G}'.", attribute)); throw ex; } }
protected override bool ReleaseHandle() { try { var releaseHandle = handle; if (releaseHandle != Constants.IntPtrZero) { handle = Constants.IntPtrZero; OdbcMethods.ReleaseHandle(OdbcHandleType.Statement, releaseHandle); } } finally { var parentHandle = _parentHandle; if (parentHandle != null) { _parentHandle = null; parentHandle.DangerousRelease(); } } return true; }
internal static extern OdbcReturnCode SQLDisconnect(OdbcConnectionHandle connectionHandle);
internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLGetConnectAttrW( /*SQLHBDC*/ OdbcConnectionHandle ConnectionHandle, /*SQLINTEGER*/ ODBC32.SQL_ATTR Attribute, /*SQLPOINTER*/ byte[] Value, /*SQLINTEGER*/ int BufferLength, /*SQLINTEGER* */ out int StringLength);
internal static extern OdbcReturnCode SQLSetConnectAttr(OdbcConnectionHandle connectionHandle, OdbcConnectionAttribute attribute, int value, int valueLengthShouldBeZero);
internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLGetInfoW( /*SQLHBDC*/ OdbcConnectionHandle hdbc, /*SQLUSMALLINT*/ ODBC32.SQL_INFO fInfoType, /*SQLPOINTER*/ byte[] rgbInfoValue, /*SQLSMALLINT*/ short cbInfoValueMax, /*SQLSMALLINT* */ IntPtr pcbInfoValue);
internal static void Connect(OdbcConnectionHandle connectionHandle, string connectionString) { if (string.IsNullOrEmpty(connectionString)) { throw new ArgumentNullException("connectionString"); } const short noPrompt = 0; // SQL_DRIVER_NOPROMPT: the Driver Manager copies the connection string specified by the application. short bufferLengthNeeded; var result = NativeMethods.SQLDriverConnectW(connectionHandle, Constants.IntPtrZero, connectionString, (short)connectionString.Length, null, 0, out bufferLengthNeeded, noPrompt); if ((result == OdbcReturnCode.Success) || (result == OdbcReturnCode.SuccessWithInfo)) return; var ex = GetException(connectionHandle, "Unable to connect to the database."); throw ex; }
internal static extern ODBC32.RetCode SQLGetInfoW(OdbcConnectionHandle hdbc, ODBC32.SQL_INFO fInfoType, byte[] rgbInfoValue, short cbInfoValueMax, IntPtr pcbInfoValue);
internal static partial ODBC32.SQLRETURN SQLGetInfoW( /*SQLHBDC*/ OdbcConnectionHandle hdbc, /*SQLUSMALLINT*/ ODBC32.SQL_INFO fInfoType, /*SQLPOINTER*/ byte[] rgbInfoValue, /*SQLSMALLINT*/ short cbInfoValueMax, /*SQLSMALLINT* */ out short pcbInfoValue);
internal static extern bool bcp_sendrow(OdbcConnectionHandle hdbc);
internal static extern bool bcp_collen(OdbcConnectionHandle hdbc, int cbData, int idxServerCol);
internal static extern short bcp_sendrow(OdbcConnectionHandle hdbc);
internal static extern int bcp_done(OdbcConnectionHandle hdbc);
internal static extern bool bcp_initW(OdbcConnectionHandle hdbc, [In, MarshalAs(UnmanagedType.LPWStr)] string szTable, IntPtr szDataFileMustBeZero, IntPtr szErrorFileMustBeZero, int eDirection);
internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLGetFunctions( /*SQLHBDC*/ OdbcConnectionHandle hdbc, /*SQLUSMALLINT*/ ODBC32.SQL_API fFunction, /*SQLUSMALLINT* */ out short pfExists);
internal static extern bool bcp_moretext(OdbcConnectionHandle hdbc, int cbData, byte* pData);
internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLSetConnectAttrW( /*SQLHBDC*/ OdbcConnectionHandle ConnectionHandle, /*SQLINTEGER*/ ODBC32.SQL_ATTR Attribute, /*SQLPOINTER*/ IntPtr Value, /*SQLINTEGER*/ int StringLength);
internal static extern ODBC32.RetCode SQLGetFunctions(OdbcConnectionHandle hdbc, ODBC32.SQL_API fFunction, out short pfExists);