我正在尝试使用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'与流感'例如,该程序运作良好,它返回了流感患者的确切数量。我写错了什么?谢谢!
答案 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";