Получение SqlException при попытке вставить нулевые значения через хранимую процедуру

У меня есть таблица, которая принимает кучу параметров и сохраняет ее как новый контакт через хранимую процедуру с помощью оператора INSERT INTO. По какой-то причине я получаю SqlException, когда некоторые из моих параметров остаются нулевыми. Все параметры, оставленные равными нулю, действительно допускают значение NULL в таблице SQL Server, поэтому я не понимаю, в чем проблема. Я думаю, что мой оператор INSERT принимает все параметры, даже если они равны нулю, и пытается вставить их в мою таблицу, что, как я считаю, является синтаксическим «нет-нет»

Во всяком случае, вот код 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, который не был предоставлен.

Как я могу отредактировать сохраненную процедуру, чтобы она работала с нулевыми значениями?


person Carson    schedule 28.08.2013    source источник


Ответы (2)


Установите значение по умолчанию для параметра как null, попробуйте следующее:

@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
person Rômulo Spier    schedule 28.08.2013
comment
Это сработало. Я чувствую себя глупо, учитывая, что это было так просто. Благодаря тонну!! - person Carson; 29.08.2013

Вы должны передать DBNull.Value, когда у вас есть нулевое значение. Например.

 cmd.Parameters.AddWithValue("@email", email == null ? DBNull.Value : (object)email);
person Steve    schedule 28.08.2013
comment
Это более безопасный метод, чем приведенный выше? - person Carson; 29.08.2013
comment
stackoverflow.com/questions/4958379/ - person Steve; 29.08.2013
comment
Большое спасибо за продолжение. Очень познавательное чтение, которое определенно повлияет на будущие решения по программированию. - person Carson; 29.08.2013