C# 将UniDataSet复制到SQL Server的最有效方法是什么?
我有一个U2/UniVerse数据库,需要将一个表中的数据复制到SQL Server表中。该表大约有600000行,不到200列。我没有创建表,无法更改它 对于其他表,我一次循环通过C# 将UniDataSet复制到SQL Server的最有效方法是什么?,c#,sql-server,u2,u2netdk,rocket-u2,C#,Sql Server,U2,U2netdk,Rocket U2,我有一个U2/UniVerse数据库,需要将一个表中的数据复制到SQL Server表中。该表大约有600000行,不到200列。我没有创建表,无法更改它 对于其他表,我一次循环通过UniDataSet一条记录并将其添加到DataTable,然后使用SqlBulkCopy将记录复制到SQL Server。这很好,但是对于大表,我在创建DataTable时似乎内存不足 DataTable dt = new DataTable("myTempTable"); dt.Columns.Add("Firs
UniDataSet
一条记录并将其添加到DataTable
,然后使用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();
这对于包含50000行左右的U2表来说效果很好,但当该表包含500000行时,它基本上会使调试器崩溃(VS Express 2012)。我使用的电脑是Windows7x64,内存为4GB。VS进程看起来在崩溃之前使用了高达3.5GB的RAM
我希望有一种方法可以使用SqlBulkCopy将UniDataSet直接写入SQL,但我对U2.Net工具包不太熟悉
我面临的问题是UniDataSet记录是多值的,在将它们写入SQL之前,我需要将它们分开
谢谢 DataTable在插入数据库之前,它在内存中变得太大。 为什么不拆分批量插入操作?例如,读取前50.000个结果和对Sql server数据库的插入,清除DataTable内存,然后重新开始下一个50.000行
if (dt.Rows.Count > 50000)
{
//do SqlbulkCopy
dt.Rows.Clear();
}
在用于.NET v2.1.0的U2工具包中,我们实现了本机访问。现在您可以直接从UniData/UniVerse文件创建DataSet/DataTable。您也可以指定WHERE和SORT子句。您将看到性能的提高,因为它不会让太多的服务器去获取ID。例如,如果您有1000个记录ID,它将使服务器跳闸1000次。然而,如果您使用本机访问,它将使一个服务器跳闸 请下载U2 Toolkit for.NET v2.2.0热修复程序1并尝试以下代码。有关更多信息,请联系u2askus@rocketsoftware.com.
U2Connection con = GetU2Con();
U2Command cmd = lConn.CreateCommand();
cmd.CommandText = string.Format("Action=Select;File=MyU2TableName;Attributes=MyID,FirstColumn,SecondColumn,LastColumn;Where=MyID>0;Sort=MyID");
U2DataAdapter da = new U2DataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
我现在正在尝试类似的方法,从UniFile中删除一半记录,运行其余代码,然后用另一半再次执行。谢谢你的建议。。我也会这样尝试。我接受了这一点,因为这是我解决方案的基础(也是我得到的唯一答案……)。我将我的
SqlBulkCopy
移动到ForEach
循环中,并用if(dt.Rows.Count==300000 | | uSet.AfterLast==true)
作为前缀。这会触发SqlBulkCopy两次,一次大约在UniDataSet的中间,另一次在末尾。谢谢拉詹,这太棒了!我要试一试。如何修改Select语句以包含给定U2表中的所有属性?不建议这样做。但是如果您的字典是干净的,您可以尝试以下语法。cmd.CommandText=string.Format(“Action=Select;File=MyU2TableName”);我们正在字典中查找除“@ID”以外的ID。例如,序号/位置0可以有@ID和MYID。请参阅此处的更多示例代码:C:\Program Files(x86)\Rocket Software\U2 Toolkit for.NET\U2 Database Provider\samples\C\UniData\NativeAccess。在这方面,RajanI在点击da.Fill(ds)
时收到错误“对象引用未设置为对象实例”。查看示例代码时,我看到连接字符串使用了RpcServiceType=udcs
,但我的代码使用了uvcs。使用udcs时,我无法连接到服务器。是的,“uvcs”代表宇宙。请你做一下好吗?1.联系Rocket U2支持人员并创建问题2.发送日志文件(u2askus@rocketsoftware.com)(收件人:Rajan Kumar)3.如何创建日志文件:
U2Connection con = GetU2Con();
U2Command cmd = lConn.CreateCommand();
cmd.CommandText = string.Format("Action=Select;File=MyU2TableName;Attributes=MyID,FirstColumn,SecondColumn,LastColumn;Where=MyID>0;Sort=MyID");
U2DataAdapter da = new U2DataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];