C#DataReader:Sql批处理命令和返回结果

时间:2015-07-07 01:34:42

标签: c# sql datareader

如果我有多个select语句与insert语句分开,或者某些其他语句没有返回数据集,则DataReader不会返回最后一个数据集致电NextResult时。

例如,我有以下sql语句将通过SqlCommand执行到DataReader

select * from testing;
insert into testing (test) values ('testing here');
select * from testing;

我执行sql

IDbCommand command = MyConnection.CreateCommand();
command.CommandText = statement;
var reader = (System.Data.Common.DbDataReader)command.ExecuteReader();

我想回来:

  • 第一个选择语句的结果集
  • 受插入声明影响的记录
  • 第二个选择语句的结果集

相反,我收到第一个结果集,然后当我执行NextResult()时,返回值为false

如果我运行两个后续选择,则返回结果集 即

select * from testing
select * from testing2

我尝试过解析;并单独排除命令。 但是,从长远来看,这将不起作用,因为最终我将使用用例提交匿名查询或创建一个在命令中有分号的存储过程。

如何迭代混合了没有返回的数据和查询结果的DataReader

3 个答案:

答案 0 :(得分:2)

在插入测试值之前,您应该暂时存储第一个查询的结果。

SQL Server:

DECLARE @temp TABLE
([test] VARCHAR(20)) -- change type depending on your needs.

INSERT INTO @temp
SELECT *
FROM testing

SELECT * FROM @temp  -- first result
SELECT * FROM testing

的PostgreSQL:

CREATE TEMP TABLE temp1 ON COMMIT DROP AS
SELECT *
FROM testing

INSERT INTO testing (test) VALUES ('testing here');

SELECT * FROM temp1  -- first result
SELECT * FROM testing

答案 1 :(得分:2)

我最终使用DbDataAdapter并将相应的数据加载到内存中,而不是使用DbDataReader。对于我的应用程序,这工作正常。

DataAdapter处理同时获取DataTables并运行插入等

这是一个类似于我最终做的代码片段:

var command = Connection.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = statement;
DataSet set = new DataSet();
var da = CreateDataAdapter(connection);
da.SelectCommand = command;
var recordsEffected = da.Fill(set);
foreach (DataTable newTable in set.Tables){
    //do stuff with data returned
}

答案 2 :(得分:0)

看看这里,在SqlDataReader.NextResult方法......

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.nextresult.aspx

IDbCommand command = MyConnection.CreateCommand();
command.CommandText = statement;
var reader = command.ExecuteReader();

while(reader.Read()){
    //Logic for first result
}

reader.NextResult();

while(reader.Read()){
    //Logic for second result
}