2012-12-01 18 views
1

我見過很多關於在Sql查詢和「like」中使用參數的問題,但我嘗試了所有我已經看到的編碼方式,但仍然無法獲得我的查詢結果。如果我在查詢本身中放置一個值,它運行良好。當我運行列出的第一個查詢時,出現錯誤「必須聲明標量變量」@Search「,但我認爲我是通過cmd.Parameters.AddWithValue語句來做到的。任何人都可以看到我可能做錯了什麼? 。獲取查詢以處理參數和「like」

  //Declare the connection object 
     SqlConnection Conn = new SqlConnection(); 
     Conn.ConnectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString; 

     //Connect to the db 
     Conn.Open(); 

     //Define query 

     //This query doesn't work 
     string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE '%' + @Search + '%')"; 

     //This query doesn't work either 
     string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE State LIKE @Search"; 

     //This query works 
     string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE State LIKE 'MI'"; 

     //Declare the Command 
     SqlCommand cmd = new SqlCommand(sql, Conn); 

     //Add the parameters needed for the SQL query 
     cmd.Parameters.AddWithValue("@Search", "%" + txtSearch.Text + "%");   

     //Declare a SQL Adapter 
     SqlDataAdapter da = new SqlDataAdapter(sql, Conn); 

     //Declare a DataTable 
     DataTable dt = new DataTable(); 

     //Populate the DataTable 
     da.Fill(dt); 

     //Bind the Listview 
     lv.DataSource = dt; 
     lv.DataBind(); 

     dt.Dispose(); 
     da.Dispose(); 
     Conn.Close(); 
+0

http://stackoverflow.com/questions/251276/howto-parameters-and-like-statement-sql –

+0

您正在使用什麼數據庫? –

+0

@rontornambe:這是SQL Server。 –

回答

4

在你上面的代碼不使用的SqlDataAdapter的參數時,在下面的代碼,你會在命令中使用SqlDataAdapter。

//This query doesn't work 
    string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE @Search)"; 

    //Declare the Command 
    SqlCommand cmd = new SqlCommand(sql, Conn); 

    //Add the parameters needed for the SQL query 
    cmd.Parameters.AddWithValue("@Search", "%" + txtSearch.Text + "%"); 

    //Declare a SQL Adapter 
    SqlDataAdapter da = new SqlDataAdapter(); 

    **sa.SelectCommand = cmd** 

如果您想不使用這將工作的參數化查詢:

//Declare the connection object 
    //This query doesn't work 
    string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE '%" + **txtSearch.Text** + "%')"; 

    //Declare a SQL Adapter 
    SqlDataAdapter da = new SqlDataAdapter(sql, conn); 
+0

好吧,我試過:'string sql =「選擇客戶ID,姓氏,名字,電子郵件,密碼,地址1,地址2,城市,州,郵編,電話,傳真從客戶地點(狀態LIKE'%+ @搜索+%') 「;'帶'cmd.Parameters.AddWithValue(」@ Search「,txtSearch.Text);'仍然沒有結果。讓我問一下:如果我使用更新面板,它會有所作爲嗎?今天之前我從來沒有用過,只是在瞭解它。但是,我把價值的查詢工作正常。 – user1576304

+0

更新面板應該沒有區別。如果您在命令中使用該方法,請將通配符添加到查詢中,並將select語句更改爲如下所示:SELECT CustomerID,LastName,FirstName,Email,Password,Address1,Address2,City,State,Zip,Phone,Fax FROM客戶在哪裏(狀態LIKE @搜索)。 – DMudge

+0

這裏不是一個killjoy,但是我在你的代碼和OP之間唯一的區別在於,你對'SqlCommand'對象使用了一個不同的構造函數重載,原來的重載仍然可以工作。 –

2
string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE '%' + @Search + '%')"; 

cmd.Parameters.AddWithValue("@Search",txtSearch.Text); 

這應該工作

0

而不是使用一個SqlDataAdapter你可以使用SqlDataReader

SqlDataReader myReader = cmd.ExecuteReader(); 

DataTable dt = new DataTable(); 
dt.Load(myReader); 

你會在你的代碼注意到,該paramater連接到CMD未實際使用,因此SqlDataAdapter不知道該參數。

4

你的主要問題是,你不使用你已經建立,因爲此構造

SqlDataAdapter da = new SqlDataAdapter(sql, Conn); 
因此

你還沒有使用參數,唯一可行的查詢命令是不的一個使用任何(第三個)。你改變你使用的是構造後,你應該使用這個構造來代替(即使用SqlCommand創建的)

SqlDataAdapter da = new SqlDataAdapter(cmd); 

,以下兩種查詢將適用:

string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE State LIKE @Search"; 
... 
cmd.Parameters.AddWithValue("@Search", "%" + txtSearch.Text + "%"); 

或本:

string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE State LIKE '%' + @Search + '%'"; 
... 
cmd.Parameters.AddWithValue("@Search", txtSearch.Text); 
+0

不使用字符串中的+符號是讓我感到滿意的 –

1

除了接受的答案,不要忘記用方括號替換你的_,%。否則,它仍然會給出錯誤的結果。

txtSearch.Text.Replace("_","[_]").Replace("%","[%]")