我有这个小方法可以用来从 SQL 中获取数据。我用 varSearch = ""
或 varSearch = "something"
来调用它。我想知道以这种方式编写方法是最好的还是将它分成两个方法(通过重载)会更好,或者我可以以某种方式参数化整个 WHERE
子句?
private void sqlPobierzKontrahentDaneKlienta(ListView varListView, string varSearch) {
varListView.BeginUpdate();
varListView.Items.Clear();
string preparedCommand;
if (varSearch == "") {
preparedCommand = @"
SELECT t1.[KlienciID],
CASE WHEN t2.[PodmiotRodzaj] = 'Firma' THEN
t2.[PodmiotFirmaNazwa] ELSE
t2.[PodmiotOsobaNazwisko] + ' ' + t2.[PodmiotOsobaImie] END AS 'Nazwa'
FROM [BazaZarzadzanie].[dbo].[Klienci] t1
INNER JOIN [BazaZarzadzanie].[dbo].[Podmioty] t2
ON t1.[PodmiotID] = t2.[PodmiotID]
ORDER BY t1.[KlienciID]";
} else {
preparedCommand = @"
SELECT t1.[KlienciID],
CASE WHEN t2.[PodmiotRodzaj] = 'Firma' THEN
t2.[PodmiotFirmaNazwa] ELSE
t2.[PodmiotOsobaNazwisko] + ' ' + t2.[PodmiotOsobaImie] END AS 'Nazwa'
FROM [BazaZarzadzanie].[dbo].[Klienci] t1
INNER JOIN [BazaZarzadzanie].[dbo].[Podmioty] t2
ON t1.[PodmiotID] = t2.[PodmiotID]
WHERE t2.[PodmiotOsobaNazwisko] LIKE @searchValue OR t2.[PodmiotFirmaNazwa] LIKE @searchValue OR t2.[PodmiotOsobaImie] LIKE @searchValue
ORDER BY t1.[KlienciID]";
}
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (SqlCommand sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Parameters.AddWithValue("@searchValue", "%" + varSearch + "%");
using (SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
string varKontrahenciID = sqlQueryResult["KlienciID"].ToString();
string varKontrahent = sqlQueryResult["Nazwa"].ToString();
ListViewItem item = new ListViewItem(varKontrahenciID, 0);
item.SubItems.Add(varKontrahent);
varListView.Items.AddRange(new[] {item});
}
}
}
varListView.EndUpdate();
}
最佳答案
更好的方法实际上是使用存储过程而不是将 SQL 硬编码到您的应用程序中。您可以将 where 子句参数传递给存储过程并在数据库端处理逻辑。
这种方法还提供了一个优势,如果您在另一个应用程序(例如 JAVA 应用程序)中需要此逻辑,则该逻辑集中在数据库中,因此您不必再次重写它。
关于c# - 这种方法是从 C# 获取 SQL 值的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2629733/