![](/img/trans.png)
[英]What is the most efficient way of using service bus together with SQL Server within Azure functions?
[英]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();
這樣就可以將記錄從UniDataSet
到DataTable
。 然后,我將DataTable
表SqlBulkCopy
到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.