输入字符串格式不正确。在SQL上选择像声明?
问题描述:
我创造了这个选择存储过程:输入字符串格式不正确。在SQL上选择像声明?
@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;
}
UI:
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);
}
}
所有工作正常,如果我有输入两个,但是当我搜索序列号和托盘的值为空它显示一个错误。
有什么想法?
谢谢你的问候。
答
此错误与您的SQL无关。
错误位于您在帖子中星号标出的行中。
fin.PalletNumber = Convert.ToInt32(txtSearchPallet.Text);
如果txtSearchPallet.Text是空的,你想一个空字符串转换为整数,这就是给你的“输入字符串的不正确的格式。”例外。
您需要首先检测托盘编号是否为空字符串,并将-1(说)分配给您的FillInEntity实例。
例如
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
)
)
答
你将不得不在你的存储过程添加逻辑,以检查参数值不包含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
答
你需要动态sql在这里或使用IsNull
@PalletNumber varchar(50) = NULL -- default null
SELECT *
FROM @FG_FILLIN
WHERE (SerialNumber LIKE @SerialNumber + '%')
AND (PalletNumber = @PalletNumber OR @PalletNumber IS NULL)
你的选择也有语法错误;即','后选择
答
我不认为它与SQL有任何关系。错误消息
输入字符串格式不正确。
恰好能满足您的Convert.ToInt32()
抛出的FormatException
获得当输入字符串不是一个数字的消息。
因此,与其:
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
似乎会提醒用户并且不尝试操作。
你可以添加错误文本的问题? – 2010-09-16 08:01:11