OdbcHancle C#抛出的System.AccessViolationException

时间:2015-04-30 09:05:46

标签: c# sql-server odbc access-violation

我遇到了一个在两个SQL Server数据库之间复制内容的应用程序的问题。

我们会不时收到AccessViolationException。它不可重复。

"源方法"可以改变,但所有异常都有以下共同的堆栈跟踪部分:

  

System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他记忆已损坏   在System.Data.Common.UnsafeNativeMethods.SQLAllocHandle(SQL_HANDLE HandleType,OdbcHandle InputHandle,IntPtr& OutputHandle)
  在System.Data.Odbc.OdbcHandle..ctor(SQL_HANDLE handleType,OdbcHandle parentHandle)
  在System.Data.Odbc.OdbcConnection.CreateStatementHandle()
  在System.Data.Odbc.OdbcCommand.GetStatementHandle()

安装了最新的ODBC驱动程序(11)。

修改

以下是引起异常的方法代码:

public override int Execute(string sCmd) {
        int nRows = 0;
        m_bError = false;
        m_sCmd = sCmd;
        try {
            OdbcConnection con = OpenConnection();
            OdbcCommand cmd = new OdbcCommand(sCmd, con);
            nRows = cmd.ExecuteNonQuery();
            CloseConnection(con);
        }
        catch (Exception e) {
            f_handleException(e, "Execute", sCmd);
        }
        return nRows;
    }

这里是完整的Stacktrace

dummypackage.db.OdbcDatabase.Execute(): System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at System.Data.Common.UnsafeNativeMethods.SQLAllocHandle(SQL_HANDLE HandleType, OdbcHandle InputHandle, IntPtr& OutputHandle)
   at System.Data.Odbc.OdbcHandle..ctor(SQL_HANDLE handleType, OdbcHandle parentHandle)
   at System.Data.Odbc.OdbcConnection.CreateStatementHandle()
   at System.Data.Odbc.OdbcCommand.GetStatementHandle()
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
   at System.Data.Odbc.OdbcCommand.ExecuteNonQuery()
   at Prosystem.Toolbox.db.OdbcDatabase.Execute(String sCmd)
    INSERT INTO dummyTable VALUES (1381018,20150422,7343300,4193722002850210,61,1603)

1 个答案:

答案 0 :(得分:0)

我怀疑您的某些数据值不适合您的数据库架构。例如,期望int的列获得的值超过int分配类型。

尝试在出现异常时记录数据,您可以解决pb。