コード例 #1
0
        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);
                    }
                }
            }
        }
コード例 #2
0
 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);
コード例 #3
0
 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);
コード例 #4
0
 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);
コード例 #5
0
        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;
        }
コード例 #6
0
        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));
                }
            }
        }
コード例 #7
0
        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;
        }
コード例 #8
0
 internal static partial ODBC32.SQLRETURN SQLSetConnectAttrW(
     /*SQLHBDC*/ OdbcConnectionHandle ConnectionHandle,
     /*SQLINTEGER*/ ODBC32.SQL_ATTR Attribute,
     /*SQLPOINTER*/ string Value,
     /*SQLINTEGER*/ int StringLength);
コード例 #9
0
 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);
コード例 #10
0
 internal static extern ODBC32.RetCode SQLSetConnectAttrW(OdbcConnectionHandle ConnectionHandle, ODBC32.SQL_ATTR Attribute, IDtcTransaction Value, int StringLength);
コード例 #11
0
 internal static extern OdbcReturnCode SQLAllocHandle(OdbcHandleType handleType, OdbcConnectionHandle inputHandle, out IntPtr outputHandle);
コード例 #12
0
 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);
コード例 #13
0
 internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLSetConnectAttrW(
     /*SQLHBDC*/ OdbcConnectionHandle ConnectionHandle,
     /*SQLINTEGER*/ ODBC32.SQL_ATTR Attribute,
     /*SQLPOINTER*/ System.Transactions.IDtcTransaction Value,
     /*SQLINTEGER*/ Int32 StringLength);
コード例 #14
0
        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;
        }
コード例 #15
0
 protected override bool bcp_initW(OdbcConnectionHandle hdbc, string szTable, int eDirection)
 {
     return NativeMethods.bcp_initW(hdbc, szTable, Constants.IntPtrZero, Constants.IntPtrZero, eDirection);
 }
コード例 #16
0
 protected override bool bcp_moretext(OdbcConnectionHandle hdbc, int cbData, byte* pData)
 {
     return NativeMethods.bcp_moretext(hdbc, cbData, pData);
 }
コード例 #17
0
 protected override bool bcp_collen(OdbcConnectionHandle hdbc, int cbData, int idxServerCol)
 {
     return NativeMethods.bcp_collen(hdbc, cbData, idxServerCol);
 }
コード例 #18
0
 protected override int bcp_done(OdbcConnectionHandle hdbc)
 {
     return NativeMethods.bcp_done(hdbc);
 }
コード例 #19
0
 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);
 }
コード例 #20
0
        public void ConstructorThrowsExceptionWhenParentHandleIsNull()
        {
            var driver = new Mock<IOdbcDriver>();

            var sut = new OdbcConnectionHandle(null, driver.Object);
        }
コード例 #21
0
        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);
            }
        }
コード例 #22
0
        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;
        }
コード例 #23
0
 protected override bool bcp_sendrow(OdbcConnectionHandle hdbc)
 {
     return NativeMethods.bcp_sendrow(hdbc);
 }
コード例 #24
0
 internal static extern ODBC32.RetCode SQLGetConnectAttrW(OdbcConnectionHandle ConnectionHandle, ODBC32.SQL_ATTR Attribute, byte[] Value, int BufferLength, out int StringLength);
コード例 #25
0
 internal static extern int bcp_batch(OdbcConnectionHandle hdbc);
コード例 #26
0
        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;
        }
コード例 #27
0
 internal static extern bool bcp_bind(OdbcConnectionHandle hdbc, byte* pData, int cbIndicator, int cbData, byte* pTerm, int cbTerm, int eDataType, int idxServerCol);
コード例 #28
0
        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;
            }
        }
コード例 #29
0
        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;
        }
コード例 #30
0
 internal static extern OdbcReturnCode SQLDisconnect(OdbcConnectionHandle connectionHandle);
コード例 #31
0
 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);
コード例 #32
0
 internal static extern OdbcReturnCode SQLSetConnectAttr(OdbcConnectionHandle connectionHandle, OdbcConnectionAttribute attribute, int value, int valueLengthShouldBeZero);
コード例 #33
0
 internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLGetInfoW(
     /*SQLHBDC*/ OdbcConnectionHandle hdbc,
     /*SQLUSMALLINT*/ ODBC32.SQL_INFO fInfoType,
     /*SQLPOINTER*/ byte[] rgbInfoValue,
     /*SQLSMALLINT*/ short cbInfoValueMax,
     /*SQLSMALLINT* */ IntPtr pcbInfoValue);
コード例 #34
0
        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;
        }
コード例 #35
0
 internal static extern ODBC32.RetCode SQLGetInfoW(OdbcConnectionHandle hdbc, ODBC32.SQL_INFO fInfoType, byte[] rgbInfoValue, short cbInfoValueMax, IntPtr pcbInfoValue);
コード例 #36
0
 internal static partial ODBC32.SQLRETURN SQLGetInfoW(
     /*SQLHBDC*/ OdbcConnectionHandle hdbc,
     /*SQLUSMALLINT*/ ODBC32.SQL_INFO fInfoType,
     /*SQLPOINTER*/ byte[] rgbInfoValue,
     /*SQLSMALLINT*/ short cbInfoValueMax,
     /*SQLSMALLINT* */ out short pcbInfoValue);
コード例 #37
0
 internal static extern bool bcp_sendrow(OdbcConnectionHandle hdbc);
コード例 #38
0
 internal static extern bool bcp_collen(OdbcConnectionHandle hdbc, int cbData, int idxServerCol);
コード例 #39
0
 internal static extern short bcp_sendrow(OdbcConnectionHandle hdbc);
コード例 #40
0
 internal static extern int bcp_done(OdbcConnectionHandle hdbc);
コード例 #41
0
 internal static extern bool bcp_initW(OdbcConnectionHandle hdbc, [In, MarshalAs(UnmanagedType.LPWStr)] string szTable, IntPtr szDataFileMustBeZero, IntPtr szErrorFileMustBeZero, int eDirection);
コード例 #42
0
 internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLGetFunctions(
     /*SQLHBDC*/ OdbcConnectionHandle hdbc,
     /*SQLUSMALLINT*/ ODBC32.SQL_API fFunction,
     /*SQLUSMALLINT* */ out short pfExists);
コード例 #43
0
 internal static extern bool bcp_moretext(OdbcConnectionHandle hdbc, int cbData, byte* pData);
コード例 #44
0
 internal static extern /*SQLRETURN*/ ODBC32.RetCode SQLSetConnectAttrW(
     /*SQLHBDC*/ OdbcConnectionHandle ConnectionHandle,
     /*SQLINTEGER*/ ODBC32.SQL_ATTR Attribute,
     /*SQLPOINTER*/ IntPtr Value,
     /*SQLINTEGER*/ int StringLength);
コード例 #45
0
 internal static extern ODBC32.RetCode SQLGetFunctions(OdbcConnectionHandle hdbc, ODBC32.SQL_API fFunction, out short pfExists);