繁体   English   中英

从SQL返回2个结果

[英]Return 2 Results From SQL

如果我有一个存储过程

Alter dbo.Testing
    Select userid from masterdb
    where employed = 'Yes'

    Select Count(*) from leftfield
    where pin is not null

如何将每个查询的返回结果存储在单独的数据集中?

伪代码:

firstdataset = Select userid from masterdb where employed = 'Yes'

seconddataset = select count(*) from leftfield where pin is not null

编辑

我使用它将1个结果集从存储过程返回到C#数据集。 是否有可能返回超过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;
}

错误#1
无法将类型'System.Collections.Generic.List'隐式转换为'System.Data.DataSet'

你可以这样做:

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函数按照我指示的方式工作(不幸的是从内存中)。 这将返回一个DataTables列表(可能更适当地指示返回的内容)。 坦率地说,我不会使用它,更喜欢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; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM