【问题标题】:Return string from SQL Procedure to C#从 SQL 过程返回字符串到 C#
【发布时间】:2013-04-11 16:22:56
【问题描述】:

我有一个这样的 SQL 创建过程查询

    USE KOST
    GO
    --Cabang means Branch in Bahasa.

CREATE PROCEDURE login_pro
        --received parameter
        @NoIDStaff VARCHAR(5),
        @Password VARCHAR (50)


    AS

    --sent parameter
    DECLARE @status INT
    DECLARE @IDCabang VARCHAR(5)

    --owner login
    IF EXISTS(SELECT IDCabang, [Password]
                FROM MsStaff 
                WHERE @NoIDStaff=NoIDStaff AND @Password=[Password]
                AND NoIDStaff LIKE('B%'))
            SET @status=1

    --staff login
    ELSE IF EXISTS(SELECT IDCabang, [Password]
                FROM MsStaff 
                WHERE @NoIDStaff=NoIDStaff AND @Password=[Password]
                AND NoIDStaff LIKE('A%'))
            BEGIN
            SELECT @IDCabang=IDCabang FROM MsStaff
            SET @status=2
            SET @IDCabang = (select IDCabang FROM Msstaff where @NoIDStaff=NoIDStaff AND @Password=[Password]
                AND NoIDStaff LIKE('A%'))
            END

    --neither of them login
    ELSE
            set @status=0

    select @status, @IDCabang
    GO

查询返回状态值,但不返回 IDCabang。 我应该怎么做才能返回 IDCabang 的值?

这是我的 C# 代码:

 private void submit_Click(object sender, EventArgs e)
    {
        NoIDStaff = new SqlParameter();
        Password = new SqlParameter();
        SqlConnection con = new SqlConnection(strCon);

        com = new SqlCommand();
        com.Connection = con;
        con.Open();

        com.CommandType = CommandType.StoredProcedure;
        com.CommandText = "login_pro";

        NoIDStaff.SqlDbType = SqlDbType.VarChar;
        NoIDStaff.Size = 50;
        NoIDStaff.ParameterName = "@NoIDStaff";
        NoIDStaff.Value = username.Text.ToString();
        NoIDStaff.Direction = ParameterDirection.Input;

        Password.SqlDbType = SqlDbType.VarChar;
        Password.Size = 50;
        Password.ParameterName = "@Password";
        Password.Value = password.Text.ToString();
        Password.Direction = ParameterDirection.Input;

        com.Parameters.Add(NoIDStaff);
        com.Parameters.Add(Password);



        int status;
        string IDCabang;
        status = Convert.ToInt16(com.ExecuteScalar());
        IDCabang = Convert.ToString(com.ExecuteScalar());


        //owner login
        if (status == 1)
        {
            this.Hide();
            frm = new Form2();
            frm.Show();
        }

        //staff login
        else if (status == 2)
        {
            this.Hide();
            frm4 = new Form4(IDCabang);
            frm4.Show();
        }


        else if (username.Text.Equals(""))
        {
            MessageBox.Show("Username Must be Filled!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        else if (password.Text.Equals(""))
        {
            MessageBox.Show("Password Must be Filled!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        else
        {
            MessageBox.Show("Invalid Username or Password", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        con.Close();
    }

我想接收 IDCabang 作为字符串,所以我可以将它发送到 Form4。但看起来,IDCabang 没有返回任何值。

【问题讨论】:

  • “不返回”是什么意思?由于您没有给它们起别名,您如何在 C# 代码中引用这些列?你为什么不使用正确的输出参数?
  • 您的代码可以采用三种路径。如果,否则如果,否则。您只是在 Else If 路径中设置 @IDCabang 的值,因此如果它不通过此路径,它将不会被设置。
  • 在您的两种情况下,您不会尝试将@IDCabang 设置为任何意味着如果它完全返回,它将作为 DBNull 值返回,具体取决于您的 C# 代码的方式设置。当您尝试访问返回值时,您的 C# 代码是什么样的?
  • @jasonwhisman 我已经发布了我的 C# 代码。你能看一下吗?

标签: sql sql-server string procedure


【解决方案1】:

试试这个

SqlDataReader reader = com.ExecuteReader();

while (reader.Read())
{
  status = reader["Status"] == DBNull.Value ? 0 : (int)reader["Status"];
  IDCabang = reader["IDCabang"] == DBNull.Value ? null : (string)reader["IDCabang"];
}

【讨论】:

    【解决方案2】:

    你试过这样吗:

        USE KOST
        GO
        --Cabang means Branch in Bahasa.
    
    CREATE PROCEDURE login_pro(@IDCabang VARCHAR(5))
            --received parameter
            @NoIDStaff VARCHAR(5),
            @Password VARCHAR (50)
    
    
        AS
    
        --sent parameter
        DECLARE @status INT
    
    
        --owner login
        IF EXISTS(SELECT IDCabang, [Password]
                    FROM MsStaff 
                    WHERE @NoIDStaff=NoIDStaff AND @Password=[Password]
                    AND NoIDStaff LIKE('B%'))
                SET @status=1
    
        --staff login
        ELSE IF EXISTS(SELECT IDCabang, [Password]
                    FROM MsStaff 
                    WHERE @NoIDStaff=NoIDStaff AND @Password=[Password]
                    AND NoIDStaff LIKE('A%'))
                BEGIN
                SELECT @IDCabang=IDCabang FROM MsStaff
                SET @status=2
                SET @IDCabang = (select IDCabang FROM Msstaff where @NoIDStaff=NoIDStaff AND @Password=[Password]
                    AND NoIDStaff LIKE('A%'))
                END
    
        --neither of them login
        ELSE
                set @status=0
    
        select @status, @IDCabang
        GO
    

    另见THIS

    【讨论】:

    • 我试过你的代码,但它说“'DECLARE'附近的语法不正确。需要一个变量”
    • @AdyanaPermatasari 我修好了。不需要关键字 DECLARE。
    • @AdyanaPermatasari 也可以参考我帖子中的链接。那里解释了如何做 SQL 和 C#。
    • 还是不行。我看过你的链接。但它只告诉如何返回 int 值。不是字符串值
    • @AdyanaPermatasari 所以如果它显示如何返回 int 我相信你可以轻松地将其更改为字符串。
    【解决方案3】:

    您正在使用 ExecuteScalar,它只会查看返回集的第一行和第一列:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

    您确实想使用 ExecuteReader 或类似的东西。此外,我会在您的选择中为您的变量设置别名,以便您在查找它们时可以更轻松地引用它们(即SELECT @status as Status, @IDCabang as IDCabang)。

    SqlDataReader reader = com.ExecuteReader();
    
    while (reader.Read())
    {
      status = reader["Status"] == DBNull.Value ? 0 : (int)reader["Status"];
      IDCabang = reader["IDCabang"] == DBNull.Value ? null : (string)reader["IDCabang"];
    }
    

    编辑:参考 Aaron Bertrand 的评论,您还可以在存储的过程中设置一个输出参数并阅读它。这里有更多关于如何做到这一点的细节:Get output parameter value in ADO.NET

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 2013-12-10
      • 2012-01-14
      • 2021-11-22
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多