从SQL Server 2008升级到SQL Server 2012后,ADODB.Recordet.Update返回错
本文关键字:SQL Server Recordet ADODB Update 返回 2012 2008升 | 更新日期: 2023-09-27 18:22:15
我最近获得了对SQL Server 2012的访问权限,以便测试我们当前的web应用程序,以确定升级我们当前的SQL Server 2008计算机时可能出现的任何问题。
我们的一个系统是第三方供应商解决方案,它使用ODBC连接和ADO RecordSet对象进行数据库通信。
当我将此应用程序连接到SQL Server 2012时,我开始收到以下错误:
基于查询的更新失败,因为找不到要更新的行
我曾与我们的DBA合作,在SQL Server 2008和SQL Server 2012上从相同的代码过程中获取跟踪文件,所有内容看起来都完全相同。在执行代码之前,我还确保了数据存在于数据库中。将数据库设置为SQL Server 2008兼容性也不起作用。
不幸的是,我们无法修改应用程序的源代码以进行任何代码更改。这个系统已经过时了,我相信支持合同也已经到期了。
因此,我预计我们将不得不使用SQL Server 2008,但我希望有人能理解为什么SQL Server 2012可能会导致ADO RecordSet.Update()
方法表现不同。
代码绝对是一团糟,但以下是我能够从DLL文件中提取的方法的要点:
private void update(ADODB.Connection xConn)
{
ADODB.Recordset recordset = new RecordsetClass();
//simplified query, it's actually auto-generated based on configuration values
string query = "SELECT ID, DateModified, DateCreated FROM table WHERE ID = 1";
recordset.Open(query, xConn, CursorTypeEnum.adOpenForwardOnly, LockTypeEnum.adLockOptimistic, Convert.ToInt32(CommandTypeEnum.adCmdText));
try
{
if (recordset.EOF)
{
throw new Exception("Invalid/missing policy record for id " + id.ToString());
}
recordset.Fields["DateModified"].Value = value1;
recordset.Fields["DateCreated"].Value = value2;
//Other column updates
if (!HasOpenTransaction)
{
xConn.BeginTrans();
}
try
{
//Throws the exception with SQL2012
recordset.Update(Type.Missing, Type.Missing);
if (HasOpenTransaction)
{
xConn.CommitTrans();
flag2 = true;
}
}
finally
{
if (HasOpenTransaction && !flag2)
{
xConn.RollbackTrans();
}
}
}
finally
{
recordset.Close();
}
}
编辑:最后,我转到下一个web应用程序,该应用程序使用带有DBML数据文件的Linq-to-SQL。它似乎也有类似的问题。当我们拉下一条记录,更新它,然后调用db.SubmitChanges()
时,会抛出一个异常,并显示以下消息:
未找到行或已更改
我在服务器的默认连接设置中发现了问题。
在新硬件上安装SQL Server 2012时,启用了NO COUNT
、QUOTED IDENTIFIER
和ANSI NULL Default On
作为默认连接设置。NO COUNT
导致ADO和Linq-to-SQL数据访问模型出现问题。一旦删除了默认选项,一切都开始正常工作。
因此,这并不是真正的ADO或SQL Server 2012升级问题,这可能发生在任何新的SQL Server安装上。
附带说明一下,我测试的使用实体框架的第三个系统在启用NO COUNT
并正常运行的情况下没有显示任何问题。