我有下面的代码,使用OleDB发送到数据库并使用信息填充数据集。然后检查以确保它在数据集中有某些内容,如果有,则将该数据集添加到数据表中,然后在函数末尾返回。
for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++)
{
string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber =" + UserClassDict[UserName].ControlNumber[i] + ";";
adapter.SelectCommand = new OleDbCommand(query, conn);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
if (dataset.Tables[0].Rows.Count > 0)
{
dt = dataset.Tables[0];
}
}
我的问题是这个。正如您可以通过for循环告诉该块所在的,它将运行多次,并且我希望它从DB中提取的每一行都被添加到数据表中。因此,当返回数据表时,它具有所有X行数。但是,正如在上面的代码块中一样,添加到数据表的唯一行是最近被拉的行。
答案 0 :(得分:3)
使用DataTable.Merge()
:
DataTable dt = null;
for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++)
{
string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber =" + UserClassDict[UserName].ControlNumber[i] + ";";
adapter.SelectCommand = new OleDbCommand(query, conn);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
if (dataset.Tables[0].Rows.Count > 0)
{
if (dt == null)
dt = dataset.Tables[0].Clone();
dt.Merge(dataset.Tables[0]);
}
}
return dt;
答案 1 :(得分:0)
我所知道的最直接的方法是继续加载DataTable
的同一个实例。考虑一个看起来像这样的类:
private DataTable _dt = new DataTable();
...
private void FillMyDataTable()
{
...
sda.Fill(_dt);
}
或在您的情况下,DataSet
。另一个选项是Merge
,它是DonBoitnott提供的解决方案。
答案 2 :(得分:0)
尝试在此级别应用连接方法 dt = dataset.Tables [0]; ...我会避免在迭代中的对象声明...循环看起来太忙...此外,您可以充分利用i
中的for loop
,而不是像[0],
[i]
那样dt
.....允许{ {1}}存储连锁数据。
答案 3 :(得分:0)
我相信你可以运行一次查询。您不必在循环中创建所有这些对象。
string where = "";
string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber = {0};";
for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++)
{
if(i == UserClassDict[UserName].ControlNumber.Count -1 )
where+=UserClassDict[UserName].ControlNumber[i] ;
else
where += UserClassDict[UserName].ControlNumber[i] + ",";
}
adapter.SelectCommand = new OleDbCommand(string.Format( query,where), conn);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
if (dataset.Tables[0].Rows.Count > 0)
{
if (dt == null)
dt = dataset.Tables[0];
}