2009-01-28 43 views
10

Tôi đang bắt đầu một dự án với asp.net visual studio 2008/SQL 2000 (2005 trong tương lai) bằng cách sử dụng C#.nhập tệp csv/excel vào cơ sở dữ liệu sql asp.net

Phần khó khăn đối với tôi là lược đồ DB hiện có thường xuyên thay đổi và tất cả các cột tệp nhập phải khớp với lược đồ db hiện tại vì chúng có thể không khớp với một tên cột. (Có một bảng tra cứu cung cấp lược đồ bảng có các tên cột mà tôi sẽ sử dụng)

Tôi đang khám phá các cách khác nhau để tiếp cận vấn đề này và cần một số lời khuyên của chuyên gia. Có bất kỳ điều khiển hoặc khung công tác hiện có nào mà tôi có thể tận dụng để thực hiện bất kỳ điều này không?

Cho đến nay tôi khám phá FileUpload NET kiểm soát, cũng như một số các điều khiển bên upload thứ 3 để thực hiện việc tải lên như SlickUpload nhưng các tập tin được tải lên nên < 500mb

phần kế tiếp được đọc của csv của tôi/excel và phân tích cú pháp nó để hiển thị cho người dùng để họ có thể kết hợp nó với lược đồ db của chúng tôi. Tôi thấy CSVReader và những người khác nhưng cho excel của nó khó khăn hơn vì tôi sẽ cần phải hỗ trợ các phiên bản khác nhau.

Về cơ bản Người dùng thực hiện lần nhập này sẽ chèn và/hoặc cập nhật một số bảng từ tệp nhập này. Có các yêu cầu nâng cao khác như kết hợp bản ghi nhưng và xem trước các bản ghi nhập, nhưng tôi muốn hiểu rõ cách thực hiện điều này trước tiên.

Cập nhật: Tôi đã sử dụng csvReader cùng với LumenWorks.Framework để tải lên tệp csv.

Trả lời

1

Tôi đang sử dụng csvReader từ LumenWorks.Phép làm việc để tải lên và nhập tệp csv vào bảng sql và DataTable trong bộ nhớ mà tôi tạo dựa trên các cột được nhập.

Tôi cũng có người dùng ánh xạ các trường trong ui và tiếp tục xác thực và chuẩn bị dữ liệu để nhập bằng cách gắn nhãn mỗi bản ghi là chèn/cập nhật/lỗi. Sau đó tôi tạo/điền dữ liệu được đánh máy mạnh mẽ cho mỗi bảng sẽ bị ảnh hưởng và xây dựng các truy vấn chèn/cập nhật cho phương thức Enterprise Library UpdateDataset().

Sau đó, tôi gửi giao dịch để chèn/cập nhật cơ sở dữ liệu. -

Ánh xạ là lưới có 4 cột. (nhập tên trường, bảng đích, tên trường đích, bỏ qua, trạng thái kết hợp), với bảng đích và tên trường đang được chọn làm mới dựa trên bảng đã chọn. Tôi tự động điền các lựa chọn. Ban đầu chọn combo được điền với 1 giá trị nếu kết hợp được tìm thấy, hoặc vui lòng chọn nếu nó không phải là. bỏ qua cho phép người dùng bỏ qua trường. trạng thái đối sánh là trường được tự động ánh xạ

5

Bạn có thể dễ dàng tạo IDataReader qua tệp Excel hoặc CSV (xem http://support.microsoft.com/kb/316934).

Bạn có đang sử dụng SQL Server làm công cụ cơ sở dữ liệu của mình không? Nếu có, bạn có thể sử dụng lớp SqlBulkCopy (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx) để lấy IDataReader hiệu quả, cột bản đồ khi thích hợp và lưu trữ kết quả trong cơ sở dữ liệu của bạn.

+0

có, tôi đang sử dụng máy chủ sql 2000 nhưng cũng cần hỗ trợ máy chủ sql 2005. Tôi không quen thuộc với SqlBulkCopy và sẽ xem xét điều này. Tôi tưởng tượng tôi sẽ cần phải sử dụng cái gì khác để có thể cập nhật – kiev

+0

Ah phải. Vì vậy, bạn cần phải làm cả hai chèn và cập nhật? SqlBulkCopy là công cụ tuyệt vời để chèn rất nhiều dữ liệu vào cơ sở dữ liệu của bạn, nhưng không xử lý các cập nhật trực tiếp. Bạn có thể giải quyết vấn đề này với bảng dàn dựng và một số SQL bổ sung để di chuyển dữ liệu vào bảng mà bạn thực sự muốn sửa đổi. –

3

Tôi nghi ngờ có thể tồn tại một số công cụ mạnh mẽ và linh hoạt để giúp bạn với ứng dụng có khả năng rất phức tạp này hy vọng ai đó sẽ chỉ cho bạn.

Trong thời gian chờ đợi, đây là chức năng tôi thấy hữu ích trong việc chuyển đổi tệp excel thành DataTable. Phiên bản này chỉ tìm kiếm trang tính đầu tiên. Nó có thể phục vụ như là một điểm khởi đầu. Để một cái gì đó tương tự với các tập tin csv chỉ nên yêu cầu sửa đổi chuỗi kết nối.

public static DataTable GetDataTableFromExcel(string SourceFilePath) 
{ 
    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
           "Data Source=" + SourceFilePath + ";" + 
           "Extended Properties=Excel 8.0;"; 

    using (OleDbConnection cn = new OleDbConnection(ConnectionString)) 
    { 
     cn.Open(); 

     DataTable dbSchema = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     if (dbSchema == null || dbSchema.Rows.Count < 1) 
     { 
      throw new Exception("Error: Could not determine the name of the first worksheet."); 
     } 

     string WorkSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString(); 

     OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + WorkSheetName + "]", cn); 
     DataTable dt = new DataTable(WorkSheetName); 

     da.Fill(dt); 

     return dt; 
    } 
} 
+0

Thật không may điều này sẽ không hoạt động trên máy x64 vì máy bay chỉ tồn tại cho nền tảng x86. – Alex

8

Kiểm tra thư viện FileHelpers tuyệt vời - có một article on CodeProject về nó, và nó được lưu trữ here.

C# thuần túy và nó có thể nhập bất kỳ tệp phẳng, CSV và giao dịch nào với Excel. Quá trình nhập hoàn toàn có thể định cấu hình - bạn có thể xác định những thứ như dấu phân tách, hàng và/hoặc cột để bỏ qua, v.v. - nhiều tùy chọn.

Tôi đã sử dụng thành công nó trong các dự án khác nhau và nó chỉ hoạt động hoàn hảo - rất khuyến khích.

+0

Cảm ơn bạn đã liên kết Marc, Nhìn vào FileHelpers Tôi thấy rằng tôi cần phải định nghĩa một lớp ánh xạ tới bản ghi trong tệp nguồn/detination mà tôi cần phải năng động. Vì tệp csv hoặc excel của tôi sẽ không phải là định dạng giống nhau và sẽ cần phải khớp với các cột đích của tôi. – kiev

+0

OK, tôi thấy vấn đề của bạn - không có ý tưởng làm thế nào bạn có thể có thể giải quyết dễ dàng, mặc dù :-(Một cái gì đó hoàn toàn năng động .... không chính xác dễ dàng công cụ để làm! Chúc may mắn với tìm kiếm của bạn. –

1

FileHelpers là bạn của bạn. Tôi đã sử dụng nó một cách hạnh phúc cho một số dự án và nó đã giúp tôi tiết kiệm rất nhiều đau khổ và lao động

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