使用.NET读取oracle表,一个LONG类型的列总是返回空字符串,如何解决?
Posted
技术标签:
【中文标题】使用.NET读取oracle表,一个LONG类型的列总是返回空字符串,如何解决?【英文标题】:Read oracle tables using .NET, one LONG type column always returns empty string, how to solve it? 【发布时间】:2017-01-30 08:47:30 【问题描述】:我正在从一个表 all_tab_columns 中读取,有一个“data_default”列,它是一种 LONG。
如果我使用sqlplus查询oracle服务器,比如“select data_default from all_tab_columns where table_name='testtable'”,一切正常。可以为“testtable”表的每一列返回正确的默认值。
但是,如果我使用 Oracle.ManagedDataAccess.dll(好吧,我使用的是 Spartacus 库,而后者又使用 Oracle.ManagedDataAccess.dll),对于相同的查询,data_default 列总是返回空字符串'',我试过了其他几个列,例如 column_name、table_name、owner 等。它们都很好。
我的问题是如何调试这种情况?我找不到这个特殊错误的根本原因。欢迎提出任何建议。
谢谢。
spartacus从oracle读取的源码如下,
this.v_con = new OracleManaged.OracleConnection(this.v_connectionstring);
this.v_con.Open();
this.v_cmd = new OracleManaged.OracleCommand(p_sql, this.v_con);
if (this.v_timeout > -1)
this.v_cmd.CommandTimeout = this.v_timeout;
this.v_reader = this.v_cmd.ExecuteReader();
v_table = new System.Data.DataTable(p_tablename);
for (int i = 0; i < this.v_reader.FieldCount; i++)
v_table.Columns.Add(this.v_reader.GetName(i), typeof(string));
while (this.v_reader.Read())
v_row = v_table.NewRow();
for (int i = 0; i < this.v_reader.FieldCount; i++)
v_row[i] = this.v_reader[i].ToString();
v_table.Rows.Add(v_row);
我尝试调试,data_default 列的 v_reader[i].ToString() 已经为空。我好像没有办法解决?可能是.dll的问题?
【问题讨论】:
您好,附上源代码。谢谢。 【参考方案1】:获取 LONG 和 LONG RAW 数据
ODP.NET 在调用 OracleDataReader 对象的 Read 方法期间从数据库中获取和缓存行。从此操作中检索的 LONG 和 LONG RAW 列数据量由 InitialLONGFetchSize 确定。 More
您可能需要将InitialLONGFetchSize
设置为非零值并使用OracleDataReader 的GetOracleString()
方法,并使用ToString()
将结果转换为.Net
字符串。
【讨论】:
谢谢。添加了 this.v_cmd.InitialLONGFetchSize = 1024;创建 this.v_cmd 后解决了问题。 嗨,@user534498 和@JSapkota,我是 Spartacus 的创建者和维护者。我不知道InitialLONGFetchSize
属性,我将在下一个 Spartacus 版本中包含此解决方法。谢谢!
@wind39 感谢您的出色工作。我现在面临oracle的另一个问题,查询“select count() as total from table1 union all select count() as total from table2”,oracle返回0和0(mysql返回正确值)。在 sqlplus 控制台中,返回正确的值。你认为我应该打开另一个问题吗?
@user534498 Oracle 正在返回值为 0 的两行? table1 和 table2 都是空的? union all
按预期工作,它不会消除对结果的复制。您能否提供更多详细信息?
@wind39 nvm,这次是我的错。我使用 sqlplus 在表中插入多个数据并使用 Spartacus 客户端进行测试,但未能将数据读出。一旦我退出 sqlplus,一切正常。似乎sqlplus会缓存少量数据,直到您注销为止。以上是关于使用.NET读取oracle表,一个LONG类型的列总是返回空字符串,如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
[Oracle with Asp.Net] ORA-01461: 只有在将值插入数据类型为 LONG 的数据栏时, 才可以连结一个 LONG 值
jdbc 读取oracle long raw 字段,里面存的是文本
解决:oracle+myBatis ResultMap 类型为 map 时,表字段类型有 Long/Blob/Clob 时报错
为已有表快速创建自动分区和Long类型like 的方法-Oracle 11G