【问题标题】:Calling a SP which has Insert Statement and returns a table调用具有插入语句并返回表的 SP
【发布时间】:2013-10-03 10:39:48
【问题描述】:

是否可以调用一个存储过程,它首先插入详细信息,最后返回一个表。目前我已经为它编写了两个存储过程:一个用于插入,另一个用于获取详细信息。现在我正试图同时做这两件事。

我使用ExecuteScalar 进行插入,使用ExecuteDataSet 进行选择。

【问题讨论】:

标签: c# asp.net sql-server ado.net


【解决方案1】:

如果您的存储过程使用 SELECT 返回数据(当然,我认为您需要读取该数据),那么您应该使用 SqlDataAdapter 及其 Fill 方法或使用 SqlCommand 上的 ExecuteReader 的 SqlDataReader

ExecuteReader:

using(SqlConnection cn = new SqlConnection(...))
using(SqlCommand cmd = new SqlCommand(procName, cn))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cn.Open()
    using(SqlDataReader r = cmd.ExecuteReader())
    {
        while(r.Read())
        {
            // read every row and use the field values .....
        }

    }    
}

SqlDataAdapter.Fill:

using(SqlConnection cn = new SqlConnection(...))
using(SqlCommand cmd = new SqlCommand(procName, cn))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cn.Open()
    using(SqlDataAdapter da = new SqlDataAdapter(cmd)
    {
        DataTable dt = new DataTable();
        da.Fill(dt);

        // DataTable filled with the data returned by the last SELECT in your SP
        ......
    }    
}

SqlCommand.ExecuteReaderSqlDataAdapter.Fill 将执行存储过程而不查看存储过程的功能,但他们希望返回某种表格数据以循环它

【讨论】:

    【解决方案2】:

    你写一个这样的过程

    CREATE PROCEDURE SP_Name
    (
     //PARAMETES
    )
    AS
    BEGIN
    
    //INSERT STATEMENT
    
    //SELECT STATEMENT
    
    END
    

    并调用 ExecuteDataSet()

    【讨论】:

    • 我已经创建了 SP。但我的问题是从 C# 代码调用该 SP。
    【解决方案3】:
    SqlConnection cn = new SqlConnectio(...)
    SqlCommand cmd = new SqlCommand("procName", cn)
     {
         cmd.CommandType = CommandType.StoredProcedure;
         cn.Open();
         cmd.ExecuteScalar();
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 2012-08-22
      • 2010-09-21
      • 2021-12-09
      • 2011-06-10
      • 2017-01-24
      相关资源
      最近更新 更多