3

我有一个更新查询(存储过程),当我执行它时它在 SQL Server 中正常工作。

CREATE PROCEDURE updatestudenthws(@stdid nvarchar(50),@hwid int, @grade float)
AS
UPDATE Table_Exercise_Answer 
SET
ExAns_Grade = @grade
WHERE ExAns_Exercise = @hwid AND ExAns_Student = @stdid

但是当我运行程序时,它对我的​​表没有任何影响,而且我也没有任何错误。

     con.Open();
        SqlCommand cmd = new SqlCommand("updatestudenthws", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@hwid", SqlDbType.VarChar);
        cmd.Parameters.Add("@stdid", SqlDbType.VarChar);
        cmd.Parameters.Add("@grade", SqlDbType.VarChar);
        cmd.Parameters["@hwid"].Value = hwid;
        cmd.Parameters["@stdid"].Value = studentid;
        cmd.Parameters["@grade"].Value = grade;

        cmd.ExecuteNonQuery(); 
     con.Close();

我的错误是什么?我应该如何做这项工作?

4

3 回答 3

2

您定义存储过程参数的 ADO.NET 代码是错误的,因为您没有使用正确的数据类型定义参数。

您的存储过程定义:

  • @stdid nvarchar(50) --> 但您将其定义为varchar
  • @hwid int --> 但您将其定义为varchar
  • @grade float--> 但您将其定义为varchar

您需要将代码更改为:

SqlCommand cmd = new SqlCommand("updatestudenthws", con);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@hwid", SqlDbType.Int);   // this needs to be SqlDbType.Int 
cmd.Parameters.Add("@stdid", SqlDbType.NVarChar, 50);  // this should be SqlDbType.NVarChar and specify its proper length
cmd.Parameters.Add("@grade", SqlDbType.Float);  // this needs to be SqlDbType.Float
于 2013-11-14T12:48:04.973 回答
2

使用AddWithValue(),因此您不必提供类型,这使您犯了传递varcharint参数的错误。

 con.Open();
    SqlCommand cmd = new SqlCommand("updatestudenthws", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@hwid", hwid);
    cmd.Parameters.AddWithValue("@stdid", studentid);
    cmd.Parameters.AddWithValue("@grade", grade);
    cmd.ExecuteNonQuery(); 
 con.Close();
于 2013-11-14T12:40:36.990 回答
0

当您使用AddWithValue()时,您不必像 varchar 一样将类型传递给 int 参数。

 con.Open();
        SqlCommand cmd = new SqlCommand("updatestudenthws", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@hwid", hwid);
        cmd.Parameters.AddWithValue("@stdid", studentid);
        cmd.Parameters.AddWithValue("@grade", grade);
        cmd.ExecuteNonQuery(); 
     con.Close();
于 2014-01-01T10:37:51.123 回答