我一直在得到错误:项目已被添加。键入词典:添加'@QueryID'键:'@QueryID'。我对此做了一些研究,它告诉我我将重复键插入字典对象。 .Net中的Dictionary对象只能有唯一的键。我不知道如何摆脱重复键。如何摆脱字典C中的重复键#
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;
}
为什么不测试字典中是否存在密钥 - 如果存在,请不要添加它,要么更新它,如果它不存在,请添加值 – Alex
在你的循环中无条件地调用*:Parameters.Add(“@ QueryID”,row [“QueryID”]);'。在第二次迭代中,这是* bound *以引发异常。你是怎么指望它不?你的意思是使用'QueryParameters'而不是'Parameters'? –