如果这个问题具有误导性,请道歉,但我会尽力解释我想要实现的目标。
我有一个包含以下值的字典
Dim myDictionary As New Dictionary(Of Integer, Integer)
myDictionary.Add(1, 100)
myDictionary.Add(2, 200)
myDictionary.Add(3, 300)
myDictionary.Add(4, 400)
myDictionary.Add(5, 500)
myDictionary.Add(6, 600)
我通过循环遍历Dictioanry来生成一些插入查询:
Dim s As String = String.Empty
For Each kvp As KeyValuePair(Of Integer, Integer)
s &= "INSERT INTO myTable(id, qty) SELECT " & kvp.key & "," & kvp.value & ";" & vbCrLf
Next
Console.Write(s)
保存到我的String变量中的值如下:
INSERT INTO myTable(id, qty) SELECT 1, 100;
INSERT INTO myTable(id, qty) SELECT 2, 200;
INSERT INTO myTable(id, qty) SELECT 3, 300;
INSERT INTO myTable(id, qty) SELECT 4, 400;
INSERT INTO myTable(id, qty) SELECT 5, 500;
INSERT INTO myTable(id, qty) SELECT 6, 600;
然后,我将这些值插入数据库,如下所示:
myDb.ExecuteSQL(s)
我对上述内容感到满意,但我想探索/学习新方法。因此,我想知道是否有办法用LINQ
表达式生成上述输出?
例如:将INSERT
个查询保存到List(of String)
Dim myList As New String(of String)
myList = <LINQ expression here>
所以,我可以使用以下内容在控制台上打印并插入我的数据库。
console.Write(String.Join(vbCrLf, myList.ToString()))
myDb.ExecuteSQL(String.Join(vbCrLf, myList.ToString()))
修改
我知道parameterized SQL
用法,SQL Injection
等,我一直在我的项目中使用它们。上面的例子只是为了简单起见并解释我想要实现的目标。
我很想知道是否有办法与LINQ
实现相同(它不一定需要更清洁),谢谢。
答案 0 :(得分:2)
f有没有办法用LINQ表达式产生上述输出?
是的,但不一定更清洁。
类似的东西,在C#中(因为VB lambdas看起来很可怕)
// Get IEnum<string>, one SQL command per string
// NB. enumerating a dictionary gives IEnum<KeyValuePair<TKey, TVal>>
var exprs = myDictionary.Select(kv =>
// Build SQL
);
var cmdStr = String.Join("\r\n", exprs);
然而这是 BAD 。您应该使用参数将值传递给数据库,以帮助避免SQL注入漏洞。
循环更容易:
var params = new List<DbParameter>();
int nParam = 0;
var sb = new StringBuider();
foreach (var kv in myDictionary) {
sb.AppendFormat("INSERT INTO myTable(id, qty) values (@p{0}, @p{1})",
nParam, nParam+1);
sb.AppendLine();
params.Add(MakeDbParam("@p" + nParam.ToString(), kv.Key);
params.Add(MakeDbParam("@p" + (nParam+1).ToString(), kv.Value);
nParam +=2
}
然后在执行命令时包含参数集合。