首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何清除Oracle.ManagedDataAccess.Client表结构缓存

如何清除Oracle.ManagedDataAccess.Client表结构缓存
EN

Stack Overflow用户
提问于 2022-03-25 13:06:25
回答 1查看 83关注 0票数 1

下面是一个ASP.NET MVC核心操作:

代码语言:javascript
运行
复制
public ActionResult<object> Try()
{
    OracleConnection conn = (OracleConnection)_context.Database.GetDbConnection();
    if (conn.State != ConnectionState.Open)
        conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandText = "select * from mytable fetch first 1 rows only";

    var result = new List<string>();
    using (OracleDataReader reader = cmd.ExecuteReader())
    {
        while (reader.Read())
            result.Add(reader.GetName(0)+": "+reader.GetValue(0).ToString());
    }
    return string.Join(',',result);
}

然后执行以下操作:

1创建和填写表:

代码语言:javascript
运行
复制
create table mytable (f1 number(10), f2 varchar2(10));
insert into mytable values (32,'32');
grant select on mytable to myuser;

2呼吁行动:

代码语言:javascript
运行
复制
http://localhost/MyController/Try
// output is okay:
// F1: 32

3然后:

代码语言:javascript
运行
复制
alter table mytable add f3 varchar2(5) default ('f3') null;

4再次呼吁采取行动:

代码语言:javascript
运行
复制
http://localhost/MyController/Try

这会在OracleCommand.ExecuteReader中引发异常:

代码语言:javascript
运行
复制
System.Exception
  HResult=0x80131500
  Message=Internal Error
  Source=Oracle.ManagedDataAccess
  StackTrace:
   at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(Accessor[]& defineAccessors, Accessor[] bindAccessors, Boolean bHasReturningParams, SQLMetaData& sqlMetaData, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int32 noOfRowsToFetch, Int32& noOfRowsFetched, Int64& queryId, Int32 longFetchSize, Int64 clientInitialLOBFetchSize, Int64 initialLOBFetchSize, Int64 initialJSONFetchSize, Int64[] scnFromExecution, Boolean bAllInputBinds, Int32 arrayBindCount, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Int64[]& rowsAffectedByArrayBind, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause, List`1& implicitRSList, Boolean bLOBArrayFetchRequired)
   at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl& rdrImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Int64& internalInitialLOBFS, Int64 internalInitialJSONFS, OracleException& exceptionForArrayBindDML, OracleConnection connection, IEnumerable`1 adrianParsedStmt, Boolean isDescribeOnly, Boolean isFromEF)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader()

重新启动应用程序解决了问题。ManagedDataAccess似乎在某种程度上缓存了表结构。

其目的是使它在不重新启动应用程序的情况下工作。怎么做?有必要以某种方式清除一些隐藏物吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-25 17:49:18

多亏了Zastai,我们找到了解决方案:语句缓存。

代码语言:javascript
运行
复制
oracleCommand.AddToStatementCache = false;

即使表结构发生更改或表被删除/重新创建,也会使其工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71617460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档