如何使用SqlAdapter执行带参数的SQL过程

本文关键字:SQL 过程 参数 行带 何使用 SqlAdapter 执行 | 更新日期: 2023-09-27 18:06:10

我有以下前端代码:

public void loadGrid()
    {
        dt = new DataTable();
        cmd = new SqlCommand();
        cmd.Connection = con;
        con.Open();
        cmd.CommandText = "SP_GET_STUDENT_DTLS";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@ROLL_NUM", DBNull.Value);
        cmd.Parameters.AddWithValue("@STD_ID", DBNull.Value);
        adp = new SqlDataAdapter();
        adp.SelectCommand = cmd;
        adp.Fill(dt);
        GvStudentdtls.DataSource = dt;
        GvStudentdtls.DataBind();
    }

下面是后端过程:

CREATE PROCEDURE [dbo].[SP_GET_STUDENT_DTLS] @ROLL_NUM VARCHAR(20),@STD_ID INT
AS
SET NOCOUNT ON;
BEGIN
    IF(@ROLL_NUM IS NULL)
    BEGIN
    SELECT * FROM dbo.TBL_MSTR_STUDENT_DTLS WHERE StdId=@STD_ID AND Status=1
    END
    ELSE IF(@STD_ID IS NULL)
    BEGIN
    SELECT * FROM dbo.TBL_MSTR_STUDENT_DTLS WHERE RollNo=@ROLL_NUM AND Status=1
    END
    ELSE IF(@ROLL_NUM IS NULL AND @STD_ID IS NULL)       
    BEGIN
    SELECT * FROM dbo.TBL_MSTR_STUDENT_DTLS WHERE Status=1 ORDER BY StdId DESC
    END     
  END

当我运行这段代码时,DataTable是空的,尽管没有抛出异常。出了什么问题?

如何使用SqlAdapter执行带参数的SQL过程

您似乎没有提供任何参数值:

cmd.Parameters.AddWithValue("@ROLL_NUM", DBNull.Value);
cmd.Parameters.AddWithValue("@STD_ID", DBNull.Value);

您应该输入实际的参数值而不是DBNull.Value

编辑:此外,您的存储过程也存在问题。以下代码:

IF(@ROLL_NUM IS NULL AND @STD_ID IS NULL)  

应该是if/else序列中的第一个if选择。否则它将永远不会被执行。

如果两者都为null,将执行第一个选择,这可能不会返回任何东西,因为您将寻找具有StdId=null的行,这是一个无效的测试。

过程不返回任何东西。SP_GET_STUDENT_DTLS所做的只是将选择结果打印到控制台。

如果您确实允许数据库中的int为null,那么您应该将参数传递为System.Data.SqlTypes.SqlInt32。Null,而不是DBNull。值

关于处理空值的更多信息…http://msdn.microsoft.com/en-us/library/ms172138 (v = vs.110) . aspx