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

C# ADODB.Recordset.Update在从SQL Server 2008升级到SQL Server 2012后返回错误,c#,sql-server-2012,ado,C#,Sql Server 2012,Ado,我最近访问了SQL Server 2012,以便测试我们当前的web应用程序,以确定升级当前SQL Server 2008计算机时可能出现的任何问题 我们的一个系统是第三方供应商的解决方案,它使用ODBC连接和ADO记录集对象进行数据库通信 当我将此应用程序连接到SQL Server 2012时,我开始收到以下错误: 基于查询的更新失败,因为找不到要更新的行 我曾与我们的DBA合作,在SQL Server 2008和SQL Server 2012上从相同的代码过程中获取跟踪文件,所有内容看起来都

我最近访问了SQL Server 2012,以便测试我们当前的web应用程序,以确定升级当前SQL Server 2008计算机时可能出现的任何问题

我们的一个系统是第三方供应商的解决方案,它使用ODBC连接和ADO记录集对象进行数据库通信

当我将此应用程序连接到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应用程序,该应用程序使用LINQtoSQL和DBML数据文件。它似乎也有类似的问题。当我们拉下记录,更新它,然后调用
db.SubmitChanges()
,将引发异常,并显示以下消息:

未找到或更改行


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

在新硬件上安装SQL Server 2012时,
无计数
带引号的标识符
ANSI NULL Default on
已作为默认连接设置启用<代码>无计数导致ADO和Linq到SQL数据访问模型出现问题。一旦删除了默认选项,一切都开始正常工作

因此,这实际上不是ADO或SQL Server 2012升级问题,这是任何新的SQL Server安装都可能出现的问题


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

您是否尝试过使用实际生成的查询并在SSMS中运行它?@jac我们确实从SQL Profiler中拉出了查询,并通过SSMS运行,结果运行良好。已使用指定的值正确更新记录。我们检索到的查询最终执行了带有查询字符串的sp_prepexec。引号中的多余空间是有意用于“DateCreated”的,还是只是输入错误?@tgolisch-这是输入错误。我会改正的。我知道你在寻找答案,但我有一个问题……那么
ADODB.Recordset
ADO.NET
之间有什么区别呢