我最近获得了访问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();
}
}
编辑:
我终于转到了下一个使用Linq to SQL和DBML数据文件的Web应用程序。它似乎也有类似的问题。当我们下拉记录,更新它然后调用db.SubmitChanges()
时,会抛出异常,并显示以下消息:
未找到或更改行
答案 0 :(得分:0)
我在服务器的默认连接设置中发现了问题。
在新硬件上安装SQL Server 2012时,NO COUNT
,QUOTED IDENTIFIER
和ANSI NULL Default On
已启用为默认连接设置。 NO COUNT
导致ADO和Linq to SQL数据访问模型出现问题。删除该默认选项后,一切正常。
因此,这不是ADO或SQL Server 2012升级问题,这可能会在任何新的SQL Server安装上发生。
作为旁注,我测试的第三个使用Entity Framework的系统没有显示启用NO COUNT
并正常运行的任何问题。