2014-05-19 36 views
1

我正在嘗試使用查詢來從表中使用一個 - 三個參數選擇所有內容;Command.Parameters [「@ name」]。Value正確的語法

SELECT * FROM PlantAreaCodes 
WHERE (@AreaCode IS NULL OR AreaCode = @AreaCode) 
AND (@AreaName IS NULL OR AreaName LIKE @AreaName) 
AND (@Comments IS NULL OR Comments LIKE @Comments); 

這裏是我的查詢的C#代碼:

mySqlCommand = mySqlConnect.CreateCommand(); 

mySqlCommand.CommandText = "SELECT * FROM PlantAreaCodes WHERE (@AreaCode IS NULL OR AreaCode = @AreaCode) AND (@AreaName IS NULL OR AreaName LIKE @AreaName) AND (@Comments IS NULL OR Comments LIKE @Comments);"; 

mySqlCommand.Parameters.Add("@AreaCode", MySqlDbType.Int32); 
mySqlCommand.Parameters.Add("@AreaName", MySqlDbType.VarChar); 
mySqlCommand.Parameters.Add("@Comments", MySqlDbType.Text); 

mySqlCommand.Parameters["@AreaCode"].Value = (string.IsNullOrEmpty(Convert.ToString(PModel.AreaCode)) ? (object)DBNull.Value : PModel.AreaCode); 
mySqlCommand.Parameters["@AreaName"].Value = (string.IsNullOrEmpty(PModel.AreaName) ? (object)DBNull.Value : PModel.AreaName); 
mySqlCommand.Parameters["@Comments"].Value = (string.IsNullOrEmpty(PModel.Comments) ? (object)DBNull.Value : PModel.Comments); 

mySqlReader = mySqlCommand.ExecuteReader(); 

該查詢允許用戶搜索一個,兩個,三個或沒有拋出任何錯誤的字段,但它僅適用於可爲空的類型。 Therefpre自PModel.AreaCodeint,搜索使用0而不是null。即。

SELECT * FROM PlantAreaCodes 
WHERE (NULL IS NULL OR AreaCode = NULL) 
AND (NULL IS NULL OR AreaName LIKE NULL) 
AND (NULL IS NULL OR Comments LIKE NULL); 

由於AreaCode = 0是一個有效的查詢,它將不返回任何字段。

我試過讓AreaCode可以通過聲明int? AreaCode = null爲空,但這不起作用。這將返回所有領域,而不是僅僅一個,一樣的,如果我使用了默認null

SELECT * FROM PlantAreaCodes 
WHERE (110 IS NULL OR AreaCode = 110) 
AND (NULL IS NULL OR AreaName LIKE NULL) 
AND (NULL IS NULL OR Comments LIKE NULL); 

但是這個查詢返回一個字段:

SELECT * FROM PlantAreaCodes 
WHERE (110 IS NULL OR AreaCode = 110) 
AND ('%General%' IS NULL OR AreaName LIKE '%General%') 
AND (NULL IS NULL OR Comments LIKE NULL); 

這將返回包含單詞「一般」的所有字段在名稱中:

SELECT * FROM PlantAreaCodes 
WHERE (NULL IS NULL OR AreaCode = NULL) 
AND ('%General%' IS NULL OR AreaName LIKE '%General%') 
AND (NULL IS NULL OR Comments LIKE NULL); 

如何在此查詢中使用不可爲空的類型?

+0

您可以顯示您用來發出數據庫請求的C#代碼嗎? –

+0

您是否直接運行查詢數據庫來檢查它是否適用於您要與之調用的輸入組合? –

+0

@PreetSangha是的查詢本身是健全的,我相信問題在於'AreaCode'參數,因爲它是一個'int',所以它的默認值是'0',而不是'null'。 – Ben

回答

0

好的,所以我得到了這個工作。主要問題是這需要比較nullnull,但int不能是null,因爲它是一個值類型。

所以我不得不做一些調整,我的代碼和我得到這個與解決方法

int? AreaCode = null; 

這讓我改變了我的代碼工作:

mySqlCommand.Parameters["@AreaCode"].Value = (PModel.AreaCode.HasValue ? PModel.AreaCode.Value : object)DBNull.Value); 

所有這些誰AREN不知道這裏發生了什麼:

運營商?給出了值類型沒有值的能力,所以它可以= null

即。

int n = 0; 
int? n = null; 

bool b = false; 
bool? b = null;