我目前有一个现有的 ASP 经典应用程序与此代码连接得很好:
Set server = Server.CreateObject("ADODB.Recordset")
server.ActiveConnection = "dsn=[name in ODBC Data Sources];"
我现在正在尝试编写一个 ASP.NET Webforms 应用程序来连接到同一数据库。
当我在 .NET 中尝试此操作时:
OleDbConnection connection = new OleDbConnection(@"dsn=[name in ODBC Data Sources];");
我得到:
ConnectionString 中未指定 OLE DB 提供程序。例如,“Provider=SQLOLEDB;”。
并使用此代码:
OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;dsn=[name in ODBC Data Sources];");
我得到:
找不到可安装的 ISAM。
并与:
OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[full path to mdb];Persist Security Info=False;");
我得到:
Microsoft Access 数据库引擎无法打开或写入文件“[mdb 的完整路径]”。它已被其他用户以独占方式打开,或者您需要权限才能查看和写入其数据。
我尝试安装 32 位和 64 位版本的 Microsoft Access Database Engine 2016 以及 2010,这是 asp classic 所需的。我也尝试过针对 x86 和 x64。我还尝试授予用户 NETWORK SERVICE 的数据库文件权限。其他似乎都没有帮助。
不要使用 win32 ADO 对象。
使用 .net 提供商。
您可以使用 oleDB,也可以使用 ODBC。我实际上可以证明 ODBC 是一个更好的选择,因为这样,如果您将数据迁移到 SQL Server,您的代码(在大多数情况下)就可以工作。
但是,标准费用是在使用 Access 时使用 oleDB 提供程序。
下一期?
访问数据引擎不是.net代码(该术语是非托管代码)。因此,您必须强制您的 Web 项目与 Access 数据引擎的版本相匹配。
这意味着如果您安装了 Access x32,那么您必须强制您的 Web 项目以 x32 运行。当然,您可以安装并使用 x64 位版本的 Access 数据引擎,然后以 x64 位运行您的项目。
您的项目不能使用“任何CPU”。
你也没有提到你是否使用的是vs2022。在过去这不是一个问题,但现在它肯定是一个问题。当然,原因是 vs2022 是 VS 的第一个 x64 位版本(是的 - 这些年来,VS 一直是 x32 位产品)。
那么,让我们在 vs2022 中设置连接。
我们假设这里访问 x32 位。
因此,在我们的项目中,我们将任何 cpu 设置为 x32 位:
此设置:
如果您没有看到/没有“x86”(x32 位)设置,请单击上面的配置管理器并创建一个。
接下来,要使其正常工作,我们还必须强制 Web 服务器运行(允许)x32 位,因此此设置:
好的,通过上述设置使用 x32 Access,那么我们现在可以/应该/将会/好主意来构建连接字符串。
所以, 项目->属性->设置
在上面,我输入了 AccessTEST。然后您点击上面的“[...]”,连接向导将为您启动。
如上所述,您可以选择 oleDB 或 ODBC。
让我们使用 oleDB。
因此,选择Access数据库:
默认应该是 .net oleDB 提供程序。
然后:
您可以点击浏览-浏览到访问文件。
请勿跳过测试/检查/查看/确保高级选项卡,因为这可以让您选择 JET 数据引擎或 ACE 数据引擎。
所以请点击高级按钮。就是这个按钮:
如果您使用 accDB 文件,则需要 ACE 数据引擎。对于 mdb 文件,您可以使用 ACE 或 JET。但 JET 只是 x32 位。所以,如果您打算使用 x64 位项目,那么您必须始终选择 ACE。
这就是点击高级后的选择。
现在,它应该默认为 ACE,但不要跳过该检查/查看/设置它/100% 确定!
现在回到主面板。如果您运行的是 vs2022 之前的 vs 版本,则只能使用测试连接。就是这个按钮:
但是,如果您运行的是 vs2022,测试连接将始终失败,因为 vs 现在是 x64 位。 (好吧,如果您使用 + 安装了 ACE 或 Access x64 位,它将起作用。)
但是,当您运行该项目时,连接会正常工作。
所以请记住这个问题。 再次: 除非您使用、选择和采用 x64 位版本的 Access/office/ACE,否则测试连接将无法在 vs2022 中工作。
因此,如果您使用完整的 x64 位,并强制上面的整个项目(和 Web 设置)为 x64 位,则测试连接可以工作。但是,对于此示例,我们假设 x32 位访问。
好的,现在让我们尝试一些测试代码。
让我们放入网格视图,这样说:
不幸的是,现在您无法使用向导构建器(除非您安装了 access x64,或者正在使用 2022 年之前的 vs 版本)。
所以,说出这个标记:
<asp:GridView ID="GridView1"
runat="server" AutoGenerateColumns="False"
DataKeyNames="ID"
CssClass="table" >
<Columns>
<asp:BoundField DataField="Fighter" HeaderText="Fighter" />
<asp:BoundField DataField="Engine" HeaderText="Engine" />
<asp:BoundField DataField="Thrust" HeaderText="Thrust" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:BoundField DataField="FirstFlight" HeaderText="First Flight" DataFormatString="{0:d}"
ItemStyle-Width="100px" />
<asp:TemplateField HeaderText="Image">
<ItemTemplate>
<asp:ImageButton ID="btnImage"
runat="server" Width="256"
ImageUrl = '<%# Eval("ImagePath") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
没什么特别的。
现在使用该连接的代码是什么?
这个:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadGrid();
}
void LoadGrid()
{
using (OleDbConnection conn =
new OleDbConnection(Properties.Settings.Default.AccessTest))
{
using (OleDbCommand cmdSQL =
new OleDbCommand("SELECT * FROM Fighters", conn))
{
conn.Open();
DataTable rstData = new DataTable();
rstData.Load(cmdSQL.ExecuteReader());
GridView1.DataSource = rstData;
GridView1.DataBind();
}
}
}
现在,当我们按 f5 运行时,我们会看到这一点:
解决方案最终是为用户 IIS_IUSRS 添加读写修改权限。这是黑暗中的一枪。知道原因的人请添加更好的答案。