【问题标题】:OracleDataAdapter with GlobalTemporaryTable: FillSchema not working带有 GlobalTemporaryTable 的 OracleDataAdapter:FillSchema 不起作用
【发布时间】:2014-12-10 19:22:37
【问题描述】:

我在.net 中的OracleDataAdapter 上使用FillSchemaSelectCommand 适用于全局临时表。

对于第一次运行,这很好用。我会得到全局临时表的架构

然后我删除该临时表并使用不同的架构创建一个新的临时表。

之后,对于第二次运行,FillSchema 方法仍将返回旧删除的临时表中的架构。

我错过了什么吗? select 命令不应该从新版本的临时表中查询架构吗?

感谢您的帮助!

【问题讨论】:

  • 也许,您的尝试 DROP 没有成功,因为它可能正在使用中!而且您在不同架构中的创建会成功。但是当您第二次查询时..您应该错过了架构别名..并且同义词(私有)仍然引用了旧表!
  • 但是当我检查中间的全局临时表时,我发现它在删除之后消失了,并且我看到它是用不同的架构重新创建的。
  • 如果不检查您的代码就很难确认。顺便说一句,动态创建和删除 GTT 并不是一个好主意。 GTT 中的数据对于插入其中的会话来说是完全本地的。而且没有必要即时创建它。
  • 表格是GLOBAL .. 内容是插入者的本地内容..

标签: sql .net oracle dataadapter global-temp-tables


【解决方案1】:

什么不起作用: 所使用的 OracleDataAdapter.SelectCommand FillSchema 是:

从表名中选择 *

有效的方法: 我需要将该查询更改为确切的架构, 然后就可以了:

从表名中选择 column1,column2,column3

我不明白为什么,但这解决了我的问题。 它将返回新全局临时表的模式。 这是oracle服务器的缓存问题吗?因为 表名总是一样的?

【讨论】:

    【解决方案2】:

    用程序的方式来解决这个问题

    OracleParameter inputParam = new OracleParameter("TABLE_NAME_IN",OracleDbType.Varchar2,"TEST",ParameterDirection.Input); //Query TableName
    OracleParameter refParam = new OracleParameter("OUTPUT",OracleDbType.RefCursor,ParameterDirection.Output);//RefCursor
    DataTable dt = new DataTable();//Fill DataTable     
    using (OracleCommand dbCommand = new OracleCommand("PKG_SYS.SELECT_TABLE_DATA",orclConnection))
    {
        dbCommand.CommandType = CommandType.StoredProcedure;
        dbCommand.Parameters.Add(inputParam);
        dbCommand.Parameters.Add(refParam);
        using (OracleDataAdapter da = new OracleDataAdapter())
        {
            da.SelectCommand = dbCommand;
            da.Fill(dt);
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 2021-09-05
      • 2011-09-30
      • 2013-01-06
      • 2016-03-17
      • 2018-01-09
      • 2015-11-03
      • 2015-11-18
      • 2012-08-17
      相关资源
      最近更新 更多