Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将UniDataSet复制到SQL Server的最有效方法是什么?_C#_Sql Server_U2_U2netdk_Rocket U2 - Fatal编程技术网

C# 将UniDataSet复制到SQL Server的最有效方法是什么?

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

我有一个U2/UniVerse数据库,需要将一个表中的数据复制到SQL Server表中。该表大约有600000行,不到200列。我没有创建表,无法更改它

对于其他表,我一次循环通过
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];