这是一个以SQL CE作为数据源的C#WPF应用程序:
我有一个DataTable(显示为DataGrid)和一个SQL CE DataSource。我使用DataAdapter,DataSet和DataTable从SQL CE填充DataTable。然后将我的DataGrid绑定到DataTable。
我可能将行(> 10,000)行添加到我的DataTable中,并且可能在将所有更改一起传播到Sql CE DataSource之前进行了数据编辑。
我当前的方法是DROP TABLE,CREATE TABLE,并通过暴力破解SQLCE重新插入行。 SQL CE没有批量插入,并且我不想使用第3个库或dll。性能很慢...
我正在寻找一种更快的“批量插入”方式,而无需一个接一个地删除,创建和插入行。
我读了一些有关SqlCeResultSet的信息,但找不到任何文档,并且想知道它与我要执行的操作有什么关系。
[编辑]遵循答案并进行检查:http://ruudvanderlinden.com/2010/10/13/bulk-insert-into-sql-ce-in-c/
我尝试使用该功能,但似乎没有用。下面是我的代码。合适的是我的数据库表,我有两列-“ id”和“ FooName”。
Hashtable idHash = new Hashtable();
Hashtable fooNameHash = new Hashtable();
foreach(DataRow row in dt.Rows)
{
idHash.Add("id",row["id"]);
fooNameHash.Add("FooName",row["FooName"]);
}
List<Hashtable> colHashList = new List<Hashtable>();
colHashList.Add(idHash);
colHashList.Add(fooNameHash);
BulkInsertDatabase(colHashList, "FooTable");
没用,但是我在上面的代码中看不到任何问题,所以希望有人可以指出。。
[编辑-2nd] [答案]最终,我得到了可以工作的代码(尽管对性能有所怀疑):
List<Hashtable> colHashList = new List<Hashtable>();
Hashtable[] idHash = new Hashtable[dt.Rows.Count];
Hashtable[] fooNameHash = new Hashtable[dt.Rows.Count];
int i=0;
foreach(DataRow row in dt.Rows)
{
idHash[i] = new Hashtable();
idHash[i].Add("id", row["id"]);
colHashList.Add(idHash[i]);
fooNameHash[i] = new Hashtable();
fooNameHash[i].Add("FooName", row["FooName"]);
colHashList.Add(fooNameHash[i]);
i++;
}
BulkInsertDatabase(colHashList, "FooTable");
允许在SQL CE数据库中批量导入,我在10秒内导入了100000行看example
您可以在我的批量插入库中使用C#源代码:http://sqlcebulkcopy.codeplex.com
它的工作,试试这个。
public bool CopyDataTableToTable(DataTable dataTable, string tableName, bool deleteTable)
{
Boolean returnValue = true;
if (sqlCeConnection.State == ConnectionState.Closed)
sqlCeConnection.Open();
SqlCeTransaction transaction = sqlCeConnection.BeginTransaction();
SqlCeCommand cmd = sqlCeConnection.CreateCommand();
SqlCeResultSet rs = null;
try
{
if (deleteTable)
{
cmd.Transaction = transaction;
cmd.CommandText = "DELETE " + tableName;
cmd.ExecuteNonQuery();
}
cmd.CommandType = System.Data.CommandType.TableDirect;
cmd.CommandText = tableName;
rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable);
for (int i = 0; i < dataTable.Rows.Count; i++)
{
SqlCeUpdatableRecord rec = rs.CreateRecord();
DataRow row = dataTable.Rows[i];
for (int k = 0; k < dataTable.Columns.Count - 1; k++)
{
rec.SetValue(k + 1, row[k]);
}
rs.Insert(rec);
}
transaction.Commit();
}
catch (Exception ex)
{
returnValue = false;
transaction.Rollback();
}
finally
{
rs.Close();
if (sqlCeConnection.State == ConnectionState.Open)
sqlCeConnection.Close();
}
return returnValue;
}
我尝试过您的解决方案,它在此行引发错误rec.SetValue(k + 1,row [k]);输入的字符串格式不正确。请问如何解决?