【问题标题】:SQL DELETE STATEMENT problem with returned rowcount返回行数的 SQL DELETE STATEMENT 问题
【发布时间】:2011-09-28 05:00:27
【问题描述】:

我有这样的声明:

DELETE TABLENAME WHERE COLUMN = NUMBER; SELECT @@ROWCOUNT AS RC;

如果我从代码(经典 asp)运行它,我会得到错误:Item cannot be found in the collection corresponding to the requested name or ordinal.

数据库是 sql server 2005 express。

如果我在查询分析器中运行这一行,它就可以工作!

我引用的列对数据库中的另一个表有约束

你们知道在哪里寻找解决方法吗?

更新 - 请现在尝试解释这一点

第一行是我们在常规服务器上的连接字符串,当我们需要使用 sql 2005 express 将代码上传到新服务器时,我们更改为第二行,因为第一个对我们不起作用(我在 servername 本地 ip: 127.0.0.1) 中尝试过,第二个是实际的服务器名称。现在我已经更改了第一个以连接到服务器名称并且它可以工作。甚至删除和恢复@@rowcount。 但是现在感觉连接速度变慢了,所以网站运行缓慢!

有什么让它变得更好的想法吗?

ConnectionString =  "Server=**ServerName**;Driver={SQL Server};UID=**Username**; PWD=**password**;database=**dbname**;Data Provider=SQLOLEDB;Network Library=DBMSSOCN;"

ConnectionString = "PROVIDER=SQLOLEDB; Data Source =**servername**; Trusted_Connection=Yes; Initial Catalog=**dbname**;User Id=**username**; Password=**password**;"

【问题讨论】:

  • 能否贴出ASP代码,这个错误一般表示查询返回的数据中找不到字段
  • 我不能,因为它是很多函数和类的一部分。无论如何,我尝试检索@@rowcount(没有 as 部分)所以它只是第 0 列但没有工作

标签: asp-classic sql-server-2005-express


【解决方案1】:

如果你想计算受影响的行数,你可以用这个来代替:

conn.Execute("DELETE FROM TABLENAME WHERE COLUMN = " & number, rows_affected)

Response.Write rows_affected

【讨论】:

  • 这将起作用,只要连接对象的 CursorType 设置为 AdOpenKeyset。
【解决方案2】:

添加SET NOCOUNT ON;,因为没有返回另一个记录集导致问题

SET NOCOUNT ON;DELETE TABLENAME WHERE COLUMN = NUMBER; SELECT @@ROWCOUNT AS RC;

【讨论】:

  • 这就是执行的:returnedValue = m_Conn.Execute(strSql).NextRecordset.Fields(strReturnedValueName).Value 所以它会执行而不返回值(这个代码在我们的数百个网站中工作,但现在在新服务器上它不工作
  • 如果您已经在使用 NextRecordset,则不需要 NOCOUNT ON。记录被删除了吗?
  • 如果我删除 th nocount 我得到第一个错误...查看已编辑的问题以了解发生的新事情
【解决方案3】:

@@ Rowcount 是一个只能从数据库运行的 T-SQL 调用。您可以在存储过程中对其进行实例化,然后调用 delete 并从存储过程中返回 @@rowcount。

这是针对 ASP.NET 的,但不是在页面加载中写入,而是在标题中处理它

http://support.microsoft.com/kb/306574

【讨论】:

    【解决方案4】:

    此代码假定查询中有两个记录集,第一个可能是行数(为什么人们建议使用 SET NOCOUNT ON)。

    m_Conn.Execute(strSql).NextRecordset.Fields(strReturnedValueName).Value 
    

    所以它会执行而不返回值(这段代码在我们的数百个网站上都可以工作,但现在在新服务器上它不工作了——

    当您在此服务器上运行代码时,它会显示行数吗?如果没有,则说明 NOCOUNT 处于打开状态,因此您的 ASP 代码没有得到预期数量的记录集对象。我不会假设您总是会返回两个记录集,而是循环遍历记录集,直到返回的记录集为空,类似于这些行。下面的代码未经测试,它基本上从每个记录集中抓取第一个字段,直到最后一个。这样,无论 NOCOUNT 的设置如何,您都应该始终从最终的 SQL 语句中获取值

    DIM rs 
    set rs=Server.CreateObject("ADODB.recordset")
    set rs = m_Conn.Execute(strSql)
    do while rs is not nothing
      val = rs(0).value
      rs = rs.NextRecordSet
    enddo
    

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 2015-04-05
      • 1970-01-01
      • 2015-02-28
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多