2010-06-21 43 views
6

Tôi đang sử dụng trình quản lý dữ liệu OleDB để lấy dữ liệu từ các tệp excel của mình (nhưng vấn đề này cũng xảy ra trong DataTable.Fill). Vấn đề là tôi có một cột sẽ trả về chuỗi. Tất cả đều ổn và làm việc nhưng gần đây, một vấn đề xuất hiện, bởi vì các ô của cột có các định dạng khác nhau. Một số là số và các văn bản khác. Khi tôi kiểm tra bằng cách sử dụng dataReader.GetSchema() nó cho thấy rằng các cột trong câu hỏi được suy ra như kiểu System.String. Vấn đề với điều này là tất cả các ô không phải là văn bản được đặt ngay lập tức thành null.Vấn đề định dạng ô di động Excel

Có cách nào đề xuất cho người đọc rằng cột đó chỉ phân tích cú pháp các cột dưới dạng System.Object thay vì suy ra nó như System.String và bán tất cả các ô không phải chuỗi không?

Chuỗi kết nối Tôi đang sử dụng là:

chuỗi connString = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Nguồn dữ liệu =" + tệpPath + ";" + "Thuộc tính mở rộng = Excel 8.0;";

và mã là:

using (OleDbConnection connection = new OleDbConnection(connString)) 
{ 
    connection.Open(); 
    foreach (string worksheetName in worksheetNames) 
    { 
     using (OleDbCommand command = 
      new OleDbCommand("SELECT * FROM [" + worksheetName + "]", connection)) 
     { 
      TEntity entity; 
      using (OleDbDataReader dataReader = command.ExecuteReader()) 
      { 
       while (dataReader.Read()) 
       { 
        entity = GetDataFromDataTable(dataReader); 

        if (entity != null) 
        { 
         entityList.Add(entity); 
        } 
       } 
      } 
     } 
    } 
    connection.Close(); 
} 

Trả lời

7

Bạn cần thêm IMEX hoặc MAXSCANROWS vào chuỗi kết nối.

MAXSCANROWS - Số hàng cần quét để xác định loại dữ liệu của mỗi cột. Kiểu dữ liệu được xác định dựa trên số lượng dữ liệu tối đa được tìm thấy. Nếu dữ liệu gặp phải không khớp với kiểu dữ liệu được đoán cho cột, kiểu dữ liệu sẽ được trả về dưới dạng giá trị NULL.

Đối với trình điều khiển Microsoft Excel, bạn có thể nhập một số từ 1 đến 16 cho các hàng cần quét. Giá trị mặc định là 8; nếu nó được đặt thành 0, tất cả các hàng sẽ được quét. (Một số ngoài giới hạn sẽ trả về lỗi.)

Hơn nữa, hãy kiểm tra [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel] vị trí đăng ký REG_DWORD "TypeGuessRows". Đó là chìa khóa để không cho phép Excel chỉ sử dụng 8 hàng đầu tiên để đoán loại dữ liệu cột. Đặt giá trị này thành 0 để quét tất cả các hàng. Điều này có thể làm tổn thương hiệu suất.

+0

Cảm ơn bạn. IMEX đã hoạt động. – Jonn

+0

FYI: MaxScanRows = 0 bị bỏ qua khi sử dụng nhà cung cấp Microsoft.Jet.OLEDB.4.0; nó vẫn chỉ quét 8 hàng đầu tiên. Nhà cung cấp Microsoft.ACE.OLEDB.12.0 dường như không gặp phải vấn đề tương tự. Xem phần trên _Rows to Scan_ trong [KB] (http://support.microsoft.com/default.aspx?scid=kb;en-us;257819) – codechurn

2

Hai điều mà tôi suy nghĩ:

  1. kiểu gì TEntity 'là. Nó có bị hạn chế đối với chuỗi hoặc loại khác không?

  2. Loại danh sách nào là entityList. Là nó chung, hoặc là nó một danh sách (của TEntity), hoặc một số loại khác?

+0

Độ bền là loại chung – Jonn

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