【问题标题】:How to solve proivder error in SQL Server database connection string (ASP.NET)如何解决 SQL Server 数据库连接字符串 (ASP.NET) 中的提供程序错误
【发布时间】:2021-03-28 16:19:07
【问题描述】:

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

不支持关键字:'provider'

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

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();
        }
    }
}

aspx 页面:

<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
        }
    }
}

【问题讨论】:

    标签: sql asp.net database ms-access dropdownlistview


    【解决方案1】:

    这里有两个重要问题。

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

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

    因此,您有两种选择:

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

    我将推荐 OleDB,但您必须将 SqlProvider 换成 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 位版本。

    【讨论】:

    • 嗨,我试着写: using (OleDbConnection con = new OleDbCommand(connect.GetConnectionString())) { try { OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT cityNum, cityName FROM cities", con );" 正如你所说,但现在我得到了错误:不能将类型'system.Data.oleDb.oldeDbcommand'隐式转换为system.Data.oleDb.oldDbconnection'
    • 我已将其更改为:' using (OleDbConnection con = new OleDbConnection(connect.GetConnectionString())) ' 现在它正在工作。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多