内部 .Net Framework 数据提供程序错误 30 Internal .Net Framework Data Provider error 30. 的处理办法

时间:2021-08-07 02:09:33
[问题背景] 

在.NET连接Oracle数据库的时候,出现一个错误。叫 内部 .Net Framework 数据提供程序错误 30。

我在我的代码中,把具体的错误日志打出来如下所示。 

[错误日志] 

17:10:54.417    Message:    内部 .Net Framework 数据提供程序错误 30。    

17:10:54.417    Data:    System.Collections.ListDictionaryInternal    
17:10:54.417    TargetSite:    Void Validate(Int32, Int32)    
17:10:54.432    StackTrace:       在 System.Data.ProviderBase.DbBuffer.Validate(Int32 offset, Int32 count)
   在 System.Data.ProviderBase.DbBuffer.PtrToStringUni(Int32 offset)
   在 System.Data.OracleClient.OracleInternalConnection.get_ServerVersion()
   在 System.Data.OracleClient.OracleConnection.get_ServerVersionAtLeastOracle8()
   在 System.Data.OracleClient.OracleColumn.Describe(Int32& offset, OracleConnection connection, OciErrorHandle errorHandle)
   在 System.Data.OracleClient.OracleDataReader.FillColumnInfo()
   在 System.Data.OracleClient.OracleDataReader..ctor(OracleCommand command, OciStatementHandle statementHandle, String statementText, CommandBehavior commandBehavior)
   在 System.Data.OracleClient.OracleCommand.ExecuteReader(CommandBehavior behavior)
   在 System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
   在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
   在 OLEDB.SelectDataToDataSet(DataSet ds, String sql, String& ErrorInfo)   

 

 [解决方法] 

分析了日志,开始想偷懒,上网问度娘和google(顺便吐槽下,google查询很不稳定,老查询不出来),关于这个错误的处理都非常少,很少有人能说明白到底错误出在哪里。

后来我看了下错误明细,应该是在

17:10:54.417    Data:    System.Collections.ListDictionaryInternal    

17:10:54.417    TargetSite:    Void Validate(Int32, Int32)    

 数据的最后转换出错了,我看了下,之前连接串如下: 

Data Source=*****;Persist Security Info=True;User ID=*****;Password=*****;Unicode=True 

 然后我估计是编码出的问题

把Unicode=True去掉,问题解决。

 [个人感悟]

微软跟oracle的配合还不是很好。