输入字符串格式不正确。在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); 
     } 
    } 

所有工作正常,如果我有输入两个,但是当我搜索序列号和托盘的值为空它显示一个错误。

有什么想法?

谢谢你的问候。

+1

你可以添加错误文本的问题? – 2010-09-16 08:01:11

此错误与您的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似乎会提醒用户并且不尝试操作。