2008-09-30 85 views
3

當談到SQL時,我是一名新手。當創建一個參數存儲過程如下:存儲過程默認值

@executed   bit, 
@failure   bit, 
@success   bit, 
@testID    int, 
    @time    float = 0, 
@name    varchar(200) = '', 
@description  varchar(200) = '', 
@executionDateTime nvarchar(max) = '', 
@message   nvarchar(max) = '' 

這是T-SQL默認值的正確形式嗎?我試圖使用NULL而不是''。

當我試圖通過C#執行此過程時出現一個錯誤,指的是預期的描述,但未提供。當這樣調用時:

 cmd.Parameters["@description"].Value = result.Description; 

result.Description爲null。如果這不是在SQL中默認爲NULL(在我的情況「現在好」)?

這裏的調用命令:

 cmd.CommandText = "EXEC [dbo].insert_test_result @executed, 
          @failure, @success, @testID, @time, @name, 
          @description, @executionDateTime, @message;"; 

     ... 
     cmd.Parameters.Add("@description", SqlDbType.VarChar); 
     cmd.Parameters.Add("@executionDateTime", SqlDbType.VarChar); 
     cmd.Parameters.Add("@message", SqlDbType.VarChar); 

     cmd.Parameters["@name"].Value = result.Name; 
     cmd.Parameters["@description"].Value = result.Description; 
     ... 

     try 
     { 
      connection.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
     ... 
     finally 
     { 
      connection.Close(); 
     } 

回答

11

一個更好的方法是改變在CommandText只是SP的名稱,並且將CommandType爲StoredProcedure - 那麼參數將工作更加乾淨:

cmd.CommandText = "insert_test_result"; 
cmd.CommandType = CommandType.StoredProcedure; 

這也允許更簡單的名稱傳遞,而不是位置。

一般來說,ADO.NET需要DBNull.Value,而不是null。我只是用那些遍歷我指定參數和使用DBNull.Value替換所有空值的方便的方法 - 就這麼簡單(包裝):

foreach (IDataParameter param in command.Parameters) 
    { 
     if (param.Value == null) param.Value = DBNull.Value; 
    } 

但是!使用null指定值不同於讓它假定默認值。如果您希望它使用默認值,請不要在命令中包含參數。

0

如果您沒有使用命名參數,MSSQL將按收到的順序(按索引)獲取參數。我認爲在cmd對象上有這個選項。

所以你的SQL應該更像

EXEC [dbo].insert_test_result 
@executed = @executed, 
@failure = @failure, 
@success = @success, 
@testID = @testID, 
@time = @time, 
@name = @name, 
@description = @description, 
@executionDateTime = @executionDateTime, 
@message = @message; 
+0

容易,只需設置的CommandType到存儲過程和CommandText中爲 「insert_test_result」,雖然。 – 2008-09-30 21:09:40

0

cmd.CommandText = "insert_test_result"; 
cmd.Parameters.Add(new SQLParameter("@description", result.Description)); 
cmd.Parameters.Add(new SQLParameter("@message", result.Message)); 
try 
{ 
    connection.Open(); 
    cmd.ExecuteNonQuery(); 
} 
finally 
{ 
    connection.Close(); 
}