Thiết lập kết nối OLEDB cho cả office 32 bit và Office 64 bit trên Excel dùng .Net
Chào anh chị trong diễn đàn
Hiện em đang tập tành viết 1 ứng dụng Addin cho Excel trên VB.net
Em dùng truy vấn SQL để kết nối dữ liệu từ file Excel để đưa vào Table trong .Net
Máy em đang dùng:
– Win 64 bit
– Office 32 bit. (office 2016)
Sau khi buil cài đặt và kiểm tra tính năng này trên các máy thì cụ thể như sau:
Câu truy vấn Excel xls.If fileExtension = ".xls" Then conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Import_FileName & ";" & "Extended Properties='Excel 8.0;HDR=YES;'"Câu truy vấn ".xlsx"
If fileExtension = ".xlsx" Then conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Import_FileName & ";" & "Extended Properties='Excel 12.0 Xml;HDR=YES;'"Kết quả:
+ Trên máy có Office 32 bit, không phân biệt windows (32, 64 bit) câu truy vấn đều hoạt động tốt.
+ Trên máy có Office 64 bit, thì câu truy vấn bị lỗi: "Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine"
Em thử tìm trên các trang mạng thì có hướng xử lý như sau:
1. Cài Microsoft Accesss data Engineer: Em thử cài trên máy 64 bit cả 2 phiên bản đều không ăn thua.
2. Đổi như sau vẫn lỗi:
TừMicrosoft.Jet.OLEDB.4.0thành
Provider=Microsoft.ACE.OLEDB.12.03. Đổi Target CPU trên máy tính trước khi build: Từ Any CPU về x86 thì câu truy vấn hoạt động được trên cả office 32 bit và 64 bit office. (Em test thử 1 ứng dụng độc lập).
Nhưng, khi đổi targetCPU như thế đối với dự án VSTO này chỉ hoạt động trên office 32, còn trên office 64 bit là bị lỗi lúc kích hoạt addin luôn.
Có cách nào:
– Vẫn chọn phương án build theo Target CPU: Any CPU, dùng câu lệnh SQL nào để xài được trên cả 64 bit office và 32 bit office (Chia làm 2 câu lệnh phân theo office của máy hiện tại).Em cảm ơn mọi người rất nhiều.
Bạn tham khảo trang này: www.connectionstrings.com/excel/
Dim engineToDeploy As String = IIF( Val(DirectCast(CreateObject("Excel.Application"), Excel.Application).Version) >= 12, "ACE", "JET" )
Chú thích: theo như ý ở bài #1 thì bạn bị lỗi ở giai đoạn kết nối
Nhưng theo lời thì bạn lại nói mình bị lỗi truy vấn (execute câu lệnh SQL, bắt đầu bằng Select…)
ConnectionString chả liên quan gì đến SQL cả. Nó chỉ là câu văn bản thủ tục để code của bạn xác định phương cách kết nối với CSDL (Excel Workbook). Sau khi kết nối được rồi thì code của bạn mới thực hiện (execute) câu lệnh SQL qua kết nối và lấy về một recordset (hoặc update, insert gì đó).
Nếu không nhầm thì không cần phân biệt xls hay xlsx, chỉ dùng ace12 là đủ rồi. Còn Microsoft Accesss data Engineer thực chất là ace12 đó. Nếu chưa cài office từ 2007 trở lên thì mới cần cài riêng cái đó.
Còn Jet 4.0 ra đời có lẽ cũng trên dưới 20 năm rồi nên không phù hợp với 64bit cũng không có gì là ngạc nhiên cả.:unknw:
www.giaiphapexcel.com/diendan/threads/thi%E1%BA%BFt-l%E1%BA%ADp-k%E1%BA%BFt-n%E1%BB%91i-oledb-cho-c%E1%BA%A3-office-32-bit-v%C3%A0-office-64-bit-tr%C3%AAn-excel-d%C3%B9ng-net.140950/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Trong code trên, bạn dùng cái đuôi để xác định phân loại.
Máy client vẫn có thể dùng Office 1010 (VBA7) mở file đời thượng cổ.
Trong ví dụ bài #3, tôi mách cho cách gọi thẳng Object Excel application để query trực tiếp phiên bản của nó (2003 hay 2007+). Chỉ khi nào máy client lắp nhiều phiên bản thì cách này mới thất bại.
Tuy nhiên cách query trực tiếp ấy vẫn chưa cho biết 64 hay 32 bit. Cách xét phiên bản bit rắc rối hơn nhiều. Bạn nên thử cách trên trước.
Nếu thực sự cần xét phiên bản bit thì dùng 1 trong 3 cách:
1. Ở code bài #3, thay vì đọc huộc tính Version của Excel.Application, bạn thử đọc thuộc tính ProductCode. Nếu cái ProductCode ấy có chứa một từ dạng p000 thì xét: 000 là x86 và 001 là x64
2. Viết 1 hàm trong VBA xét hằng số Win64 (phiên bản 64bit sẽ cho ra True). Ghi hàm này vào một file MeMyVBUtilities.xls nào đó. Code VB.Net gọi hàm này thì sẽ biết loại phiên bản của office. Nếu bạn dùng interop thì có thể tìm cách gọi qua interop mà khong phải lập file Utilities.
3. Viết 1 hàm VB, truy lùng cái registry key HKEY_LOCAL_MACHINE Software…. (bạn tự gú gồ cách này)