【问题标题】:Can a field data type change from row to row when using OracleDatareader使用 OracleDatareader 时字段数据类型可以逐行更改吗
【发布时间】:2011-06-20 08:37:38
【问题描述】:

在 ac# 程序中使用OracleDataReader (Oracle.DataAccess.Client) 从记录集中读取数据时,是否存在其中一个字段中的数据类型可能逐行更改的情况(DBNull 除外)。

我正在考虑这样的情况,例如 select 使用 case 语句,该语句可以返回来自数字 (9) 列的值或来自定义为数字 (14) 的列的值。

在数据读取器上使用索引器时,在向上转换返回的值时是否有任何其他可能相关的问题,例如int cityId = (int)dataReader["CityId"];(处理DBNull除外)

【问题讨论】:

    标签: c# oracle ado.net plsql


    【解决方案1】:

    AFAIK,数据类型不会逐行更改。

    如果查询使用从不同数据类型返回值的 case 语句,引擎负责为所有数据选择最合适的值,并将使用该数据类型描述结果集,作为标准强制在任何结果集中每列使用一种数据类型。

    无论如何,如果您不信任/不知道查询的来源,请将您的演员括在 try/catch 句子中以获得任何意外结果并采取相应措施。

    【讨论】:

    • 数据类型不会逐行更改是我通常认为的。但是然后考虑一个可以为空的数字(9)。对于一行,可能会设置值,因此在 .net 中,该行的数据类型将是 int。对于另一行,该值可能为空,该行的数据类型将为 System.DBNull。因此,这证明了来自 .net 端 db 的值的表示可以具有不同的数据类型 int 或 DBNull。所以这让我想到,如果从技术上讲,数据类型可以是 int 或 DBNull,那么从技术上讲,它甚至可能是别的东西。
    • @Phil Carson - 我认为您在这里将“价值”与“类型”混淆了。当特定行为该列的值返回 NULL 时,它是一个值 - 该列没有更改类型。就像当行为特定列返回 9 时,它返回的是值,而不是类型。该列可以是 INT、SMALLINT 或 BIGINT,但值为 9。同样,value 可以为 NULL,但该列保留其类型。 .NET 在“幕后”执行一些工作以将值映射到 CLR 类型,并且它具有针对 NULL 值的特殊逻辑。这可能会造成混乱。
    【解决方案2】:

    结果集中的每一列都将具有相同的数据类型和长度/大小/精度。 JDBC 连接

    使用 JDBC,这些实际上可以从result set metadata 获得。不确定是否有 C# 的等价物

    一个奇怪的是一种非常特殊的用户定义类型,称为 SYS.ANYTYPE,它主要在内部用于复制。一个结果集中可以包含三行一列。该列的数据类型将是 SYS.ANYTYPE,但在内部,一个可以有一个日期值,而另一个有一个数字,最后一个有一个字符。有一些特殊的包可以确定任何 ANYTYPE 值中隐藏的内容。

    【讨论】:

      猜你喜欢
      • 2014-09-20
      • 2021-09-27
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多