我看到很多关于堆栈溢出的问题,没有他们触及我自己的问题
过程或函数需要未提供的参数
我创建了这个SQL Server存储过程:
CREATE proc [dbo].[spAddCustomer]
@cuName varchar(50),
@cuAddress varchar(50),
@cuMobile varchar(50),
@cuImage image,
@cityId int,
@exist int output
AS
BEGIN
IF NOT EXISTS(SELECT Cu_Mobile FROM tblCustomers WHERE Cu_Mobile = @cuMobile)
BEGIN
INSERT INTO tblCustomers (Cu_Name, Cu_Address, Cu_Mobile, Cu_Image, City_ID)
VALUES (@cuName, @cuAddress, @cuMobile, @cuImage, @cityId)
SET @exist = 1
END
ELSE
SET @exist = 0
END
在我的数据访问层中,我有这个方法负责非查询命令:
public static int ExecuteNonQuery(string query, CommandType type, params SqlParameter[] arr)
{
int outParam;
SqlCommand cmd = new SqlCommand(query, cn);
cmd.Parameters.AddRange(arr);
cmd.CommandType = type;
int i = cmd.ExecuteNonQuery();
foreach (SqlParameter param in arr)
{
if (param.Direction == ParameterDirection.Output)
{
outParam = (int)cmd.Parameters[param.ToString()].Value;
return outParam;
}
}
return i;
}
负责创建参数的方法:
public static SqlParameter CreateParameter(string name, SqlDbType type, object value, ParameterDirection pd = ParameterDirection.Input)
{
SqlParameter pr = new SqlParameter();
pr.ParameterName = name;
pr.Direction = pd;
pr.SqlDbType = type;
pr.SqlValue = value;
return pr;
}
在业务层中使用此方法,从表示层传递参数
public static int spAddCustomer(string cusName, string cusAddress, string cusMobile, byte[] arrImg, int cityId)
{
DataAccessLayer.Open();
int i = DataAccessLayer.ExecuteNonQuery("spAddCustomer", CommandType.StoredProcedure,
DataAccessLayer.CreateParameter("@cuName", SqlDbType.VarChar, cusName),
DataAccessLayer.CreateParameter("@cuAddress", SqlDbType.VarChar, cusAddress),
DataAccessLayer.CreateParameter("@cuMobile", SqlDbType.VarChar, cusMobile),
DataAccessLayer.CreateParameter("@cuImage", SqlDbType.Image, arrImg),
DataAccessLayer.CreateParameter("@cityId", SqlDbType.Int, cityId),
DataAccessLayer.CreateParameter("@exist", SqlDbType.Int, null, ParameterDirection.Output));
DataAccessLayer.Close();
return i;
}
当用户点击添加时,新记录将插入表格(tblCustomers
)
private void btnAU_Click(object sender, EventArgs e)
{
byte[] imgArr;
if (PbCustomer.Image == null)
imgArr = null;
else
{
MemoryStream ms = new MemoryStream();
PbCustomer.Image.Save(ms, PbCustomer.Image.RawFormat);
imgArr = ms.ToArray();
}
int cityId = int.Parse(cmbCities.SelectedValue.ToString());
try
{
int exist = CustomerClass.spAddCustomer(txtName.Text, txtAddress.Text, txtMobile.Text, imgArr, cityId);
if (exist == 1)
{
MessageBox.Show("A new customer has been saved");
txtAddress.Text = txtMobile.Text = txtName.Text = "";
PbCustomer.Image = null;
}
else
MessageBox.Show("A customer with the same mobile number\nalready exists, add new number!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
但是当我点击Add
按钮(传递空图像)时,我收到此错误:
程序或功能' spAddCustomer'期望参数' @ cuImage' 没有提供
尽管表tblCustomers
接受空值
答案 0 :(得分:7)
您需要检查输入是否为空,并在创建参数时使用DBNull.Value
。如果您只传递null
作为参数 - ADO.Net将忽略它。
修改强>
您可以将该检查添加到自定义方法DataAccessLayer.CreateParameter()
答案 1 :(得分:7)
我刚刚发现我可以在存储过程中为参数设置默认值:
ALTER proc [dbo].[spAddCustomer]
@cuName varchar(50)=null,
@cuAddress varchar(50)=null,
@cuMobile varchar(50)= null,
@cuImage image= null,
@cityId int= null,
@exist int output
这解决了我的问题! 这对于PictureBox中的空图像特别有用,因为我有一个检查空字符串的辅助方法。