我遇到了一个在两个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)
答案 0 :(得分:0)
我怀疑您的某些数据值不适合您的数据库架构。例如,期望int的列获得的值超过int分配类型。
尝试在出现异常时记录数据,您可以解决pb。