【问题标题】:C# -Add parameters to query from DictionaryC# - 添加参数以从字典中查询
【发布时间】:2016-12-07 08:51:06
【问题描述】:

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

查询是这样的:

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

【问题讨论】:

  • 给我们看你的字典。
  • @grmbl Dictionary 的定义如下: var lParameters = new Dictionary() 并包含我需要的所有信息:生成的键是:1,2,3,4 ,5... 值按顺序排列:ID、姓名、年龄、ID、姓名、年龄。例如。 {1, 1}, {2, "Peter"}, {3, 22} 等
  • 您的表实际上是否命名为 TestDB 或者这是一个错字?另外,使用当前的 C# 不需要使用 string.format,您可以改为使用 $"@{x.Key}"
  • 你没看到你在这里缺少年龄吗...?
  • 您能否向我们展示您已经拥有的代码,因为您试图做的事情让我感到困惑......您如何匹配您的字典垂直选择的查询的参数数量?

标签: c# sql wpf


【解决方案1】:

我刚刚测试了你的代码,它运行良好,我是这样做的:

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

或者使用字符串生成器将多个查询加载到单个字符串中,然后执行它:

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

如果字段是字符串,请记住放置单引号

【讨论】:

  • 我明白了。但我希望创建命令 Text 看起来像这样: INSERT INTO [dbo].[TestDB] ([ID], [Name], [Age]) VALUES (@1, @2, @3);插入 [dbo].[TestDB] ([ID], [Name], [Age]) 值 (@4, @5, @6);插入 [dbo].[TestDB] ([ID], [Name], [Age]) 值 (@7, @8, @9);其中@1,@2,@3 是给定键的字典中的值。例如,key=1 给我字典中的 ID(例如 1),key =2 给我字典中的名字,例如 Peter
  • 类似的东西,但是一旦 CommandTest 完成并包含该表中的所有插入,就会执行 ExecuteNonQuery 命令。
  • @AlexandruFlorin 是的,这就是我在上一个代码示例中所做的。那么你弄清楚你的问题是什么了吗?
  • 是的。十分感谢。现在我正在测试是否一切正常。
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多