19 11 2025

image.png

Provider=Microsoft.ACE.OLEDB.12.0;Data Source="/upload/202511/202511190905457156.xlsx";Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";  出现未指定的错误 (-2147467259)

2022服务器===================

下载安装:

  • Microsoft Access Database Engine 2016 Redistributable

  • 根据服务器位数选择 x86(32位)或 x64(64位)

安装32位程序,启用如下设置:

3. 应用程序池设置(重要)

在IIS管理器中:

  1. 选择应用程序池 → 你的网站池 → 高级设置

  2. 设置以下参数:

启用32位应用程序: True
标识: ApplicationPoolIdentity

权限设置脚本

创建一个fix_permission.bat文件(以管理员身份运行):

@echo off
echo 正在设置Excel文件访问权限...

REM 设置网站上传文件夹权限
icacls "C:\你的网站路径\upload" /grant "IIS_IUSRS:(OI)(CI)F"
icacls "C:\你的网站路径\upload\202511" /grant "IIS_IUSRS:(OI)(CI)F"

REM 设置系统临时文件夹权限
icacls "C:\Windows\Temp" /grant "IIS_IUSRS:(OI)(CI)F"
icacls "C:\Windows\Temp" /grant "IUSR:(OI)(CI)F"

REM 设置用户临时文件夹
icacls "%TEMP%" /grant "IIS_IUSRS:F"

echo 权限设置完成
pause

诊断脚本1

创建test_excel.asp进行完整诊断:

<%@ Language=VBscript %>
<%
Response.ContentType = "text/html"
Response.Charset = "UTF-8"
%>
<!DOCTYPE html>
<html>
<head>
    <title>Excel连接诊断</title>
</head>
<body>
<h2>Excel文件连接诊断报告</h2>

<%
On Error Resume Next

' 1. 检查文件
Dim fso, excelPath
Set fso = Server.CreateObject("Scripting.FileSystemObject")
excelPath = Server.MapPath("/upload/202511/202511190905457156.xlsx")

Response.Write "<h3>1. 文件检查</h3>"
Response.Write "Excel文件路径: " & excelPath & "<br>"

If fso.FileExists(excelPath) Then
    Response.Write "✓ 文件存在<br>"
    Response.Write "文件大小: " & FormatNumber(fso.GetFile(excelPath).Size/1024, 2) & " KB<br>"
    
    ' 检查文件是否被占用
    Dim testFile
    On Error Resume Next
    Set testFile = fso.OpenTextFile(excelPath, 1)
    If Err.Number = 0 Then
        testFile.Close
        Response.Write "✓ 文件未被占用<br>"
    Else
        Response.Write "✗ 文件可能被占用或损坏: " & Err.Description & "<br>"
    End If
    Err.Clear
Else
    Response.Write "✗ 文件不存在<br>"
End If

' 2. 测试不同连接方式
Response.Write "<h3>2. 连接测试</h3>"

Dim conn, connStr, testCases(5), i
testCases(0) = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & excelPath & ";Extended Properties=""Excel 12.0;HDR=YES"";"
testCases(1) = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & excelPath & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"
testCases(2) = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & excelPath & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=2"";"
testCases(3) = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & excelPath & ";Extended Properties=""Excel 8.0;HDR=YES"";" ' 仅适用于.xls

For i = 0 To 3
    Response.Write "<strong>测试 " & (i+1) & ":</strong> " & testCases(i) & "<br>"
    
    Set conn = Server.CreateObject("ADODB.Connection")
    Err.Clear
    conn.Open testCases(i)
    
    If Err.Number = 0 Then
        Response.Write "✓ <span style='color:green'>连接成功</span><br>"
        
        ' 尝试读取数据
        Dim rs
        Set rs = Server.CreateObject("ADODB.Recordset")
        rs.Open "Select * FROM [Sheet1$]", conn
        If Err.Number = 0 Then
            Response.Write "✓ 数据读取成功,记录数: " & rs.RecordCount & "<br>"
            rs.Close
        Else
            Response.Write "⚠ 连接成功但读取失败: " & Err.Description & "<br>"
        End If
        Set rs = Nothing
        
        conn.Close
    Else
        Response.Write "✗ <span style='color:red'>连接失败: " & Err.Description & " (" & Err.Number & ")</span><br>"
    End If
    
    Set conn = Nothing
    Response.Write "<br>"
Next

Set fso = Nothing
%>

<h3>3. 系统信息</h3>
<%
Response.Write "服务器软件: " & Request.ServerVariables("SERVER_SOFTWARE") & "<br>"
Response.Write "脚本超时: " & Server.ScriptTimeout & "秒<br>"
%>

</body>
</html>


诊断脚本2(ok)

创建test_excel.asp进行完整诊断:

<%@ Language=VBscript %>
<%
Response.ContentType = "text/html"
Response.Charset = "UTF-8"
%>
<!DOCTYPE html>
<html>
<head>
    <title>Access数据库连接诊断</title>
</head>
<body>
<h2>Access数据库连接诊断</h2>

<%
'服务器
filePath="/upload/202511/202511190908140727.xlsx"
'filePath="/upload/202511/202511190905457156.xlsx"
'fullPath = Server.MapPath(filePath)


On Error Resume Next
' 1. 检查数据库文件
Dim fso, dbPath
Set fso = Server.CreateObject("Scripting.FileSystemObject")
dbPath = Server.MapPath(filePath) ' 修改为你的路径
'dbPath = "C:\test\202511190905457156.xlsx"

Response.Write "<h3>1. 文件系统检查</h3>"
Response.Write "数据库路径: " & dbPath & "<br>"

If fso.FileExists(dbPath) Then
    Response.Write "✓ 数据库文件存在<br>"
    Response.Write "文件大小: " & FormatNumber(fso.GetFile(dbPath).Size/1024, 0) & " KB<br>"
Else
    Response.Write "✗ 数据库文件不存在<br>"
End If

' 2. 检查文件夹权限
Dim tempPath
tempPath = Server.MapPath("/upload/")
If fso.FolderExists(tempPath) Then
    Response.Write "✓ 数据库文件夹存在<br>"
Else
    Response.Write "✗ 数据库文件夹不存在<br>"
End If

' 3. 测试不同连接字符串
Response.Write "<h3>2. 连接测试</h3>"

Dim conn, connStr, providers(3), i
providers(0) = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath
providers(1) = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath
providers(2) = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath & ";Jet OLEDB:Engine Type=5;"
providers(3) = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"


For i = 0 To 3
    Response.Write "测试连接 " & (i+1) & ": " & providers(i) & "<br>"
    
    Set conn = Server.CreateObject("ADODB.Connection")
    Err.Clear
    conn.Open providers(i)
    
    If Err.Number = 0 Then
        Response.Write "✓ 连接成功<br>"
        conn.Close
    Else
        Response.Write "✗ 连接失败: " & Err.Description & " (" & Err.Number & ")<br>"
    End If
    
    Set conn = Nothing
    Response.Write "<br>"
Next

Set fso = Nothing
%>

</body>
</html>


2012服务器================

直接安装office套件!

延伸阅读