[问题背景]
在.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的配合还不是很好。