【发布时间】:2015-06-17 00:09:51
【问题描述】:
我不断收到错误消息:已添加项目。在字典中键入:'@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;
}
【问题讨论】:
-
为什么不测试字典中是否存在键 - 如果存在,要么不添加它,要么更新它,如果它不存在,添加值
-
您在循环中无条件地调用此函数:
Parameters.Add("@QueryID", row["QueryID"]);。在第二次迭代中,bound 会抛出异常。你怎么期望它不呢?您的意思是使用QueryParameters而不是Parameters?