我對 C# 很陌生,當我嘗試使用 stringbuilder 執行 sql 查詢時遇到了一些問題。
這是名為 的表的一部分:
| ID | Name | InternalID |
|:----:|:---------:| :---------:|
| 1 | Emory Lu | 84765 |
| ... | ... | ... |
| 8 | John Smith| 52455 |
| 9 | John smith| 49 |
| ... | ... | ... |
請注意,此表中為 John Smith 分配了兩個不同的 InternalID(字串型別)。在第二條記錄中,他的姓氏以小寫的“s”開頭。
在輸入員工姓名時,我執行了一個簡單的 sql 查詢來選擇員工的 InternalID(字串型別):
public DataTable findInternalID(string name)
{
RecordConnection.Open();
DataTable output = new DataTable();
OleDbCommand bdCommand = RecordConnection.CreateCommand() as OleDbCommand;
StringBuilder x = new StringBuilder();
// SELECT InternalID FROM EmployeeList WHERE Name = "(name)"
x.AppendLine("SELECT InternalID ");
x.AppendLine("FROM EmployeeList ");
x.AppendLine($"WHERE Name LIKE '%{name}%'");
bdCommand.CommandText = x.ToString();
_dataAdapter = new OleDbDataAdapter(bdCommand);
_dataAdapter.Fill(output);
RecordConnection.Close();
return output;
}
此代碼塊適用于只有一條記錄的員工,但對于有多條記錄的員工,它將同時填充所有 InternalID 記錄并輸出,因為這行:
x.AppendLine($"WHERE Name LIKE '%{name}%'");
所以我嘗試將 LIKE 關鍵字更改為 "=" :
x.AppendLine($"WHERE Name = '%{name}%'");
但這給了我一個錯誤。
我怎樣才能編輯我的代碼,所以當輸入“John Smith”時只輸出“52455”,輸入“John smith”時只輸出“49”。
在main函式下,我寫了一段代碼來測驗這個函式:
string name = "John Smith"; // or John smith
DataTable output = _accessManager.findInternalID(name);
String message = result.Rows[0][0].ToString(); // Or ROWS[1][0]
MessageBox.Show(message);
順便說一句,我使用了 MS Access :)
=================問題解決了!=====================
我非常感謝大家幫助我。我考慮了每個人的建議,這是我的最終代碼。我使用了StrComp()非常適合在 MS Access 中執行區分大小寫的 sql 查詢的功能:
public DataTable findInternalID(string name)
{
RecordConnection.Open();
DataTable output = new DataTable();
OleDbCommand bdCommand = RecordConnection.CreateCommand() as OleDbCommand;
StringBuilder x = new StringBuilder();
x.AppendLine("SELECT InternalID ");
x.AppendLine("FROM EmployeeList ");
x.AppendLine($"WHERE StrComp(Name, @name, 0) = 0;");
bdCommand.CommandText = x.ToString();
bdCommand.Parameters.AddWithValue("name", $"{name}");
_dataAdapter = new OleDbDataAdapter(bdCommand);
_dataAdapter.Fill(output);
RecordConnection.Close();
return output;
}
只是一些注釋供將來參考,如果您使用的是 MS Access,那么COLLATE這些varbinary(MAX)功能并不適合您。
uj5u.com熱心網友回復:
對于初學者,您永遠不應該通過將用戶提供的資料連接到查詢字串中來構建 SQL 查詢。這樣做會使您容易受到SQL 注入的攻擊。相反,您應該使用查詢引數將用戶提供的資料傳遞給您的查詢。
重寫原始函式以使用引數可能如下所示:
public DataTable findInternalID(string name)
{
RecordConnection.Open();
var output = new DataTable();
var bdCommand = RecordConnection.CreateCommand() as OleDbCommand;
var x = new StringBuilder();
// SELECT InternalID FROM EmployeeList WHERE Name = "(name)"
x.AppendLine("SELECT InternalID ");
x.AppendLine("FROM EmployeeList ");
x.AppendLine("WHERE Name LIKE @name");
bdCommand.CommandText = x.ToString();
bdCommand.Parameters.AddWithValue("name", $"%{name}%");
_dataAdapter = new OleDbDataAdapter(bdCommand);
_dataAdapter.Fill(output);
RecordConnection.Close();
return output;
}
至于獲取區分大小寫的查詢,我不能說我實際上已經做到了。COLLATE假設您的資料庫是 SQL Server,它看起來應該可以作業。
x.AppendLine("SELECT InternalID ");
x.AppendLine("FROM EmployeeList ");
x.AppendLine("WHERE Name = @name COLLATE Latin1_General_CP1_CS_AS");
或者,也許轉換varbinary(MAX)為比較位元組?
x.AppendLine("SELECT InternalID ");
x.AppendLine("FROM EmployeeList ");
x.AppendLine("WHERE CAST(Name as varbinary(MAX)) = CAST(@name AS varbinary(MAX))");
另外,作為最后一點,您根本不需要使用 a StringBuilder。如果要跨多行格式化陳述句,則可以只使用string帶有識別符號的逐字記錄。@
string commandText = @"SELECT InternalId
FROM EmployeeList
WHERE Name = @name COLLATE Latin1_General_CP1_CS_AS";
uj5u.com熱心網友回復:
在 SQL Server 中你只需要區分大小寫的搜索,試試這個!
x.AppendLine($"WHERE Name = '{name}' COLLATE Latin1_General_CS_AS ");
在 MS-Access 中,試試這個!
x.AppendLine($"WHERE StrComp(Name, '{name}', 0) = 0");
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429059.html
