我有一个 U2/UniVerse 数据库,需要将一个表中的数据复制到 SQL Server 表中。有问题的表有大约 600,000 行和不到 200 列。我没有创建表,也无法更改它。
对于其他表,我一次循环通过UniDataSet
一条记录并将其添加到 aDataTable
中,然后使用SqlBulkCopy
将记录复制到 SQL Server。这很好用,但是对于大表,我在创建DataTable
.
DataTable dt = new DataTable("myTempTable");
dt.Columns.Add("FirstColumn", typeof(string));
dt.Columns.Add("SecondColumn", typeof(string));
... //adding a bunch more columns here
dt.Columns.Add("LastColumn", typeof(string));
U2Connection con = GetU2Con();
UniSession us1 = con.UniSession;
UniSelectList s1 = us1.CreateUniSelectList(0);
UniFile f1 = us1.CreateUniFile("MyU2TableName")
s1.Select(f1);
UniDataSet uSet = f1.ReadRecords(s1.ReadListAsStringArray());
foreach (UniRecord uItem in uSet)
{
List<String> record = new List<String>(uItem.Record.ToString().Split(new string[] { "þ" }, StringSplitOptions.None));
DataRow row = dt.NewRow();
row[0] = uItem.RecordID;
row[1] = record[0];
row[2] = record[1];
... //add the rest of the record
row[50] = record[49]
dt.Rows.Add(row);
}
con.Close();
这样就可以将记录从 复制UniDataSet
到DataTable
. 然后,我SqlBulkCopy
进入DataTable
一个 SQL 表:
string SQLcon = GetSQLCon();
using (SqlBulkCopy sbc = new SqlBulkCopy(SQLcon))
{
sbc.DestinationTableName = "dbo.MySQLTableName";
sbc.BulkCopyTimeout = 0;
sbc.BatchSize = 1000; //I've tried anywhere from 50 to 50000
try
{
sbc.WriteToServer(dt);
}
catch
{
Console.WriteLine(ex.Message);
}
}
这对于我的具有 50,000 左右行的 U2 表来说效果很好,但是当表有 500,000 行时,它基本上会使调试器(VS Express 2012)崩溃。我正在执行此操作的 PC 是具有 4GB 内存的 Windows 7 x64。VS 进程在崩溃之前看起来最多使用 3.5GB RAM。
我希望有一种方法可以使用 SqlBulkCopy 将 UniDataSet 写入 SQL,但我对 U2 .Net 工具包不太熟悉。
我面临的问题是 UniDataSet 记录是多值的,我需要先将它们分开,然后才能将它们写入 SQL。
谢谢!