【问题标题】:How to change an Oracle table schema on live web application without restarting it?如何在不重新启动实时 Web 应用程序的情况下更改 Oracle 表模式?
【发布时间】:2020-11-30 05:24:11
【问题描述】:

我有一个非常具体的问题,针对一个非常具体的问题。我的开发环境非常简单:Oracle 11g 数据库、C# Web 应用程序(使用 ASP)。

为了连接到我的数据库,我使用了 OracleManagedDataAccess nuget 包,它一直运行良好,直到上个月。我能够毫无问题地在我的表上添加列,但是现在,它返回一个异常:将我的 DataReader 加载到 DataTable 时索引超出范围。

string connectionString = "myConnectionStringToTheDB";
string requete = "SELECT * FROM MyTable";

using (var connexion = new OracleConnection(connectionString))
{
    connexion.Open();

    using (var commande = new OracleCommand(requete, connexion))
    using (var dr = commande.ExecuteReader())
    using (var datatable = new DataTable())
    {
        datatable.Load(dr); // => crashes here
        foreach (DataRow row in datatable.Rows)
        {
            var campagne = GetFromDataReader<Campagne>(row, connectionString);
            campagne.CodeSource = row["CODE_SOURCE"].ToString();
            result.Add(campagne);
        }
    }
}

此代码在应用程序运行时有效,没问题。然后我在我的表中添加一列。然后我再次运行此代码,不...我必须停止并重新启动应用程序(在 IIS 上)才能使其正常运行。

事实是,当我的查询包含“*”时,它会崩溃。如果我列出表的所有列,它就可以工作。 这个问题突然无缘无故地发生了,这真的很烦人,因为即使有用户连接到应用程序,我也需要向我的表中添加列。这些新添加的列当然要等到程序重启后才会使用……

你知道如何解决这个问题吗?

谢谢!

【问题讨论】:

    标签: c# datatable oracle11g schema


    【解决方案1】:

    经过几次尝试,我弄清楚了发生了什么。 该错误来自我的 OracleManagedDataAccess DLL 版本。 18.6 之后的版本自动包含请求和元数据池。

    -我不得不从 19.1 回滚到 18.6

    -我添加了=>“元数据池=false;语句缓存清除=true;”到我的连接字符串,现在它又可以正常工作了。

    所以我现在不能再更新这个 DLL。好吧,无论如何...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多