从SQL Server 2008升级到SQL Server 2012后,ADODB.Recordset.Update返回错误

时间:2014-09-16 17:42:35

标签: c# sql-server-2012 ado

我最近获得了访问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()时,会抛出异常,并显示以下消息:

  

未找到或更改行

1 个答案:

答案 0 :(得分:0)

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

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

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

作为旁注,我测试的第三个使用Entity Framework的系统没有显示启用NO COUNT并正常运行的任何问题。