msh*_*hwf 3 c# sql-server stored-procedures
我看到很多关于堆栈溢出的问题,不是它们触及了我自己的问题
过程或函数需要未提供的参数
我创建了这个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
Run Code Online (Sandbox Code Playgroud)
在我的数据访问层中,我有这个方法负责非查询命令:
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;
}
Run Code Online (Sandbox Code Playgroud)
负责创建参数的方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
并且业务层中的此方法传递来自表示层的参数
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;
}
Run Code Online (Sandbox Code Playgroud)
当用户点击添加新记录时插入表中(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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我单击Add按钮(传递空图像)时,我收到此错误:
过程或函数'spAddCustomer'期望参数'@cuImage'未提供
尽管表tblCustomers接受空值
我刚刚发现我可以在存储过程中为参数设置默认值:
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
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题!这对于PictureBox中的空图像特别有用,因为我有一个检查空字符串的辅助方法.
您需要检查输入是否为null,并DBNull.Value在创建参数时使用.如果你只是null作为参数传递- ADO.Net将忽略它.
编辑:
您可以将该检查添加到自定义方法中 DataAccessLayer.CreateParameter()
| 归档时间: |
|
| 查看次数: |
10512 次 |
| 最近记录: |