2012-01-10 76 views
16

Tôi đang cố gắng nhập dữ liệu từ tệp Excel 2007 (.xlsx) vào SQL Server 2008 bằng cách sử dụng lệnh T-SQL OpenRowset() với "Microsoft.ACE. OLEDB.12.0 "Nhà cung cấp OLE DB và tôi nhận được lỗi" Không thể tìm thấy ISAM có thể cài đặt "liên tục. Tất cả phần cứng là 32-bit.Cách giải quyết "Không thể tìm thấy ISAM có thể cài đặt". lỗi cho nhà cung cấp OLE DB "Microsoft.ACE.OLEDB.12.0"

[Revised 1/10/12 để cố gắng tập trung mạnh hơn vào các bất thường]

sau Các câu lệnh T-SQL tạo ra lỗi:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"', 
    'SELECT * FROM [Sheet1$]' 
) 

Nếu tôi lưu các tập tin Excel trong định dạng "Excel 97-2003" (.xls) và sử dụng nhà cung cấp Microsoft.Jet.OLEDB.4.0 cũ hơn để nhập dữ liệu, nó hoạt động tốt. Điều này khiến tôi nghĩ rằng đó không phải là vấn đề an ninh hay môi trường khác.

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES', 
    'SELECT * FROM [Sheet1$]' 
) 

Tuy nhiên, khi tôi cố gắng tập tin * .xls với nhà cung cấp Microsoft.ACE.OLEDB.12.0, mà phải phù hợp với các định dạng * .xls lạc hậu, lại một lần nữa thất bại với lỗi tương tự:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";', 
    'SELECT * FROM [Sheet1$]' 
) 

Ngoài ra, thú vị, khi tôi sử dụng thuật sĩ "Nhập dữ liệu ..." thuật sĩ SSMS, nó hoạt động tốt. Tôi đã lưu đầu ra của thuật sĩ Nhập dữ liệu dưới dạng gói SSIS và xem tệp SSIS để cố gắng tìm ra cách nó hoạt động và nó đã thành công khi sử dụng nhà cung cấp Microsoft.ACE.OLEDB.12.0. Đây là chuỗi kết nối từ các gói SSIS:

<DTS:Property DTS:Name="ConnectionString"> 
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"; 
</DTS:Property> 

tôi cũng đã thực hiện cấu hình SQL Server có liên quan để cho phép OPENROWSET phân phối truy vấn:

sp_configure 'show advanced options', 1 
reconfigure 
GO 
sp_configure 'Ad Hoc Distributed Queries', 1 
reconfigure 
GO 

Nếu tôi cũng đặt sau * sp_MSset_oledb_prop * giá trị (mà tôi tìm thấy trong một bài đăng ở đâu đó) ...

USE [master] 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 
GO 

... sau đó thay đổi lỗi cho "lỗi Unspecified":

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error". 
Msg 7303, Level 16, State 1, Line 1 
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)". 

Tuy nhiên, tôi không chắc liệu đây có phải là lỗi ngược dòng hay hạ lưu hay không. (Có phải bây giờ đã tìm thấy "ISAM có thể cài đặt" nhưng không thành công?)

Tôi đã thử với nhiều tệp Excel trên hai máy/hệ điều hành khác nhau (Windows Server 2003, Windows XP SP3). Cả hai máy đều có 32 bit.

Tôi cũng đã thử cài đặt lại cả phiên bản Office 2007 và Office 2010 của AccessDatabaseEngine.exe (lần lượt là http://www.microsoft.com/download/en/details.aspx?id=23734http://www.microsoft.com/download/en/details.aspx?id=13255), không có kết quả.

Để tóm tắt:

  • "Microsoft.Jet.OLEDB.4.0" nhà cung cấp công trình sử dụng T-SQL, nhưng "Microsoft.ACE.OLEDB.12.0" thì không.
  • "Microsoft.ACE.OLEDB.12.0" hoạt động bằng trình hướng dẫn "Nhập dữ liệu ..." (theo như tôi có thể biết từ tệp công việc SSIS đã lưu).
  • Đặt thuộc tính "AllowInProcess" và "DynamicParameters" thành "1" thay đổi lỗi thành "Lỗi không xác định". (Đó có phải là một bước tiến không ?!)

Mọi suy nghĩ?

+0

Bạn đã tìm kiếm SO cho eeor này? Có rất nhiều câu hỏi hỏi về nó, hầu hết các câu trả lời dường như xoay quanh việc thêm dấu ngoặc kép quanh 'Dữ liệu nguồn = '...' ' –

+0

Có, tôi đã dành vài giờ tìm kiếm SO và các nơi khác, và thử nhiều biến thể của chuỗi kết nối, bao gồm chơi với các dấu ngoặc kép, vì vậy tôi không nghĩ đó là vấn đề. (Điều đó bao gồm việc sao chép chuỗi kết nối SSIS đang hoạt động.) –

+0

Tôi gặp vấn đề tương tự – Pete

Trả lời

0

Tôi nghĩ câu trả lời đang ẩn trong thông tin gói SSIS mà bạn đã đăng. Định dạng tệp mới xlsx, lưu trữ dữ liệu ở định dạng XML thay vì định dạng cũ. Nhìn vào nó một lần nữa. Nó đọc ... Thuộc tính mở rộng = "Excel 12.0 XML; HDR = YES

Đừng bỏ lỡ XML sau các nội dung tiêu chuẩn. (Vì nó đáng giá, tôi cũng đọc rằng bạn cần" Macro 12.0 Excel "để kết nối với một tập tin xslm)

Hãy thử Weird nhưng hy vọng nó hoạt động

+2

Đoạn mã đầu tiên ở trên bao gồm 'Extended Properties = 'Excel 12.0 XML; HDR = YES" 'mà bạn đã đề xuất-- vẫn không hoạt động. –

0

Hãy thử này

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
       'EXCEL 12.0;DataBase=C:\TEMP\test.xlsx;Extended Properties="EXCEL 12.0 Xml;HDR=YES', [Sheet1$]) 
0

tôi đã giải quyết với truy vấn này:...

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=NO;Database=D:\Filename.xlsx;', 
    [SheetName$]) 

Dường như sql không thích "Properties mở rộng" phần ...

2

TRY này nó có thể giúp bạn:

thiết pathstrFileType theo yêu cầu

 string connString = ""; 
// string strFileType = Path.GetExtension(UpfileName.FileName).ToLower(); 
// string path = UpfileName.PostedFile.FileName; 

if (strFileType.Trim() == ".xls") 
    { 

     connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\""; 
    } 
    else if(strFileType.Trim() == ".xlsx") 
    { 
      connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\""; 
    } 
+1

thêm dấu ngoặc kép vào Thuộc tính mở rộng làm việc cho tôi (như thế này "Nhà cung cấp = Microsoft.ACE.OLEDB.12.0; Nguồn dữ liệu =" + tên tệp + "; Thuộc tính mở rộng = \" Excel 12.0; HDR = YES; \ "" ;) – pawciu

1

CUỐI CÙNG, một giải pháp!

Check-out này: Msg 7302, Level 16, State 1, Line 1 Cannot create an instance of OLE DB Provider “Microsoft.ACE.OLEDB.12.0” for linked server “(null)”

Về cơ bản, bạn đi đến

Control Panel > Administrative Tools > Component Services

sau đó mở rộng

Component Services > Computers > My Computer > DCOM Config

tìm

MSDAINITIALIZE

đi đến

Properties > Security > Launch and Activation Permissions

nhấp chuột vào

Customize > Edit...

thêm tên đăng nhập của bạn hay "Mọi người" nếu bạn thích

đánh dấu tất cả các "phép" hộp cho người dùng mới/nhóm

và nhấn OK trên cả hai trang

Bây giờ, hãy xem liệu lệnh OpenRowSet/OpenDataSource của bạn có hoạt động hay không

Nhờ Ramesh Babu Vavilla (vr.babu) from social.technet.microsoft.com cho liên kết

+0

Tất cả các điều khiển trong "Quyền khởi chạy và kích hoạt" đều bị tắt. –

+1

@Irawan Bạn cần đăng nhập vào cửa sổ với tư cách quản trị viên để có quyền truy cập vào các cài đặt này. Yêu cầu quản trị viên miền của bạn truy cập. –

0
Hai am also faced this situation i solved It

Giải Quyết

string ConeectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtFlp.Text 

    + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\""); 

       OleDbConnection oconn = new OleDbConnection(ConeectionString);</b> 
0

này đã làm việc cho tôi:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=NO;Database=C:\temp\file.xlsx;',[sheetname$]) 
Các vấn đề liên quan