使用DataReader的存储过程

时间:2019-04-16 18:19:48

标签: c#

当尝试使用存储过程“ sp_receiptload”清理代码时;数据没有通过。

我想使用存储过程来减少代码行。以下是我目前拥有的作品。我想使用SqlCommand receiveload_cmd = new SqlCommand(“ sp_receiptload”),它在单个批处理查询中包含所有查询。我想使用多个阅读器删除。当我尝试执行时使用nextresult不会移动结果。当我在第一行的前面放置一会儿时,错误是阅读器没有打开。

http://localhost:8080/SpringMVC/

2 个答案:

答案 0 :(得分:0)

我不确定您如何使用下一个结果。但这是应如何使用。尝试一下,让我知道它是否适合您的情况

SqlCommand command = new SqlCommand(
          "SELECT * FROM ICVENDOR ORDER BY name" +
          "SELECT TOP 1 H_ID FROM ICRECEIPTH ORDER BY h_id DESC"+
          "SELECT item_id FROM ICITEM",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        do
        {
            Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
                reader.GetName(1));

            while (reader.Read())
            {
                //logic to read
            }               
        }
        while (reader.NextResult());

答案 1 :(得分:0)

我不会开始只为简单的SELECT查询创建存储过程,这些查询返回一组记录而没有任何特定的复杂逻辑。对于性能可能会更好,但对将来的维护则更复杂。

鉴于您对每个检索到的表都有不同的处理需求,并且可能要检索的数据量有限,我会使用DataSet和DataAdapter

using(SqlConnection con = new SqlConnection("........."))
{
    con.Open();
    string sqlText = @"SELECT name, vendor_id FROM ICVENDOR ORDER BY name;
                      SELECT TOP 1 H_ID FROM ICRECEIPTH ORDER BY h_id DESC;
                      SELECT item_id FROM ICITEM",
    DataSet ds = new DataSet();
    SqlCommand cmd = new SqlCommand(sqlText, con);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(ds);
    ProcessTableICVendor(ds.Tables[0]);
    ProcessTableICReceipt(ds.Tables[1]);
    ProcessTableICItem(ds.Tables[2]);
}

请注意,我已将第一个查询更改为仅返回所需的字段。因此,您不需要中间表即可初始化组合框。

当然,ProcessTableICxxx方法是您已经编写的代码的占位符