【问题标题】:How can I count rows returned by the stored procedure?如何计算存储过程返回的行数?
【发布时间】:2014-05-12 12:31:58
【问题描述】:

我必须使用 ado.net 从 SQL Server 加载大量数据。

此数据从一个慢速存储过程返回。我无法将结果存储在临时表中,因为我不知道结果表的结构。所以我不能这样做:

CREATE TABLE #temp
(
   ID INT,
   NAME VARCHAR(100),
   ...
)
INSERT INTO #temp Exec dbo.proc @param=1

SELECT COUNT(*) FROM #temp

SELECT * FROM #temp 

所以由于数据集很大,我使用SqlDataReader。但是为了取得进展,我应该知道这些数据的行数。

    private SqlCommand _asyncCmd;
    private SqlDataReader _reader;
    private SqlConnection _con;
    private IAsyncResult _asyncResult;

    public void GetDictionaryMetadataAsync(int param)
    {
        _con = new SqlConnection(_connectionString);
        _asyncCmd = new SqlCommand("SP_procedure", _con);

        _asyncCmd.CommandType = CommandType.StoredProcedure;
        _asyncCmd.CommandTimeout = 0;
        _asyncCmd.Parameters.Add(new SqlParameter("@param", SqlDbType.Int));
        _asyncCmd.Parameters["@param"].Value = param;

        _asyncCmd.Connection.Open();

        var callback = new AsyncCallback(EndExecuteReader);
        _asyncResult = _asyncCmd.BeginExecuteReader(callback, _asyncCmd);
    }

    private void EndExecuteReader(IAsyncResult result) 
    {
        _reader = _asyncCmd.EndExecuteReader(result);

        var command = new SqlCommand("SELECT @@ROWCOUNT", _con);
        // GETTING COUNT
        var count = command.ExecuteScalar() as int?;
        if (!count.HasValue) throw new NullReferenceException();
        Count = count.Value;
    }

    public IEnumerable<object[]> GetDictionaryMetadataAsyncEnd()
    {
        _asyncResult.AsyncWaitHandle.WaitOne();

        if (!_reader.Read())
            yield break;
        var values = new object[_reader.FieldCount];

        _reader.GetValues(values);
        yield return values;

        while (_reader.Read())
        {
            _reader.GetValues(values);
            yield return values;
        }
    }

但是这部分代码

        // GETTING COUNT
        var count = command.ExecuteScalar() as int?;

总是返回 0。

你知道我该怎么做吗?

提前致谢。

【问题讨论】:

  • 您正在启动一个新的 SqlCommand。你期望它如何从另一个 SqlCommand 获取信息?

标签: .net sql-server tsql ado.net


【解决方案1】:

获得@@ROWCOUNT = 0 的最可能原因是在单独的隐式定义的数据库事务中运行命令(检查 @@SPID 值以确保)。

解决方案是在您的 c# 代码中使用单个显式定义的事务。

注意,存储过程中的“SET NOCOUNT ON”选项对@@ROWCOUNT值没有影响:

即使 SET NOCOUNT 为 ON,@@ROWCOUNT 函数也会更新。

PS。 SqlConnection 连接字符串的“MultipleActiveResultSets=True”选项有帮助

【讨论】:

  • 好吧,我已经测试了你的代码,当两个语句在同一个事务中调用时,它工作正常。我建议您在 'exec _sp _params' 之后立即在 SMSS 中调用 @@ROWCOUNT 并查看您得到的结果。那么 0 很可能是 @@ROWCOUNT 的正确值。您是否将“MultipleActiveResultSets=True”设置应用于 SqlConnection?
  • 它通过添加“MultipleActiveResultSets=True”解决。谢谢!
  • 很高兴能提供帮助:)
猜你喜欢
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
相关资源
最近更新 更多