我有一个问题,我不知道如何解决它。 我希望能够在同一个操作中运行相同的查询,在这种情况下,我创建了一个字典,其中包含需要在查询中添加的值。
查询是这样的:
INSERT INTO [dbo].[TestDB] ([ID], [Name], [Age]) VALUES (@{0}, @{1}, @{2});
正如我所说,我有一个包含我想要存储在数据库中的所有数据的词典。使用字符串构建器,我创建了具有值作为字典中的键的查询。例如:
INSERT INTO [dbo].[TestDB] ([ID], [Name], [Age]) VALUES (@1, @2, @3);
INSERT INTO [dbo].[TestDB] ([ID], [Name], [Age]) VALUES (@4, @5, @6);
INSERT INTO [dbo].[TestDB] ([ID], [Name], [Age]) VALUES (@7, @8, @9);
现在,当我想要使用值更改密钥时,不会修改查询。 这就是我正在使用的内容:
lCommand.Parameters.AddRange(lParameters.Select(x => new SqlParameter(string.Format("@"+x.Key.ToString()), x.Value)).ToArray());
其中lParameters是字典。
有一个好的!
编辑: 好的我将添加创建字符串构建器的代码和执行查询的代码。 在这里,我创建了包含所有插入查询的字符串构建器。
int lCurrentIndex = 0;
foreach (var litem in inCollection)
{
inSqlBuilder.AppendLine(string.Format(SQL.Insert, lPageCurrentIndex + 1, lPageCurrentIndex + 2, lPageCurrentIndex + 3));
Guid TemplateIdentifier = new Guid();
inDictionary.Add(lPageCurrentIndex + 1, ID);
inDictionary.Add(lPageCurrentIndex + 2, Name);
inDictionary.Add(lPageCurrentIndex + 3, Age);
lPageCurrentIndex += 3;
}
创建查询后,我将找到一种方法:
using (var lCommand = lConnection.CreateCommand())
{
lCommand.Transaction = lTransaction;
lCommand.CommandTimeout = 300;
lCommand.CommandText = SqlBuilder.ToString();
lCommand.Parameters.AddRange(lParameters.Select(x => new SqlParameter($"@x.Key", x.Value)).ToArray());
if(SqlBuilder.Length>0)
await lCommand.ExecuteNonQueryAsync();
}
答案 0 :(得分:0)
我刚刚测试了你的代码并且它工作正常,这是我如何做到的:
//Sample data
Dictionary<int, object> lParameters = new Dictionary<int, object>();
lParameters.Add(1, 1);
lParameters.Add(2, "Peter");
lParameters.Add(3, 22);
lParameters.Add(4, 2);
lParameters.Add(5, "John");
lParameters.Add(6, 24);
lParameters.Add(7, 3);
lParameters.Add(8, "Glenn");
lParameters.Add(9, 33);
using (SqlConnection conn = new SqlConnection(@"Your connection string"))
{
conn.Open();
using (SqlCommand lCommand = new SqlCommand("query", conn))
{
lCommand.Parameters.AddRange(
lParameters.Select(x => new SqlParameter($"@{x.Key}", x.Value)).ToArray());
for (int i = 1; i <= lParameters.Count; i+=3)
{
lCommand.CommandText = $"INSERT INTO[dbo].[TestDB]([ID], [Name], [Age])
VALUES(@{i}, @{i + 1}, @{i + 2});";
lCommand.ExecuteNonQuery();
}
}
}
那么,你的意思是不使用参数,而是检索每个索引的字典值?
using (SqlCommand lCommand = new SqlCommand("query", conn))
{
for (int i = 1; i <= lParameters.Count; i += 3)
{
lCommand.CommandText = $"INSERT INTO[dbo].[TestDB]([ID], [Name], [Age])
VALUES({lParameters[i]}, '{lParameters[i + 1]}', {lParameters[i + 2]});";
lCommand.ExecuteNonQuery();
}
}
或者使用stringbuilder将多个查询加载到单个字符串中然后执行它:
using (SqlConnection conn = new SqlConnection(connstring))
{
conn.Open();
StringBuilder query = new StringBuilder();
for (int i = 1; i <= lParameters.Count; i += 3)
query.Append($"INSERT INTO[dbo].[TestDB]([ID], [Name], [Age])
VALUES({lParameters[i]}, '{lParameters[i + 1]}', {lParameters[i + 2]});");
using (SqlCommand lCommand = new SqlCommand(query.ToString(), conn))
lCommand.ExecuteNonQuery();
}
如果字段是字符串
,请记住放置单引号