用于创建存储过程的SQL select查询在asp.net中不起作用

时间:2017-11-01 15:33:11

标签: c# sql asp.net drop-down-menu procedure

我正在尝试使用C#asp.net在Visual Studio中创建存储过程。程序是这样的:

    SqlConnection connection = new SqlConnection(...);
    SqlCommand command = new SqlCommand();

    try
    {
        connection.Open();
        command.CommandType = CommandType.Text;
        command.CommandText = "CREATE PROCEDURE NumberOfPatientsWithAChosenDiagnosis(@diagnosis VARCHAR, @numberOfPatients INT OUTPUT) AS SELECT * FROM Patients WHERE diagnosis = '@diagnosis' " + "SELECT @numberOfPatients = COUNT(*) FROM Patients WHERE diagnosis = '@diagnosis'";
        command.Connection = connection;
        command.ExecuteNonQuery();
        tb_procedure.Text = "The procedure \"NumberOfPatientsWithAChosenDiagnosis\" was created with success!";
    }
    catch (Exception ex)
    {
        tb_procedure.Text = "Error at creating the procedure!\n" + ex.Message;
    }
    finally
    {
        connection.Close();
    }

我有一个DropDownList,其中包含表中的所有诊断。问题是,当我使用DropDownList中选择的诊断测试程序时,它会显示0结果,即使有所选诊断的记录。如果我更换参数' @ diagnosis'与流感'例如,该程序运作良好,它返回了流感患者的确切数量。我写错了什么?谢谢!

1 个答案:

答案 0 :(得分:0)

您只使用 VARCHAR 类型定义参数 @diagnosis ,并且缺少定义其大小。如果没有大小,则假定您需要 VARCHAR(1),因此在参数中只会设置一个char。

因此,每次调用存储过程并尝试使用类似' flu'等字符串设置 @diagnosis 参数时只有字母' f'由SP收到。并且您将找不到任何东西,因为没有单一的“f&f”定义的诊断。信。

只需在创建参数时添加大小

command.CommandText = @"CREATE PROCEDURE NumberOfPatientsWithAChosenDiagnosis
       (@diagnosis VARCHAR(100), .....

您的sql代码中还有另一个错误。您将参数放在单引号之间。这是一个文字字符串,它不再是参数占位符 您需要删除使用 @diagnosis 参数的位置周围的单引号。最后,如果您只想计算给定诊断的患者数量,那么就不需要第一个SQL SELECT。

command.CommandText = @"CREATE PROCEDURE NumberOfPatientsWithAChosenDiagnosis
            (@diagnosis VARCHAR(100), @numberOfPatients INT OUTPUT) 
            AS 
            -- Not needed ==> SELECT * FROM Patients WHERE diagnosis = @diagnosis;
            SELECT @numberOfPatients = COUNT(*) 
            FROM Patients 
            WHERE diagnosis = @diagnosis";