如何摆脱字典 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;
}
您已经在循环外部创建了一个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"]);