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