2009-10-22 31 views
14

Có thể sử dụng SqlBulkcopy với Sql Compact Edition hay không. (* .sdf) tệp?sqlbulkcopy sử dụng sql CE

Tôi biết nó hoạt động với SQL Server 200 Up, nhưng muốn kiểm tra khả năng tương thích của CE.

Nếu không ai biết cách nhanh nhất để tải tệp CSV vào SQL Server CE mà không sử dụng DataSets (ở đây)?

Trả lời

0

Không, tôi không nghĩ rằng SqlBulkCopy được hỗ trợ (xem MSDN). Có lẽ ném dữ liệu vào dưới dạng xml và tách nó ra khỏi máy chủ? SQL/XML là khá tốt trong năm 2005/2008.

Bạn cũng có thể muốn xem bảng-giá trị-tham số, nhưng tôi nghi ngờ rằng CE hỗ trợ các giá trị này.

22

BULKCOPY không được hỗ trợ trong SQL CE. Đây là cách nhanh nhất nếu bạn có một số lượng lớn các hàng trong bảng của bạn; chèn quá chậm!

using (SqlCeConnection cn = new SqlCeConnection(yourConnectionString)) 
{ 
    if (cn.State == ConnectionState.Closed) 
     cn.Open(); 

    using (SqlCeCommand cmd = new SqlCeCommand()) 
    { 
     cmd.Connection = cn; 
     cmd.CommandText = "YourTableName"; 
     cmd.CommandType = CommandType.TableDirect; 

     using (SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable | ResultSetOptions.Scrollable)) 
     { 
      SqlCeUpdatableRecord record = rs.CreateRecord(); 

      using (var sr = new System.IO.StreamReader(yourTextFilePath)) 
      { 
       string line; 
       while ((line = sr.ReadLine()) != null) 
       { 
        int index = 0; 
        string[] values = line.Split('\t'); 

        //write these lines as many times as the number of columns in the table... 
        record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]); 
        record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]); 
        record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]); 

        rs.Insert(record); 
       } 
      } 
     } 
    } 
} 

Benchmark: bảng với 34.370 hàng

  • với chèn: 38 hàng bằng văn bản mỗi giây

  • theo cách này: 260 hàng bằng văn bản mỗi giây

+0

Thú vị, cảm ơn :) – leppie

+0

Phương pháp này không hỗ trợ các loại cột Identity và rowversion –

+2

Wow, đang vật lộn với Chèn và nhận 20-30 hàng một giây, tôi chắc chắn điều này chỉ làm tất cả 35.774 hàng trong chưa đầy 1 thứ hai (tất cả dữ liệu của tôi nằm trong một mảng trong bộ nhớ) nên không có cổ chai nào từ nguồn. – Matt

1

phải là có thể để tăng rất nhiều loại hoạt động này. Để biến hoạt động này hữu ích (tôi có nghĩa là nhanh chóng và khá an toàn), bạn có thể sử dụng CE DataAdapter.

By mẫu, không chăm sóc về các phím, các bước được liệt kê dưới đây có thể giúp u:

  1. Hãy chắc chắn rằng Sorce và mục tiêu bảng có cùng cấu trúc lĩnh vực;
  2. Sao chép một datatable ảo với một datatable từ cơ sở dữ liệu nguồn (lựa chọn của bạn);
  3. Tạo lệnh CE có tên bảng là lệnh văn bản (BảngDirect as commandtype);
  4. Tạo một bộ dữ liệu CE từ lệnh CE;
  5. Tạo trình commandbuilder CE từ dữ liệu CE;
  6. Chuyển lệnh Chèn từ trình tạo lệnh CE tới CE dataadapter;
  7. Copy "n" hàng loạt từ DataTable nguồn của bạn với mục tiêu DataTable (clone), làm một cái gì đó như thế này:

    '... previous codes 
    For Each currentRow In sourceTable.Rows 
        'u can do RaiseEvent Processing(currentRow, totalRows) here with DoEvents 
        If targetTable.Rows.Count < 100 Then 
         targetTable.InportRow(currentRow) 
         targetTable.Rows(targetTable.Rows.Count - 1).SetAdded 
        Else 
         '...Here you wll call the CE DataAdapter's Update method (da.Update(targetTable)) 
         '...and then be sure you clone the targetTable again, erasing all previous rows. 
         '...Do a clone again, don't do just a "clear" in the Rows collection. 
         '...If u have an Autoincrement it will break all Foreign Keys. 
        End If 
        Next 
        '... next codes 
    

Với cách này u có thể cập nhật một số hàng không có nhiều thời gian .

Tôi đã sử dụng một số ứng dụng bằng phương pháp này và tốc độ trung bình khoảng 1500 hàng mỗi giây trong bảng có 5 trường NTEXT (chậm) và 800000 hàng.

Tất nhiên, tất cả phụ thuộc vào cấu trúc bảng của bạn. IMAGE và NTEXT đều là các kiểu dữ liệu chậm.

P.S .: Như tôi đã nói, phương pháp này không quan tâm quá nhiều về khóa, vì vậy hãy cẩn thận.

7

Tôi có thư viện SqlCeBulkCopy tại đây: http://sqlcebulkcopy.codeplex.com - thậm chí hỗ trợ IEnumerable.

+0

Liệu nó có hỗ trợ Visual Studio 2008 không? – soclose

+0

Có - đó là giải pháp VS 2008. – ErikEJ

+0

Để sử dụng điều này, tôi có phải thêm tất cả năm tệp .DLL vào dự án của tôi không? Hay chỉ một vài trong số họ? Chúng có thay thế cho các SqlCe .DLLs "chung chung" hay chúng bổ sung cho chúng? –

Các vấn đề liên quan