这是一个使用SQL CE作为DataSource的C#WPF应用程序:
我有一个DataTable(显示为DataGrid)和一个SQL CE DataSource。 我使用DataAdapter,DataSet和DataTable从SQL CE填充我的DataTable。然后将我的DataGrid绑定到DataTable。
我可以在我的DataTable中添加行(> 10,000)行,并且可以在将所有更改一起传播到我的Sql CE DataSource之前编辑数据。
我当前的方法是DROP TABLE,CREATE TABLE,并通过强力对SQLCE重新插入行。 SQL CE没有批量插入,我不想使用第三个库或DLL。表现很慢......
我正在寻找或更快的“批量插入”方式,而无需逐个删除,创建和插入行。
我读了一些关于SqlCeResultSet的内容,但我找不到任何文档,并且想知道它与我正在尝试做的事情有什么关系。
[编辑]
在回答并检查之后:
http://ruudvanderlinden.com/2010/10/13/bulk-insert-into-sql-ce-in-c/
我尝试使用该功能,但似乎没有用。 以下是我的代码。 Footable是我的数据库表,我有两列 - “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");
它没有用,但我在上面的代码中没有看到任何问题,所以希望有人可以指出它..
[编辑 - 第二次] [答案]
最后,我得到了代码(虽然对性能有疑问):
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");
答案 0 :(得分:3)
您应该使用SqlCeResultSet Class
允许在SQL CE数据库中批量导入我在10秒内导入了100000行 看看example
答案 1 :(得分:0)
您可以在我的批量插入库中使用C#源代码:http://sqlcebulkcopy.codeplex.com
答案 2 :(得分:0)
它的工作,试试这个。
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;
}