2011-03-27 56 views
0

這裏給出的值是數據庫層功能的代碼:C#asp.net:錯誤 - 沒有爲一個或多個必需參數

public static dsPersonnel GetPersonnel(string Database, string strSearch) 
    { 
     dsPersonnel DS; 
     OleDbConnection sqlConn; 
     OleDbDataAdapter sqlDA; 

     //create the connection string 
     sqlConn = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;" + 
      "Data Source=" + Database); 

     string query; 
     if (strSearch == "" || strSearch.Trim().Length == 0) 
     { 
      query = "SELECT * from tblPersonnel"; 
     } 
     else 
     { 
      query = "SELECT * FROM tblPersonnel WHERE LastName = " + strSearch + ""; 
     } 




     //create the adapter with query 
     sqlDA = new OleDbDataAdapter(query, sqlConn); 

     //create the dataset 
     DS = new dsPersonnel(); 

     //fill the data set 
     sqlDA.Fill(DS.tblPersonnel); 

     //return the dataset 
     return DS; 
    } 
} 

如果回發提交了一個空字符串我有它返回的所有記錄。但是當一個實際的字符串被傳遞給函數時,我得到錯誤「沒有給出一個或多個所需參數的值」。對於行

sqlDA.Fill(DS.tblPersonnel); 

在調試中,我驗證了字符串正在爲兩種情況構建正確,但我得到後者的錯誤。 我知道我應該使用參數化查詢,但這是我在課堂上學習過程中的一步。一次一個問題:)。有關這裏的問題的任何建議是?

+0

您的代碼可以廣泛應用於[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)。 – Oded 2011-03-27 20:49:03

回答

2
query = 
    "SELECT * FROM tblPersonnel WHERE LastName = '" + 
     strSearch + 
     "'"; 

添加引號搜索條件

+0

我發現它幾乎只要我發佈這個哈哈。多謝你們。定時器啓動後會選擇第一個答案。 – Sinaesthetic 2011-03-27 20:49:38

2

嘗試

query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch + "'"; 

或更好

query = string.Format("SELECT * FROM tblPersonnel WHERE LastName = '{0}'", strSearch); 
+1

@Oded - 這不是一個參數化查詢,並具有與使用串聯相同的安全問題。唯一的區別是它可能稍微更有效率。 string.Format會很高興地讓你插入一個sql注入。 – 2011-03-27 20:53:18

+0

@Mystere人 - 我的壞。我看到了格式,並假定它是參數化的。 – Oded 2011-03-27 21:05:08

2

您必須在其在SQL單引號的字符串。

query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch + "'"; 
1

看起來好像你在引用傳遞給查詢的參數。取而代之的

query = "SELECT * FROM tblPersonnel WHERE LastName = " + strSearch + ""; 

嘗試

query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch.Replace("'", "''") + "'"; 

注意額外的單引號,也替換()語句,其正確逃逸包含在你的過濾器單引號(例如撇號)

必須重申您的示例代碼確實包含多個問題和安全漏洞。

相關問題