1

我想在 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
4

3 回答 3

5

您的程序不匹配(procedure3 vs storeprocedure3

使用此代码

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

并关闭你的连接

 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
于 2012-06-26T11:51:28.967 回答
5

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

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

真的很努力地告诉你出了什么问题,但你让它沉默了。没有任何理由这样做trycatch如果这不起作用,那就是非常错误的- 让它出错。阅读异常详细信息。

如果我很挑剔(坦率地说,我很挑剔) - 你在这里需要更多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...
    }
}
于 2012-06-26T11:53:58.610 回答
2

是否EXEC procedure产生任何结果?

同样在您的代码中,您引用了存储过程,因为storeprocedure3实际上过程名称似乎是procedure3

将行更改为:

SqlCommand cmd = new SqlCommand("procedure3", conn);
于 2012-06-26T11:55:07.637 回答