2013-08-28 30 views
1

我有一個表接受一堆參數,並使用INSERT INTO語句通過存儲過程將其保存爲新聯繫人。出於某種原因,當我的某些參數留空時,我得到一個SqlException。在SQL Server表中,所有留空的參數都是可空的,所以我不理解這個問題。我的想法是,我的INSERT語句正在接受所有參數,即使它們爲空,並試圖將它們插入到我的表中,我相信它是一個語法「no-no」當我嘗試通過存儲過程插入空值時獲取SqlException

無論如何,這裏是C#代碼:

try 
    { 
     using (SqlConnection sqlConn = new SqlConnection(connectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand("Insert_NewContact", sqlConn)) 
      { 
       sqlConn.Open(); 

       cmd.CommandType = CommandType.StoredProcedure; 

       cmd.Parameters.AddWithValue("@CompanyID", CompanyID); 
       cmd.Parameters.AddWithValue("@email", email); 
       cmd.Parameters.AddWithValue("@phone", phone); 
       cmd.Parameters.AddWithValue("@fax", fax); 
       cmd.Parameters.AddWithValue("@fName", fName); 
       cmd.Parameters.AddWithValue("@lName", lName); 
       cmd.Parameters.AddWithValue("@sendVia", sendVia);     
       cmd.Parameters.AddWithValue("@default", defaultContact); 
       cmd.Parameters.AddWithValue("@repo", repo); 
       cmd.Parameters.AddWithValue("@fail", fail); 
       cmd.Parameters.AddWithValue("@borrow", borrow); 
       cmd.Parameters.AddWithValue("@loan", loan); 

       cmd.ExecuteNonQuery(); 

       sqlConn.Close(); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     throw e; 
    } 

,這裏是在SQL存儲過程:

ALTER PROCEDURE [dbo].[Insert_NewContact] 

@CompanyID INT, 
@email  VARCHAR(50), 
@phone  VARCHAR(50), 
@fax  VARCHAR(50), 
@fName  VARCHAR(50), 
@lName  VARCHAR(50), 
@sendVia VARCHAR(50), 
@default BIT, 
@repo  TINYINT, 
@fail  TINYINT, 
@borrow  TINYINT, 
@loan  TINYINT 

AS 
BEGIN 
    SET NOCOUNT ON; 

BEGIN TRY 

    INSERT INTO Master_Contacts(
            companyID, 
            fName, 
            lName, 
            phone, 
            email, 
            fax, 
            send_via, 
            defaultcontact, 
            repoRole, 
            borrowRole, 
            failRole, 
            loanRole 
           ) 
    VALUES      (
            @CompanyID, 
            @fName, 
            @lName, 
            @phone, 
            @email, 
            @fax, 
            @sendVia, 
            @default, 
            @repo, 
            @borrow, 
            @fail, 
            @loan 
           )     
END TRY 

不知道爲什麼AS BEGIN和NOCOUNT是如此不可思議,但它們在存儲過程是正確的。

無論如何,如果我離開了電子郵件,電話,傳真等方式在我的應用空的,我得到這個錯誤:

SQLEXCEPTION是由用戶代碼 過程或函數「Insert_NewContact」需要參數「未處理@email ', 那是不供給的。

如何編輯我的存儲過程以使其與空值一起工作?

回答

2

設置該參數爲空的默認值,試試這個:

@CompanyID INT, 
@email  VARCHAR(50) = null, 
@phone  VARCHAR(50) = null, 
@fax  VARCHAR(50) = null, 
@fName  VARCHAR(50) = null, 
@lName  VARCHAR(50), 
@sendVia VARCHAR(50), 
@default BIT, 
@repo  TINYINT, 
@fail  TINYINT, 
@borrow  TINYINT, 
@loan  TINYINT 
+0

這工作。考慮到這很容易,我覺得很愚蠢。萬分感謝!! – Carson

+0

這很好,它的工作:) –

2

你應該通過DBNull.Value當你有一個空值。例如。

cmd.Parameters.AddWithValue("@email", email == null ? DBNull.Value : (object)email); 
+0

這是一個比以上更安全的方法? – Carson

+0

http://stackoverflow.com/questions/4958379/what-is-the-difference-between-null-and-system-dbnull-value – Steve

+0

非常感謝您的跟進。非常具有教育意義的閱讀材料肯定會影響未來的製作決策。 – Carson

0
ALTER PROCEDURE [dbo].[Insert_NewContact] 

@CompanyID INT, 
@email  VARCHAR(50) = null, 
@phone  VARCHAR(50) = null, 
@fax  VARCHAR(50) = null, 
@fName  VARCHAR(50) = null, 
@lName  VARCHAR(50) = null, 
@sendVia VARCHAR(50) = null, 
@default BIT = 0, 
@repo  TINYINT = 0, 
@fail  TINYINT = 0, 
@borrow  TINYINT = 0, 
@loan  TINYINT = 0 

AS 
BEGIN 
SET NOCOUNT ON; 

BEGIN TRY 

INSERT INTO Master_Contacts(
           companyID, 
           fName, 
           lName, 
           phone, 
           email, 
           fax, 
           send_via, 
           defaultcontact, 
           repoRole, 
           borrowRole, 
           failRole, 
           loanRole 
          ) 
VALUES      (
           @CompanyID, 
           @fName, 
           @lName, 
           @phone, 
           @email, 
           @fax, 
           @sendVia, 
           @default, 
           @repo, 
           @borrow, 
           @fail, 
           @loan 
          )     
END TRY