【发布时间】: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