0

我正在尝试从数据库中的表创建下拉列表,但出现错误:

不支持关键字:“提供者”

我想生成一个下拉列表,其中将包含我数据库中表城市中的城市,并将返回其中每个城市的索引。

connect.cs班级

namespace RapidTyper.App_Code
{
    public class connect
    {
        const string FILE_NAME = "DataBaseR1.accdb";

        public static string GetConnectionString()
        {
            string location = HttpContext.Current.Server.MapPath("~/App_Data/" + FILE_NAME);
            string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; data source=" + location;
            return ConnectionString;
        }

        public connect()
        {
            // TODO: Add constructor logic here
        }

        public static void writeline()
        {
            throw new NotImplementedException();
        }
    }
}

页面:

<asp:DropDownList   ID="ddlSubject" runat="server" AppendDataBoundItems="true">
    <asp:ListItem Text="<Select Subject>" Value="0" />
</asp:DropDownList>

后面的代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack) 
        LoadSubjects();
}

private void LoadSubjects()
{
    DataTable cities = new DataTable();

    using (SqlConnection con = new SqlConnection(connect.GetConnectionString()))
    {
        try
        {
            SqlDataAdapter adapter = new SqlDataAdapter("SELECT cityNum, cityName FROM cities", con);
            adapter.Fill(cities);

            ddlSubject.DataSource = cities;
            ddlSubject.DataTextField = "cityName";
            ddlSubject.DataValueField = "cityNum";
            ddlSubject.DataBind();
        }
        catch (Exception ex)
        {
            // Handle the error
        }
    }
}
4

1 回答 1

1

你有两个重要的问题。

首先:您正在使用 SQL 提供程序。

SQL 提供程序仅适用于 SQL Server。它不适用于 Oracle,不适用于 MySQL,不适用于 PostgresSQL,当然也不适用于 MS Access。

因此,您在这里有两个选择使用哪个提供程序:

您可以使用 ODBC,也可以使用 OleDB。

我将建议 OleDB,但你必须换掉SqlProviderfor Access。

那么,假设一个进口System.Data.OleDB

那么所有的“基础”数据对象仍然是相同的——但提供者必须改变。所以说:

using (SqlConnection con = new SqlConnection(connect.GetConnectionString()))
{
    try
    {
        SqlDataAdapter adapter = new SqlDataAdapter("SELECT cityNum, cityName FROM cities", con);

变成:

using (OleDbConnection con = new OleDbCommand(connect.GetConnectionString()))
{
    try
    {
        OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT cityNum, cityName FROM cities", con);

好的,如上所述,您可以换出SqlProvider(用于 SQL Server)并使用 OleDB,或者您可以使用 OleDB。您的连接字符串看起来是 OleDB。

接下来:

网站是以 x32 位还是 x64 位运行的?.net 应用程序的位大小必须与外部“非托管”代码的位大小相匹配——在本例中为 Access 数据库引擎“ACE”。

因此,您可以在此处将网站更改为以 x32 运行以进行测试:

在此处输入图像描述

您还必须在此处将您的项目设置为 x32 运行:

在此处输入图像描述

所以 .net 项目必须从“any”或 x64 更改,并且必须是 x32。

然后,您必须设置/确保网站以 x32 启动(根据第一个屏幕截图)。

更重要的是,虽然您可以进行上述两个更改以作为 x32 运行?这些天来,大多数网站在部署时会以 x64 位运行。因此,这在很大程度上表明您需要下载并安装 x64 位 ACE 数据库驱动程序 - 因为 x32 位不能用于以 x64 位运行的站点。

总之:

  • 您正在尝试使用SqlProvider此处 - 仅适用于 SQL Server。

  • 您需要更换提供程序 - 使用 OleDB 或 ODBC - 任何一个都可以工作。

OleDB 提供程序字符串:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test\test44.accdb

ODBC 提供程序字符串

Driver={Microsoft Access Driver (*.mdb, *.accdb)};
dbq=C:\test\test44.accdb;defaultdir=C:\test;driverid=25;
;maxbuffersize=2048;maxscanrows=8;pagetimeout=5;safetransactions=0;threads=3;
 uid=admin;usercommitsync=Yes

您可能会根据上述将 odbc 字符串缩短为仅驱动程序和路径。

您必须处理位大小。在开发和测试期间,您可以将您的项目设置为 x86(任何 CPU 都不会工作!!!!)。但是,如果您设置为 x86,那么您必须将 Web 服务器设置为也以 x86 运行。如果您希望在最终部署中使用 x64?然后我会强制一切回到 x64,并安装 ACE 数据库引擎的 x64 位版本。

于 2020-12-18T01:56:40.810 回答