输入字符串的格式不正确。在SQL上选择如Statement吗?

时间:2010-09-16 07:58:52

标签: c# 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;
    }

用户界面:

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);
        }
    }

如果我输入两者,所有事情都可以正常工作但是当我只是搜索序列号而托盘的值为空时它会显示错误。

任何想法?。

谢谢。

4 个答案:

答案 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的数据类型为intwhere子句为

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似乎会提醒用户并且不会尝试操作。