如何摆脱字典 C# 中的重复键

本文关键字:何摆脱 字典 | 更新日期: 2023-09-27 17:56:28

我不断收到错误:项目已被添加。输入字典:"@QueryID" 添加的键:"@QueryID"。我对此进行了一些研究,它告诉我我正在将重复的键插入字典对象中。.Net 中的字典对象只能具有唯一键。我不知道如何摆脱重复的键。

class Program
{
   private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    static void Main()
    {
        EMMADatabase db = new EMMADatabase(""); //set string to pass in based on App.config

        try
        {
            Hashtable Parameters = new Hashtable();
            //Parameters.Add("@UserCredentials", UserCredentials);
            DataTable result = db.Query("exec Metrics_ETL.dbo.uspDetermineQueriesToRunBasedOnSchedules", Parameters);
            DataTable QueriesToRun = db.Query("select QueryID from Metrics_ETL.dbo.QueriesToRun", Parameters);
            foreach(DataRow row in QueriesToRun.Rows)
            {
                Hashtable QueryParameters = new Hashtable();
                Parameters.Add("@QueryID", row["QueryID"]);
                DataTable QueryDetails = db.Query("select QueryID, Query, ObjectID, DataSourceID, DatabaseName, ServerName, ServerType, UserName, Password from Metrics_ETL.dbo.Queries where QueryID = @QueryID", Parameters);
                //log.Info(row["QueryID"]);
                //Console.WriteLine(row["QueryID"]);
                //create datasource - query datasource - get data into a datatable
                //write datatable to csv with correct filename (OR maybe C# can write to Excel)
            }

        }
        catch(Exception e)
        {
            Console.WriteLine("Error: " + e);
        }
        finally
        {
            Console.Read();
        }
    }

我认为这是增加@QueryID值的地方,但不确定。我是编程的初学者,所以我在这方面非常菜鸟。任何建议将不胜感激。

 private DataTable QueryToDataTable(string QueryString, Hashtable Parameters)
    {
        DataTable dt = new DataTable();
        using (new Impersonator("svc-emma-admin", "1dc", "618MId}QM"))
        {
            SqlCommand cmd = new SqlCommand(QueryString, DBConnection);
            cmd.CommandTimeout = 120;
            foreach (DictionaryEntry Parameter in Parameters)
            {
                cmd.Parameters.Add((string)Parameter.Key, SqlDbType.NVarChar);
                cmd.Parameters[(string)Parameter.Key].Value = Parameter.Value;
            }
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
        }
        return dt;
    }

如何摆脱字典 C# 中的重复键

您已经在循环外部创建了一个Hashtable,然后在循环内的每次迭代中创建了一个。但是,您无条件地添加到循环中的单个"外部"哈希表,因此在第二次迭代中它必然会失败。

然后,您将完全忽略"内部"哈希表。

我怀疑您想摆脱"外部"哈希表,并在添加参数和指定查询参数时仅使用"内部"哈希表(QueryParameters)。

顺便说一句:

  • 我强烈建议使用通用集合 - 在这种情况下可能是Dictionary<string, object>.非通用集合是2004年的情况。
  • 参数和局部变量通常camelCased,例如 queryParameters,而不是QueryParameters
  • 您当前有一个"N+1 选择"问题 - 如果可能的话,您应该尝试一次性执行整个查询并连接。

你在这里有一个错误:

Hashtable QueryParameters = new Hashtable();
Parameters.Add("@QueryID", row["QueryID"]);
DataTable QueryDetails = db.Query("...", Parameters);

您刚刚创建了一个新的哈希表QueryParameters,但您根本没有使用它。 相反,您将 QueryID 参数添加到参数哈希表,而不是查询参数哈希表。 由于每行都执行此行代码,因此它将在第二次迭代时崩溃。

可以通过使用查询参数而不是参数来解决此问题(对于下一行和下一行)。或者,您可以完全删除 QueryParameters 对象,然后重用您的 Parameters 对象:

// Hashtable QueryParameters = new Hashtable();
Parameters.Clear();
Parameters.Add("@QueryID", row["QueryID"]);