SQL Server 2008 链接服务器"(null)"的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 返回了消息 "未指定的错误"。

在SQL Server 2008中尝试使用`opendatasource`执行插入操作时,遇到链接服务器"(null)"的OLE DB提供者"Microsoft.Jet.OLEDB.4.0"返回"未指定的错误"。可能原因包括SQL启动账号对TMP和TEMP目录,以及Access文件所在目录缺乏权限。解决方案包括禁用"Allow Inprocess"选项,重启服务器,以及创建新Access文件进行测试。这样可以防止Access错误影响SQL Server执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

insert into opendatasource('Microsoft.Jet.OLEDB.4.0','Data Source=c:/Customers.mdb;Jet OLEDB:Database Password=123456;User ID=Admin;Password=;')...Emploee
(PNo, PName) select 人員代號, 姓名,部門代號

 

在SQL2008執行出錯

無法初始化連結伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.Jet.OLEDB.4.0" 的資料來源物件。
連結伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.Jet.OLEDB.4.0" 傳回訊息 "無法指出的錯誤"。

 

簡體:

无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 的数据源对象

链接服务器"(null)"的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 返回了消息 "未指定的错误"。
大概歸類為以下兩種原因:

1.    SQL 啟動帳號對TMPTEMP資料夾沒有權限.

2.    SQL啟動帳號對Access檔案所在資料夾沒有權限.

但我們已經試過以上的設定.

我想可以再試一下以下的步驟:

1.    SQL Server, 展開[Server Objects]/[Linked Server], 找到Microsoft.Jet.OLEDB.4.0 driver, 在上面按右鍵, 選擇Property.

2.    不要勾選[Allow Inprocess], 測試是否能成功.

3.    安排時間重新開機, 再測試是否能成功.

4.    建另一個新的Access檔案, 看看是不是可以成功. 您可以只用

Select * from opendatasource(…) 來測試就可以.

 

 

 

 

這個控制項如果啟用, 就會把Accessprocess包在SQL process裡一起跑. 不啟用就是讓他分開跑.這樣access端有錯誤就不會丟回SQL Server. 我想您access端雖然有問題但是不影響執行, 因此只要讓它不丟回SQL Server就好了.

關於兩者效能的差別, 官方的部落格有提到如果不選allow in process可能效能會差一些.

這個選項主要是給一些third partyprovider, 例如 Oracle, 在做linked server的時候不能跟SQL Server分開跑, 因此必須設定這個選項.  在正常情況下, 勾或不勾都是可以執行的.

參考以下資料:

 

Msg 7399 – OLE DB provider “MSDASQL” - The provider reported an unexpected catastrophic failure

http://blogs.msdn.com/john_daskalakis/archive/2009/11/13/9921916.aspx

 

如何在 SQL Server 中設定並疑難排解 Oracle 資料庫的連結伺服器

http://support.microsoft.com/kb/280106

 

Linked Server Properties (Provider Options Page)

http://msdn.microsoft.com/en-us/library/ms188095.aspx

 

之前的問題, 由於windows 2008上自己有Windows Dac, 因此可能因為您在安裝舊版的mdac,或是因為其他原因 driver有問題. 但是因為Windows Dac不能單獨下載, 所以無法還原. 目前的常用的解法就是rebuild 電腦, 或是下載之前提供的Office 2007 System Driver, 然後修改connection string來使用新的provider.

http://www.microsoft.com/downloads/details.aspx?familyid=7554f536-8c28-4598-9b72-ef94e038c891&displaylang=en

 

 

另外SQL 2008建議使用Native Client 10.0來查詢.

您可以在以下連結下載2008 Native Client:

http://go.microsoft.com/fwlink/?LinkId=123717&clcid=0x409

 

完整下載頁面請參考以下連結:

Microsoft SQL Server 2008 Feature Pack, August 2008

http://www.microsoft.com/downloads/details.aspx?FamilyId=C6C3E9EF-BA29-4A43-8D69-A2BED18FE73C&displaylang=en

  

2008 Native client只支援 windows 2003以上的版本, 若您的電腦為Windows 2003以下, 麻煩您使用sql 2005native client. 下載位置:

http://download.microsoft.com/download/4/4/D/44DBDE61-B385-4FC2-A67D-48053B8F9FAD/sqlncli.msi

 

完整下載網址:

Feature Pack for Microsoft SQL Server 2005 - November 2005

http://www.microsoft.com/downloads/details.aspx?FamilyID=d09c1d60-a13c-4479-9b91-9e8b9d835cdc&displaylang=en 

### 在 C# WinForms 中使用 OLEDB 导入 Excel 文件的方法 在 C# WinForms 应用程序中,可以使用 OLEDB 提供程序来导入 Excel 文件。以下详细介绍了实现此功能的完整方法。 #### 创建连接字符串 首先需要根据 Excel 文件的版本创建适当的连接字符串。对于 `.xlsx` 文件(Excel 2007 及更高版本),使用 `Microsoft.ACE.OLEDB.12.0` 提供程序;对于 `.xls` 文件(Excel 2003 及更早版本),使用 `Microsoft.Jet.OLEDB.4.0` 提供程序[^3]。 - **对于 .xlsx 文件**: ```csharp string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; ``` - **对于 .xls 文件**: ```csharp string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'"; ``` #### 示例代码:读取 Excel 数据到 DataTable 以下是完整的代码示例,展示如何将 Excel 文件中的数据加载到 `DataTable` 中,并绑定到 `DataGridView` 控件。 ```csharp using System; using System.Data; using System.Data.OleDb; using System.Windows.Forms; public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void btnImport_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Excel Files (*.xls, *.xlsx)|*.xls;*.xlsx"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string filePath = openFileDialog.FileName; try { DataTable dataTable = ImportExcel(filePath); dataGridView1.DataSource = dataTable; // 将数据绑定到 DataGridView } catch (Exception ex) { MessageBox.Show("发生错误:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private DataTable ImportExcel(string filePath) { string connectionString; if (Path.GetExtension(filePath) == ".xlsx") { connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; // 使用 ACE.OLEDB 提供程序[^3] } else { connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'"; // 使用 Jet.OLEDB 提供程序[^3] } using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); // 获取工作表名称[^2] string sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString(); // 默认选择第一个工作表 string query = "SELECT * FROM [" + sheetName + "]"; using (OleDbDataAdapter adapter = new OleDbDataAdapter(query, connection)) { DataTable dataTable = new DataTable(); adapter.Fill(dataTable); return dataTable; } } } } ``` #### 代码说明 1. **连接字符串设置** 根据文件扩展名选择合适的提供程序和连接字符串。`HDR=YES` 表示第一行是列标题,`IMEX=1` 表示强制以文本模式读取数据[^3]。 2. **获取工作表名称** 使用 `connection.GetOleDbSchemaTable` 方法获取 Excel 文件中的所有工作表名称。默认情况下,代码会选择第一个工作表进行读取[^2]。 3. **执行查询并填充 DataTable** 构造 SQL 查询语句,从指定的工作表中读取数据,并使用 `OleDbDataAdapter` 将数据填充到 `DataTable` 中[^2]。 4. **绑定到 DataGridView** 将加载的 `DataTable` 绑定到 `DataGridView` 控件,以便在界面上显示数据。 #### 注意事项 - 如果 Excel 文件包含多个工作表,可以通过循环遍历 `schemaTable` 来处理每个工作表的数据。 - 处理大数据量时,建议优化内存使用,避免一次性加载过多数据[^2]。 - 如果遇到权限问题或缺少提供程序,请确保安装了相应的 Microsoft Access Database Engine。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值