如果我有多个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
?
答案 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
}