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();
我想回来:
- 第一个 select 语句的结果集
- 插入语句受影响的记录
- 第二个 select 语句的结果集
相反,我收到了第一个结果集,然后当我执行 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
}
当我有多个 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();
我想回来:
- 第一个 select 语句的结果集
- 插入语句受影响的记录
- 第二个 select 语句的结果集
相反,我收到了第一个结果集,然后当我执行 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
}