C# - 从Dictionary中添加要查询的参数

时间:2016-12-07 08:51:07

标签: c# sql wpf

我有一个问题,我不知道如何解决它。 我希望能够在同一个操作中运行相同的查询,在这种情况下,我创建了一个字典,其中包含需要在查询中添加的值。

查询是这样的:

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();
                    }

1 个答案:

答案 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();
}
  

如果字段是字符串

,请记住放置单引号