2013-06-19 60 views
1

我有一個存儲過程來插入記錄並返回插入記錄的ID。ExecuteNonQuery()帶日期插入的異常

這是我的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

這裏是捕捉到的異常信息,我用拋出異常來打印:

的System.Exception:指定的轉換無效。日期參數值15/12/2012 12:00:00 DateTime對象轉換爲字符串值15/12/2012 12:00:00

所以我不能得到備案號,而不是我的函數返回-1,因爲捕獲被訪問。

+0

數據庫中該字段的數據類型是什麼?看起來像你有一個日期轉換問題你不能做一個'var viodate = string.Format(「mm/dd/yyyy hh:mm:ss」,violation.DateObserved)' – MethodMan

+1

@DJ該參數聲明爲日期時間:它應該作爲日期時間傳遞 - 不是字符串 –

+0

他說,數據庫中的相應字段是datetime類型的。 –

回答

1

return語句隱式地將結果轉換爲整數;因此,應該拆箱爲int,不long

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

如果值不適合它的int,那麼無論使用out參數,或select的價值和使用ExecuteScalar

+0

我非常感謝您 – user1675407

+0

我將返回值設置爲整數,因爲您告訴我非常感謝 – user1675407