簡體   English   中英

將UniDataSet復制到SQL Server的最有效方法是什么?

[英]What is the most efficient way to copy UniDataSet to SQL Server?

我有一個U2 / UniVerse數據庫,需要將一個表中的數據復制到SQL Server表中。 該表大約有600,000行,不足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();

這樣就可以將記錄從UniDataSetDataTable 然后,我將DataTableSqlBulkCopy到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向SQL編寫UniDataSet,但是我對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 File創建DataSet / DataTable。 您也可以指定WHERE和SORT子句。 您將看到性能提高,因為它不會花費太多的Server Trip來獲取ID。 例如,如果您有1000個記錄ID,它將產生1000次Server Trip。 而如果您使用本機訪問,它將進行一次服務器故障。

請下載適用於.NET v2.2.0修補程序1的U2工具包,然后嘗試以下代碼。 有關更多信息,請聯系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]; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM