ExecuteNonQuery()带有日期插入的异常

本文关键字:插入 异常 日期 ExecuteNonQuery | 更新日期: 2023-09-27 18:19:02

我有一个存储过程来插入记录并返回所插入记录的ID。

这是我的SQL实现:

ALTER PROCEDURE InsertViolation 
    @FactoryName nvarchar(50) ,
    @Type  nvarchar(100),
    @Location nvarchar(30) ,
    @Desc nvarchar(300),
    @Severity nvarchar(300),
    @DateObserved datetime,
    @ViolationNumber bigint output
AS
BEGIN
    SET NOCOUNT ON;
INSERT INTO Violation
       (Violation_Factory_Name
       ,Violation_Type
       ,Violation_Location
       ,Violation_Desc
       ,Violation_Severity
       ,Violation_Date_Observed)
 VALUES
       (@FactoryName
       ,@Type
       ,@Location
       ,@Desc
       ,@Severity
       ,@DateObserved)
SET @ViolationNumber=SCOPE_IDENTITY()
      RETURN  @ViolationNumber
END

和我有这个c#代码来调用这个过程:

 public static long Insert_Violation(Model.Violation violation)
 {
        string strStoredProcedureName = "InsertViolation";
        SqlCommand cmd = new SqlCommand(strStoredProcedureName);
        string strConnString = ConfigurationManager.ConnectionStrings["ViolationConnection"].ConnectionString;
        SqlConnection con = new SqlConnection(strConnString);
        cmd.Connection = con;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@FactoryName", violation.FactoryName);
        cmd.Parameters.AddWithValue("@Type", violation.ViolationType);
        cmd.Parameters.AddWithValue("@Location", violation.Location);
        cmd.Parameters.AddWithValue("@Desc", violation.ViolationDesc);
        cmd.Parameters.AddWithValue("@Severity", violation.Serverity);
        cmd.Parameters.AddWithValue("@DateObserved", violation.DateObserved);
        cmd.Parameters.AddWithValue("@ViolationNumber", -1).Direction = ParameterDirection.Output;
        try
        {
            con.Open();
            cmd.ExecuteNonQuery();
            return (long) cmd.Parameters["@ViolationNumber"].Value;
        }
        catch(Exception ex)
        {
            throw new Exception(ex.Message + " Date Parameter value is " + cmd.Parameters["@DateObserved"].Value + " 'n DateTime Object converted to string value is " + violation.DateObserved.ToString());
            return -1;
        }
        finally
        {
            con.Dispose();
            cmd.Dispose();
        }
    }

我发现行已插入数据库中,但在cmd.ExecuteNonQuery();抛出异常,问题是我使用了violation.DateObserved,这是c# DateTime对象,DB中相应的参数和字段为datetime

类型

下面是捕获的异常消息,我使用throw exception将其打印出来:

系统。异常:指定的类型转换无效。日期参数值为15/12/2012 12:00:00DateTime对象转换为字符串值为15/12/2012 12:00:00

所以我不能得到记录号,而不是我的函数返回-1作为捕获访问。

ExecuteNonQuery()带有日期插入的异常

return语句隐式地将结果强制转换为整数;因此,您应该将unbox设置为int,而不是long:

return (int) cmd.Parameters["@ViolationNumber"].Value;

如果你的值不适合int,那么要么使用out参数,要么使用select值并使用ExecuteScalar