Return 2 个结果来自 SQL
Return 2 Results From SQL
如果我有一个存储过程
Alter dbo.Testing
Select userid from masterdb
where employed = 'Yes'
Select Count(*) from leftfield
where pin is not null
如何将每个查询的 returned 结果存储在单独的数据集中?
伪代码:
firstdataset = Select userid from masterdb where employed = 'Yes'
seconddataset = select count(*) from leftfield where pin is not null
编辑
我用它来 return 1 从存储过程到 C# 数据集的结果集。有没有可能return大于1?
public DataSet RunStoredProc(string databaseConnection)
{
ds = new DataSet();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
SqlConnection = new SqlConnection(connectionString);
SqlCommand = new SqlCommand(sqlQuery, SqlConnection);
SqlConnection.Open();
SqlCommand.CommandTimeout = 0;
ds = new DataSet();
SqlDataAdapter = new SqlDataAdapter(SqlCommand);
SqlDataAdapter.Fill(ds, "Data");
return ds;
}
编辑#2
public DataSet RunStoredProc(string databaseConnection)
{
ds = new DataSet();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
//Error 1 On Line Below
ds = ExecuteSqlQuery(databaseConnection, SqlQueryBuilder.ToString());
return ds;
}
public List<DataTable> RunStoredProc(string databaseConnection)
{
var dataTables = new List<DataTable>();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
SqlConnection = new SqlConnection(connectionString);
SqlCommand = new SqlCommand(sqlQuery, SqlConnection);
var reader = SqlCommand.ExecuteReader();
DataTable dt1 = new DataTable();
dt1.Load(reader);
dataTables.Add(dt1);
DataTable dt2 = new DataTable();
dt2.Load(reader);
dataTables.Add(dt2);
return dataTables;
}
Error # 1
Cannot implicitly convert type 'System.Collections.Generic.List' to 'System.Data.DataSet'
您需要一个函数来 return 结果,而不是存储过程。存储过程仅设计为 return 状态值。编写两个函数,每个函数 return 一个非标量值,本质上是一个数据集。
你可以这样做:
Alter dbo.Testing
-- Declare your variables
Declare @userId AS INT;
Declare @count AS INT;
-- Set the value
Select @userId = userid from masterdb where employed = 'Yes';
Select @count = Count(1) from leftfield where pin is not null;
-- Return the values
Select @userId, @count;
**编辑添加连接数据库的功能**
获取值的示例函数:
static DataSet sqlTest(string connectionString)
{
using (var sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
var sqlCommand = new SqlCommand("exec dbo.StoredProc", sqlConnection);
var dataSet = new DataSet();
var sqlDataAdapter = new SqlDataAdapter(sqlCommand);
sqlDataAdapter.Fill(dataSet, "Data");
// you can access your values like that:
var userId = dataSet.Tables["Data"].Rows[0][0];
var count = dataSet.Tables["Data"].Rows[0][1];
return dataSet;
}
}
您正在寻找 SqlReader.NextResult() 方法,因此:
public List<DataTable> RunStoredProc(string databaseConnection)
{
var dataTables = new List<DataTable>();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
SqlConnection = new SqlConnection(connectionString);
SqlCommand = new SqlCommand(sqlQuery, SqlConnection);
var reader = SqlCommand.ExecuteReader();
var dt1 = new DataTable().Load(reader);
dataTables.Add(dt1);
reader.NextResult();
var dt2 = new DataTable().Load(reader);
dataTables.Add(dt1);
// Make sure to really use usings here to ensure all resources are being
closed
return dataTables;
}
编辑:编辑以从 DataSet 更改为 DataTable 以使 Load 函数按照我指定的方式工作(不幸的是从内存中)。这将 return 现在是一个数据表列表(可能更恰当地表明正在 return 编辑的内容)。坦率地说,我不会使用它,更喜欢 EntityFramework 和强类型结果(但我当然不知道整个用例、性能要求等)。
我最终使用以下解决方案解决了我的问题。我的 SQL 存储过程看起来像这样
Select Top 1 field1 from table1
Select Top 1 field1 from table1
这是我使用的 C#(没有 html 创建 gridview)
protected void PopulateTestGrids()
{
DataSet ds = new DataSet();
ds = RunStoredProc();
DataTable tableA = ds.Tables[0];
DataTable tableB = ds.Tables[1];
GridView21.DataSource = tableA;
GridView21.DataBind();
GridView31.DataSource = tableB;
GridView31.DataBind();
}
public DataSet RunStoredProc(string databaseConnection)
{
ds = new DataSet();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
ds = ExecuteSqlQuery(databaseConnection, SqlQueryBuilder.ToString());
return ds;
}
public DataSet ExecuteSqlQuery(string databaseConnection, string sql)
{
try
{
System.Configuration.ConnectionStringSettings connstring = System.Configuration.ConfigurationManager.ConnectionStrings["abcddb"];
using (SqlConnection conn = new SqlConnection(connstring.ConnectionString))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = sqlQuery;
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(_dataSet);
conn.Close();
}
}
return _dataSet;
}
catch (Exception exception) { throw exception; }
}
如果我有一个存储过程
Alter dbo.Testing
Select userid from masterdb
where employed = 'Yes'
Select Count(*) from leftfield
where pin is not null
如何将每个查询的 returned 结果存储在单独的数据集中?
伪代码:
firstdataset = Select userid from masterdb where employed = 'Yes'
seconddataset = select count(*) from leftfield where pin is not null
编辑
我用它来 return 1 从存储过程到 C# 数据集的结果集。有没有可能return大于1?
public DataSet RunStoredProc(string databaseConnection)
{
ds = new DataSet();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
SqlConnection = new SqlConnection(connectionString);
SqlCommand = new SqlCommand(sqlQuery, SqlConnection);
SqlConnection.Open();
SqlCommand.CommandTimeout = 0;
ds = new DataSet();
SqlDataAdapter = new SqlDataAdapter(SqlCommand);
SqlDataAdapter.Fill(ds, "Data");
return ds;
}
编辑#2
public DataSet RunStoredProc(string databaseConnection)
{
ds = new DataSet();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
//Error 1 On Line Below
ds = ExecuteSqlQuery(databaseConnection, SqlQueryBuilder.ToString());
return ds;
}
public List<DataTable> RunStoredProc(string databaseConnection)
{
var dataTables = new List<DataTable>();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
SqlConnection = new SqlConnection(connectionString);
SqlCommand = new SqlCommand(sqlQuery, SqlConnection);
var reader = SqlCommand.ExecuteReader();
DataTable dt1 = new DataTable();
dt1.Load(reader);
dataTables.Add(dt1);
DataTable dt2 = new DataTable();
dt2.Load(reader);
dataTables.Add(dt2);
return dataTables;
}
Error # 1
Cannot implicitly convert type 'System.Collections.Generic.List' to 'System.Data.DataSet'
您需要一个函数来 return 结果,而不是存储过程。存储过程仅设计为 return 状态值。编写两个函数,每个函数 return 一个非标量值,本质上是一个数据集。
你可以这样做:
Alter dbo.Testing
-- Declare your variables
Declare @userId AS INT;
Declare @count AS INT;
-- Set the value
Select @userId = userid from masterdb where employed = 'Yes';
Select @count = Count(1) from leftfield where pin is not null;
-- Return the values
Select @userId, @count;
**编辑添加连接数据库的功能**
获取值的示例函数:
static DataSet sqlTest(string connectionString)
{
using (var sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
var sqlCommand = new SqlCommand("exec dbo.StoredProc", sqlConnection);
var dataSet = new DataSet();
var sqlDataAdapter = new SqlDataAdapter(sqlCommand);
sqlDataAdapter.Fill(dataSet, "Data");
// you can access your values like that:
var userId = dataSet.Tables["Data"].Rows[0][0];
var count = dataSet.Tables["Data"].Rows[0][1];
return dataSet;
}
}
您正在寻找 SqlReader.NextResult() 方法,因此:
public List<DataTable> RunStoredProc(string databaseConnection)
{
var dataTables = new List<DataTable>();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
SqlConnection = new SqlConnection(connectionString);
SqlCommand = new SqlCommand(sqlQuery, SqlConnection);
var reader = SqlCommand.ExecuteReader();
var dt1 = new DataTable().Load(reader);
dataTables.Add(dt1);
reader.NextResult();
var dt2 = new DataTable().Load(reader);
dataTables.Add(dt1);
// Make sure to really use usings here to ensure all resources are being
closed
return dataTables;
}
编辑:编辑以从 DataSet 更改为 DataTable 以使 Load 函数按照我指定的方式工作(不幸的是从内存中)。这将 return 现在是一个数据表列表(可能更恰当地表明正在 return 编辑的内容)。坦率地说,我不会使用它,更喜欢 EntityFramework 和强类型结果(但我当然不知道整个用例、性能要求等)。
我最终使用以下解决方案解决了我的问题。我的 SQL 存储过程看起来像这样
Select Top 1 field1 from table1
Select Top 1 field1 from table1
这是我使用的 C#(没有 html 创建 gridview)
protected void PopulateTestGrids()
{
DataSet ds = new DataSet();
ds = RunStoredProc();
DataTable tableA = ds.Tables[0];
DataTable tableB = ds.Tables[1];
GridView21.DataSource = tableA;
GridView21.DataBind();
GridView31.DataSource = tableB;
GridView31.DataBind();
}
public DataSet RunStoredProc(string databaseConnection)
{
ds = new DataSet();
DSqlQueryBuilder = new StringBuilder();
SqlQueryBuilder.Append("exec dbo.StoredProc ");
ds = ExecuteSqlQuery(databaseConnection, SqlQueryBuilder.ToString());
return ds;
}
public DataSet ExecuteSqlQuery(string databaseConnection, string sql)
{
try
{
System.Configuration.ConnectionStringSettings connstring = System.Configuration.ConfigurationManager.ConnectionStrings["abcddb"];
using (SqlConnection conn = new SqlConnection(connstring.ConnectionString))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = sqlQuery;
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(_dataSet);
conn.Close();
}
}
return _dataSet;
}
catch (Exception exception) { throw exception; }
}