Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试通过存储过程插入空值时获取SqlException_C#_Sql_Sql Server_Stored Procedures_Sql Insert - Fatal编程技术网

C# 尝试通过存储过程插入空值时获取SqlException

C# 尝试通过存储过程插入空值时获取SqlException,c#,sql,sql-server,stored-procedures,sql-insert,C#,Sql,Sql Server,Stored Procedures,Sql Insert,我有一个表,它接受一组参数,并通过使用INSERT INTO语句的存储过程将其保存为新联系人。出于某种原因,当我的一些参数保留为null时,我会得到一个SqlException。在SQL Server表中,所有保留为null的参数实际上都可以为null,因此我不理解这个问题。我的想法是,我的INSERT语句接受所有参数,即使它们为null,并尝试将它们插入到我的表中,我认为这是一个语法上的“否” 无论如何,这里是C代码: 下面是SQL中的存储过程: ALTER PROCEDURE [dbo].[

我有一个表,它接受一组参数,并通过使用INSERT INTO语句的存储过程将其保存为新联系人。出于某种原因,当我的一些参数保留为null时,我会得到一个SqlException。在SQL Server表中,所有保留为null的参数实际上都可以为null,因此我不理解这个问题。我的想法是,我的INSERT语句接受所有参数,即使它们为null,并尝试将它们插入到我的表中,我认为这是一个语法上的“否”

无论如何,这里是C代码:

下面是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”


如何编辑存储的进程以使其使用空值?

将参数的默认值设置为空,请尝试以下操作:

@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

将参数的默认值设置为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

当有null值时,应该传递DBNull.Value。比如说

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

当有null值时,应该传递DBNull.Value。比如说

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

成功了。考虑到这很容易,我觉得自己很愚蠢。非常感谢!!成功了。考虑到这很容易,我觉得自己很愚蠢。非常感谢!!这是一种比上述方法更安全的方法吗?非常感谢您的跟进。非常有教育意义的阅读肯定会影响未来的编程决策。这是一种比上述方法更安全的方法吗?非常感谢您的跟进。非常有教育意义的阅读肯定会影响未来的编程决策。