You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Web Form绑定Oracle数据库DropdownList遇连接字符串错误

解决ASP.NET Web Form绑定DropdownList时的Oracle连接字符串错误

你的问题核心是混用了Entity Framework的实体连接字符串和原生Oracle连接字符串OracleConnection无法识别EF连接里的metadata属性,所以才抛出了ArgumentException。下面给你一步步的解决方案:

1. 配置原生Oracle连接字符串

在你的web.config(或app.config)的connectionStrings节点里,新增一个专门给原生OracleConnection用的连接字符串,和现有的EF连接区分开:

<connectionStrings>
    <!-- 保留原有的EF实体连接字符串,供EF数据库优先模式使用 -->
    <add name="OraDbContext" 
         connectionString="metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;DATA SOURCE=localhost:1521/xe;DBA PRIVILEGE=;PASSWORD=1234;USER ID=LOUG&quot;" 
         providerName="System.Data.EntityClient" />
    
    <!-- 新增原生Oracle连接字符串,供OracleConnection使用 -->
    <add name="OracleNativeConn" 
         connectionString="DATA SOURCE=localhost:1521/xe;PASSWORD=1234;USER ID=LOUG" 
         providerName="Oracle.ManagedDataAccess.Client" />
</connectionStrings>

这个新连接字符串是从原有EF连接的provider connection string部分提取而来,是Oracle原生驱动能直接识别的格式。

2. 修改Page_Load绑定代码

更新后台代码,使用新的原生连接字符串,同时优化代码逻辑(比如添加IsPostBack判断避免重复绑定,用using自动释放资源):

protected void Page_Load(object sender, EventArgs e)
{
    // 仅在页面首次加载时绑定DropdownList,避免回发重复执行绑定操作
    if (!IsPostBack)
    {
        // 获取原生Oracle连接字符串
        string connStr = ConfigurationManager.ConnectionStrings["OracleNativeConn"].ConnectionString;
        
        // using语句自动释放连接和命令对象,避免内存泄漏
        using (OracleConnection conn = new OracleConnection(connStr))
        {
            string query = "SELECT NOMPRE FROM HOPEMPL";
            using (OracleCommand cmd = new OracleCommand(query, conn))
            {
                conn.Open();
                OracleDataAdapter oda = new OracleDataAdapter(cmd);
                DataSet ds = new DataSet();
                oda.Fill(ds);

                DDnompre.DataSource = ds;
                DDnompre.DataTextField = "NOMPRE";
                DDnompre.DataValueField = "NOMPRE";
                DDnompre.DataBind();
            }
        }
    }
}

错误原因说明

你原来使用的OraDbContextEntity Framework的实体连接字符串,它包含了EF模型的元数据(metadata)路径,是给EF专属的EntityConnection对象使用的。而OracleConnection是Oracle官方的ADO.NET驱动对象,只能识别原生的Oracle连接参数(比如DATA SOURCEUSER IDPASSWORD),直接传入EF的连接字符串自然会报错。

内容的提问来源于stack exchange,提问作者SELoug

火山引擎 最新活动