我正在使用Visual Studio 2010开发ASP.NET Web应用程序。我的目标框架是“ .NET Framework 4”,并且正在向SQL Server 2008数据库发送查询,该数据库版本是“ Microsoft SQL Server 2008 R2”。 (SP2)”。
我正在使用以下连接字符串"Data Source=XXXX;Initial Catalog=XXXX;Integrated Security=False;User Id=XXXX;Password= XXXX;MultipleActiveResultSets=True"
进行连接,并使用以下代码发送查询:
public static List<DataTable> getData(String query)
{
var results = new List<DataTable>();
try
{
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
command.CommandTimeout = 0;
using (SqlDataReader reader = command.executeReader())
{
do
{
while (reader.Read()) ;
var dataTable = new DataTable();
dataTable.Load(reader);
results.Add(dataTable);
} while (reader.NextResult());
}
connection.Close();
}
}
}
}
我要发送的查询是一个存储过程,该存储过程返回两个表,首先,它具有一个循环,该循环根据某些内部条件,在tempdb..#table
上的创建和插入以及两个SELECT语句来调用另一个存储过程。
但是现在它仅包含:
SELECT 1,2,3,4,5
SELECT 6,7,8,9,0
我不知道为什么,但是reader.NextResult()
始终为假,因此我永远都不会得到第二张表的结果。
有人知道我在做什么错吗?我应该怎么做才能从查询中接收和读取两个结果?
答案 0 :(得分:3)
如果这是使用存储的proc,则需要这样的内容:注意命令类型
using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(myConnString))
{
using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
{
cmd.CommandText = "myMultipleTablesSP";
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
conn.Close();
}
}
例如,如果您在SP中返回2个表,例如:
SELECT * FROM [TableA];
SELECT * FROM [TableB];
您将以以下方式访问此表:
DataTable tableA = ds.Tables[0];
DataTable tableB = ds.Tables[1];
答案 1 :(得分:0)
好的,我已经进行了一些测试,发现问题出自dataTable.Load(reader);
,但我不知道该方法的原因以及到底发生了什么。
但是如果您使用
do {
while(reader.Read()) {
...
}
} while (reader.NextResult());
一切正常。