我有一个表,它接受一组参数,并通过使用INSERT INTO语句的存储过程将其保存为新的联系人。由于某些原因,当我的一些参数被保留为空时,我会得到一个SqlException。在Server表中,剩下的所有参数都是可空的,因此我不理解这个问题。我的想法是,我的INSERT语句接受所有参数,即使它们为null,并试图将它们插入到我的表中,我认为这是一个语法"no-no“。
总之,下面是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”处理,该参数未提供。
如何编辑存储的proc以使其使用空值?
发布于 2013-08-28 22:01:29
将参数的默认值设置为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发布于 2013-08-28 22:02:28
当您有空值时,应该传递DBNull.Value。例如。
cmd.Parameters.AddWithValue("@email", email == null ? DBNull.Value : (object)email);发布于 2013-08-28 22:09:14
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 TRYhttps://stackoverflow.com/questions/18498910
复制相似问题