C# DataReader:Sql 批命令和 Return 结果

C# DataReader: Sql Batch Of Commands And Return Results

当我有多个 select 语句与 insert 语句或其他一些不 return 数据集的语句分隔时,最后一个数据集不是 return 在调用 NextResult 时由 DataReader 编辑。

例如,我有以下 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() 时,return 是 false

如果我 运行 两个后续的 select 但是结果集都是 returned 即

select * from testing
select * from testing2

我试过只解析 ; 并分别执行命令。 但是,这在很长一段时间内都行不通 运行,因为最终我会有提交匿名查询或创建命令中包含分号的存储过程的用例。

如何遍历具有混合数据结果的 DataReader 和没有 return 的查询?

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

SQL 服务器:

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

看看这里,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
}

我最终求助于使用 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
}