为什么使用c#在MS access中插入记录需要花费大量的时间?



我的数据由33133行和大约45列组成。我从datagridview插入数据到MS Access数据库(accdb)。我正在使用本地数据库文件。

我尝试为13列插入33133行,并且实际上需要15-20分钟才能进入数据库。我用的是高端电脑。我无法想象45列要花多少时间。我四处搜索并阅读了关于使用DAO进行大副本的各种答案,但它不符合我的目的,说实话,解决方案超出了我的理解。

为什么要花这么长时间?我做错什么了吗?如果有,请指导我。

这里是我的简单代码(我使用查询表适配器):

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
this.architecture_TowerBTableAdapter.InsertQueryTest(Convert.ToString(dataGridView1.Rows[i].Cells[0].Value),
Convert.ToString(dataGridView1.Rows[i].Cells[1].Value),
Convert.ToString(dataGridView1.Rows[i].Cells[2].Value),
Convert.ToString(dataGridView1.Rows[i].Cells[3].Value),
Convert.ToString(dataGridView1.Rows[i].Cells[4].Value),
Convert.ToString(dataGridView1.Rows[i].Cells[5].Value),
Convert.ToString(dataGridView1.Rows[i].Cells[6].Value),
Convert.ToString(dataGridView1.Rows[i].Cells[7].Value),
Convert.ToString(dataGridView1.Rows[i].Cells[8].Value),
Convert.ToString(dataGridView1.Rows[i].Cells[9].Value),
Convert.ToInt32(dataGridView1.Rows[i].Cells[10].Value),
Convert.ToInt32(dataGridView1.Rows[i].Cells[11].Value),
Convert.ToInt32(dataGridView1.Rows[i].Cells[12].Value));
}  

编辑在评论中,John建议尝试Datatable绑定。datagridview填充了数据,但是数据库仍然是空的。这是我的代码。

string PathConn = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = '" + tb_TableBPath.Text + "' ; Extended Properties = "Excel 8.0; HDR = YES;";";
OleDbConnection conn = new OleDbConnection(PathConn);
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter("Select * from [" + tb_SheetB.Text + "$]", conn);
DataTable dt = new DataTable();
myDataAdapter.Fill(dt);
dataGridView1.DataSource = dt;
this.architectureTowerBBindingSource.DataSource = dt;
this.architectureTowerBBindingSource.EndEdit();
this.architecture_TowerBTableAdapter.Update(this.pCLiveDB_AykonDataSet.Architecture_TowerB);

问题通常是连接没有保持打开状态。您也没有提及是否涉及某种类型的网络(或者是本地文件??)。

但是,批处理添加到数据表的行

你可以使用这样的代码方法:

(每次发送1000行)

// we have a table called rstFrom - 20,000 rows for this test
const int BatchSize = 1000;
int RowCount = 0;

strSQL = "SELECT * FROM tblBigTo WHERE ID = 0";
cmdSQL.CommandText = strSQL;
DataTable rstToTable = new DataTable();
rstToTable.Load(cmdSQL.ExecuteReader());  // load table structure (no reocrds
OleDbDataAdapter da = new OleDbDataAdapter(cmdSQL);
OleDbCommandBuilder daU = new OleDbCommandBuilder(da);
// proces all from rows
Debug.Print("start trans");
DateTime T = DateTime.Now;
foreach (DataRow FromRow in rstFrom.Rows)
{
DataRow MyNewRow = rstToTable.NewRow();
MyNewRow["FirstName"] = FromRow["FirstName"];
MyNewRow["LastName"] = FromRow["LastName"];
MyNewRow["City"] = FromRow["City"];
// etc. more columns
rstToTable.Rows.Add(MyNewRow);
RowCount += 1;

if (RowCount >= BatchSize)
{
da.Update(rstToTable);
rstToTable.Rows.Clear();
RowCount = 0;
Debug.Write("out " + BatchSize.ToString() +  Convert.ToString((char)10));
}
}
// write out any rows left in buffer
if (rstToTable.Rows.Count > 0)
{
da.Update(rstToTable);
rstToTable.Rows.Clear();
RowCount = 0;
}
Debug.Print((DateTime.Now - T).Seconds.ToString());
因此,我们在上面所做的是创建一个数据表。我们从目标中拉出零行(以获得表模式)。

然后从row"中循环每个"。在我的示例中,我的from行来自源表,但在您的示例中,这将是网格。

如果不涉及网络,运行时间不应该超过1分钟。

最新更新