[英]How do i pass a list of strings as a SQL Parameter in C#
我正在使用實體框架。 有人告訴我執行直接 sql 的建議方法是使用參數而不是直接將值插入查詢字符串中。 我嘗試制作單個 sql 參數並意識到有 2100 個參數限制(我在列表中有 8000 個字符串參數)...我可以通過將值直接傳遞給 mySQLQuery 字符串來使其工作,但我想知道如何傳遞它作為參數來避免sql注入攻擊? 我試過下面的代碼
var mySQLQueryString = "...WHERE DataID IN (@mySQLVariable)";
List<string> dataList = new List<string>();
SqlParameter param = new SqlParameter("@mySQLVariable", string.Join(",", dataList.ToArray()));
return context.Database.SqlQuery<ConcretePOCO>(mySQLQueryString, param).ToList();
當通過探查器查看它時,發送到 SQL 的數據是 '1,2,3,4'...我需要它是 '1', '2', '3', '4'.. ..
作為參數發送時如何完成此操作?
如何在 EF 中使用表值參數:
在 SQL 中創建一個新Type
CREATE TYPE DataIds AS TABLE
(
DataID int
)
在您的方法中,從您的列表中創建一個新的DataTable
using System.Ling;
using System.Data;
// ...
var dataIds = new DataTable();
dataIds.Columns.Add("DataID", typeof(int));
List<string> dataList = new List<string>();
// do what ever to fill your list with parameters
foreach (String item in dataList)
{
DataRow row = dataIds.NewRow();
row["DataID"] = item;
table.Rows.Add(row);
}
// When fetching data
var mySQLQueryString = "...WHERE DataID IN (SELECT DataID FROM @mySQLVariable)";
SqlParameter param = new SqlParameter("@mySQLVariable", SqlDbType.Structured);
param.Value = dataIds;
param.TypeName = "dbo.DataIds";
return context.Database.SqlQuery<ConcretePOCO>(mySQLQueryString, param).ToList();
傳遞給 sql 時使用分隔符,然后在 sql 中使用 STRING_SPLIT 將其分解為一個表。
例子:
SqlParameter param = new SqlParameter("@mySQLVariable", string.Join("**~**", dataList.ToArray()));
然后在 sql 中做
select value FROM STRING_SPLIT(@mySQLVariable, '~')
我可以想到幾種方法來完成這項工作。 一種可能的方法是將工作保留在服務器上,而不是在查詢中。 請記住,根據我們討論的數據量,這可能不是最快的過程。 但如果我們只是談論 9,000,那么應該沒問題。
將 LINQ 與 Entity Framework 一起使用,並且如果您的 Id 是字母數字,那么這應該可行。 您的語法可能因您的實現而異...
var myResults= context.MyTable.Any(t => t.DataID.Intersect(dataList));
現在,如果這最終太慢,那么您可以將您的 ID 列表轉換為HashSet
。
var myHashSet = new HashSet<string>(dataList);
var myResults = context.MyTable.Where(t => myHashSet.Overlaps(t.DataID));
(免責聲明:我沒有測試過任何這些。我正在失去記憶。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.