从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 2008升级到SQL Server 2012后,ADODB.Recordet.Update返回错

我在服务器的默认连接设置中发现了问题。

在新硬件上安装SQL Server 2012时,启用了NO COUNTQUOTED IDENTIFIERANSI NULL Default On作为默认连接设置。NO COUNT导致ADO和Linq-to-SQL数据访问模型出现问题。一旦删除了默认选项,一切都开始正常工作。

因此,这并不是真正的ADO或SQL Server 2012升级问题,这可能发生在任何新的SQL Server安装上。

附带说明一下,我测试的使用实体框架的第三个系统在启用NO COUNT并正常运行的情况下没有显示任何问题。