2013-11-27 69 views
-2

我是.net/C#的新手。來自PHP和一些Java,我發現新的語言有趣和具有挑戰性。C#SQL字符串格式化

我有一個SQL字符串

string query = @"select * from Users where role='member' and 
SUBSTRinG(lname, 1, 1) = '"+querystring + "' ORDER BY lname ASC"; 

這對我來說,看起來很好的問題。然而,當運行我的解決方案和輸出,因爲它是不工作的查詢,我得到這個作爲我的輸出:

select * from Users where role='member' and SUBSTRinG(lname, 1, 1) 
= ' O ' ORDER BY lname ASC 

這是輸出到我的Firebug的控制檯(使用該查詢通過AJAX被訪問的頁面)。

是他們的一個原因,我的正在變成他們的代碼版本,即「&#39'

感謝

+2

,請告訴我們您的代碼 – Marco

+0

這個代碼慘叫[SQL注入攻擊(http://en.wikipedia.org/wiki/SQL_injection) – Liam

+0

你能不能讓我們知道你正試圖在這裏實現什麼? –

回答

2

在C#中,你應該使用的SqlCommand到EXCUTE查詢,並防止SQL注入使用參數集合去。

您的查詢似乎很好 - 問題可能是您運行它的方式或提供的參數。更新您的問題,提供更多關於您的期望和發生的事情的詳細信息,包括生成的任何錯誤消息。

下面是如何從sql表中獲取數據到c#數據表對象的一般指導。

SqlConnection conn = new SqlConnection("YourConnectionString"); 
SqlCommand cmd = new SqlCommand(@"select * from Users where role='member' and 
SUBSTRinG(lname, 1, 1) = @query ORDER BY lname ASC"); 

cmd.Parameters.AddWithValue("@query", querystring); 

DataTable resultTable = new DataTable(); 

try 
{ 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    da.Fill(resultTable); 
} finally { 
    if (conn.State != ConnectionState.Closed) conn.Close(); 
} 

Console.WriteLine(String.Format("Matched {0} Rows.", resultTable.Rows.Count)); 
+0

當我輸出cmd.CommandText時,我得到了原始問題中提到的字符串...所以沒有返回結果 – nmyster

+0

@nmyster你不需要輸出CommandText。檢查查詢是否應通過SQL Management Studio或類似的東西直接運行SQL Server來返回任何值。你應該真的包含你的代碼;我們都在猜測。 – Kami

0

可以提供單引號轉義序列」通過將兩個單引號的',這樣它將被視爲SQL中的單引號。否則,它理解爲SQL中特定列值的字符串的開始或結束。

更換單引號在.NET中使用'還優選但其更好地用兩個單引號