2010-09-16 40 views
0

我創造了這個選擇存儲過程:輸入字符串格式不正確。在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

回答

1

此錯誤與您的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 
    ) 
) 
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 
0

你需要動態sql在這裏或使用IsNull

@PalletNumber varchar(50) = NULL -- default null 

SELECT * 
FROM @FG_FILLIN 
WHERE (SerialNumber LIKE @SerialNumber + '%') 
AND (PalletNumber = @PalletNumber OR @PalletNumber IS NULL) 

你的選擇也有語法錯誤;即','後選擇

0

我不認爲它與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似乎會提醒用戶並且不嘗試操作。