【问题标题】:Stored Procedure in C#C#中的存储过程
【发布时间】:2012-06-27 17:31:17
【问题描述】:

我想在 c# 中使用存储过程。我在 sql server 中创建存储过程,并在程序中调用它。但是当我使用断点功能时,我知道由于断点跳过了循环,因此没有从数据库中检索数据。..

.aspx 代码:

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="store" />
<asp:Label ID="Label9" runat="server" Text="Label"></asp:Label>

c#代码:

public void store(object sender, EventArgs ser)
{
    try
    {
        // c reate and open a connection object
        SqlConnection conn = Class3.GetConnection();

        // 1. create a command object identifying the stored procedure
        SqlCommand cmd = new SqlCommand("storeprocedure3", conn);

        // 2. set the command object so it knows to execute a stored procedure
        cmd.CommandType = CommandType.StoredProcedure;

        // 3. add parameter to command, which will be execute the command
        SqlDataReader rdr = cmd.ExecuteReader();

        // iterate through results, printing each to console
        while (rdr.Read())
        {
            Label9.Text = rdr["menuename"].ToString();
        }
    }
    catch (Exception sa)
    {
        Console.WriteLine(sa);
    }
}

存储过程:

CREATE PROCEDURE procedure3     
AS
BEGIN
    select menuename from menue;

END
GO

【问题讨论】:

  • 如果您直接对数据库运行存储过程,例如在 Sql Management Studio 中,它是否会返回数据?
  • 我注意到您为属性分配了一个标量值:Label9.Text= rdr["menuename"].ToString();您应该考虑使用 cmd.ExecuteScalar() 而不是 cmd.ExecuteReader() 以防您从存储过程中检索单个值
  • - 是否发生异常? (提示:Console.WriteLine 在 Web 应用程序中不是很有用) - 连接是否以正确的用户身份执行? (from menue 不明确 - 这取决于用户) - 这是什么时候运行的?还;需要更多using...
  • 您是否尝试过直接针对数据库运行您的过程(使用 Sql Server Management Studio)来查看它是否真的返回任何行?此外,在 ASP.Net 项目中使用 Console.WriteLine 有点没用,请确保在您的 catch 子句中放置一个断点以查看是否发生任何异常,然后找到更好的方法来处理您的异常。

标签: c# sql .net tsql stored-procedures


【解决方案1】:

IMO,这是最大和最可能的问题:

catch (Exception sa)
{
    Console.WriteLine(sa);
}

想象它试图真的很难告诉你哪里出了问题,但你让它沉默了。 try/catch 这个没有任何理由;如果这不起作用,有些地方很不对 - 让它出错。阅读异常详情。

如果我很挑剔(坦率地说,我很挑剔) - 你需要更多using在这里,即

using(SqlConnection conn = Class3.GetConnection())
using(SqlCommand cmd = new SqlCommand("whatever", conn))
{
    cmd.CommandType = CommandType.StoredProcedure;
    using(SqlDataReader rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
           // do something
        }
    }
}

或者,坦率地说,更简单的是,使用像 dapper 这样的工具:

using(SqlConnection conn = Class3.GetConnection())
{
    foreach(var obj in conn.Query("whatever",
          commandType: CommandType.StoredProcedure))
    {
        string menuename = obj.menuename;
        // do something...
    }
}

【讨论】:

    【解决方案2】:

    您的程序不匹配(procedure3 vs storeprocedure3

    使用此代码

     SqlCommand cmd = new SqlCommand("procedure3 ", conn);
    

    并关闭你的连接

     SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    

    【讨论】:

    • ...如果这是一个 C# 存储过程,连接将来自上下文,并且您不会(想要)关闭或处置它
    【解决方案3】:

    EXEC procedure 会产生任何结果吗?

    此外,在您的代码中,您将存储过程引用为 storeprocedure3,而实际上过程名称似乎是 procedure3

    将行改为:

    SqlCommand cmd = new SqlCommand("procedure3", conn);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      相关资源
      最近更新 更多