我创建了这个选择存储过程:
@SerialNumber varchar(50)
@PalletNumber varchar(50) ------> Datatype int
SELECT
,SerialNumber
, PalletNumber
FROM dbo.FG_FILLIN
WHERE (SerialNumber LIKE @SerialNumber + '%' )
AND (PalletNumber = @PalletNumber)
我将@palletnumber更改为varchar,因为Like'%'不接受int。
我的数据访问:
public DataSet FGSearchAll(FillinEntity fin)
{
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand("FGSearchAll", conn);
cmd.CommandType = CommandType.StoredProcedure;
DataSet dSet = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
cmd.Parameters.Add("@SerialNumber", SqlDbType.VarChar, 50).Value =
fin.SerialNumber;
cmd.Parameters.Add("@PalletNumber", SqlDbType.Int).Value =
fin.PalletNumber;
try
{
conn.Open();
da.Fill(dSet, "FGDATA");
conn.Close();
}
catch (SqlException)
{
throw;
}
return dSet;
}
用户界面:
private void SearchAll()
{
BAL obj = new BAL();
FillinEntity fin = new FillinEntity();
fin.SerialNumber = txtSearchSerial.Text ;
**fin.PalletNumber = Convert.ToInt32(txtSearchPallet.Text);**
try
{
dsdata = obj.FGSearchAll(fin);
if (dsdata.Tables[0].Rows.Count < 1)
{
MessageBox.Show("No Record Found!");
}
else
{
dgWIP.DataSource = dsdata;
dgWIP.DataMember = "FGDATA";
}
}
catch (ApplicationException ex)
{
MessageBox.Show(ex.Message);
}
}
如果我输入两者,所有事情都可以正常工作但是当我只是搜索序列号而托盘的值为空时它会显示错误。
任何想法?。
谢谢。
答案 0 :(得分:1)
此错误与您的SQL无关。
错误出现在你帖子中的星号中。
fin.PalletNumber = Convert.ToInt32(txtSearchPallet.Text);
如果txtSearchPallet.Text为空,则表示您正在尝试将空字符串转换为整数,这就是“输入字符串格式不正确”的原因。异常。
首先需要检测托盘编号是否为空字符串,并为您的FillInEntity实例指定-1(比方说)。
e.g。
fin.PalletNumber =
(txtSearchPallet.Text == "") ? -1 : Convert.ToInt32(txtSearchPallet.Text);
这将阻止发生异常。
我会继续如下:
将指定参数值的行更改为以下
DbParameter pallet = cmd.Parameters.Add("@PalletNumber", SqlDbType.Int);
if (fin.PalletNumber == -1)
pallet.Value = DBNull.Value
else
pallet.Value = fin.PalletNumber
更改存储过程,以便@PalletNumber的数据类型为int
,where
子句为
WHERE
(
SerialNumber LIKE @SerialNumber + '%'
AND
(
@PalletNumber is null
or
PalletNumber = @PalletNumber
)
)
答案 1 :(得分:0)
您必须在存储过程中添加逻辑以检查参数值是否包含NULL
值
你必须做这样的事情:
if (@PalletNumber is Null)
begin
SELECT
,SerialNumber
, PalletNumber
FROM dbo.FG_FILLIN
WHERE (SerialNumber LIKE @SerialNumber + '%' )
end
else
begin
SELECT
,SerialNumber
, PalletNumber
FROM dbo.FG_FILLIN
WHERE (SerialNumber LIKE @SerialNumber + '%' )
AND (PalletNumber LIKE @PalletNumber + '%')
end
答案 2 :(得分:0)
您需要动态sql或使用IsNull
@PalletNumber varchar(50) = NULL -- default null
SELECT *
FROM @FG_FILLIN
WHERE (SerialNumber LIKE @SerialNumber + '%' )
AND (PalletNumber = @PalletNumber OR @PalletNumber IS NULL)
您的选择也有语法错误;即SELECT
后的','答案 3 :(得分:0)
我认为它与SQL没有任何关系。错误消息
输入字符串的格式不正确。
正是输入字符串不是数字时FormatException
引发的Convert.ToInt32()
所得到的消息。
因此,而不是:
fin.PalletNumber = Convert.ToInt32(txtSearchPallet.Text);
你应该尝试类似......
if (!int.TryParse(txtSearchPallet.Text, out fin.PalletNumber))
{
MessageBox.Show("Please enter a number between x and y.");
return;
}
这将尝试将字符串转换为整数并将结果存储在fin.PalletNumber
中。如果转换失败,MessageBox
似乎会提醒用户并且不会尝试操作。