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

时间:2015-06-16 15:56:16

标签: c# sql

我继续收到错误:已添加项目。键入字典:' @ 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;
    }

2 个答案:

答案 0 :(得分:3)

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

然后你忽略了"内部"完全哈希表。

我怀疑你想要摆脱&#34;外部&#34;哈希表,只需使用&#34; inner&#34;一个(Dictionary<string, object>)在添加参数和指定查询参数时。

暂且不说:

  • 我强烈建议使用泛型集合 - 在这种情况下可能是camelCased。 2004年非通用收藏品。
  • 参数和局部变量通常是queryParameters,例如QueryParameters,而不是 var dbDeleteRequest = window.indexedDB.deleteDatabase(DB_NAME); dbDeleteRequest.onerror = function(event) { //Code }; dbDeleteRequest.onsuccess = function(event) { //Code };
  • 您目前有一个&#34; N + 1选择&#34;问题 - 如果可能的话,你应该尝试使用连接一次性执行整个查询。

答案 1 :(得分:1)

你在这里遇到错误:

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

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

您可以使用QueryParameters而不是Parameters(对于下一行以及下一行)来解决问题。或者,您可以完全删除QueryParameters对象,只需重用您的Parameters对象:

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