簡體   English   中英

如何在 C# 中將字符串列表作為 SQL 參數傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM