【问题标题】:SqlDataReader GetChar(int index) methodSqlDataReader GetChar(int index) 方法
【发布时间】:2013-06-06 18:25:45
【问题描述】:

在 MSDN 中指定:

MSDN - SqlDataReader GetChar 除了该方法标有

[EditorBrowsable(EditorBrowsableState.Never)]

属性,虽然您可以编码 -> 编译它,但当您运行该方法时,它会引发“方法不受支持”异常。

有没有什么方法可以在不使用(需要缓冲区的)GetChars 方法或将其作为字符串读取然后获取 [0] 字符的情况下从读取器读取单个字符?

(另外,这些方法不应该被隐藏或在 MSDN 上标明你不应该使用它们吗?)

编辑:

正如 Daniel A. White 所指出的,在备注部分有一行表明 SqlClient 不支持该方法。

【问题讨论】:

  • 其标记为不支持。
  • 我会通过使用GetString(index).First()来避免这个问题
  • 只调用GetValue会得到什么类型?如果它是一个字符串,那么只需使用 GetString。当您尝试不同的事物时,没有什么可赢的。
  • 已经 6 年了,这个 insert a bad word here 仍然在我的代码中出错。由于有一些间接的捕获块,我找不到导致问题的一个小时。谢谢。

标签: c# sqldatareader


【解决方案1】:

虽然我可以使用:

reader.GetString(colIndex)[0]

我选择了:

var buffer = new char[1];
reader.GetChars(colIndex, 0, buffer, 0, 1);

【讨论】:

  • 装箱/拆箱:“装箱是将值类型转换为类型对象或此值类型实现的任何接口类型的过程。当 CLR 将值类型装箱时,它会将值包装在里面一个 System.Object 并将其存储在托管堆上。拆箱从对象中提取值类型。装箱是隐式的;拆箱是显式的。装箱和拆箱的概念是 C# 类型系统统一视图的基础,其中任何值type 可以被视为一个对象。" msdn.microsoft.com/en-us/library/yz2be5wk.aspx
【解决方案2】:

因为SqlDataReader 实现了IDataReader,所以它有一个GetChar() 方法。但是在SqlDataReader 上,实现只是抛出一个NotImplementedExceptionSqlDataReader 被标记为不会在智能感知中提供 GetChar(),尽管如果您在 GetChar() 的末尾输入 SqlDataReader,您会看到它可以编译,但在运行时您会得到 NotImplementedException .

一切都相当令人失望,因为在我看来,.Net 团队只需要几行代码就可以实现GetChar()

幸运的是,通过使用扩展方法,我们可以将自己的GetChar() 方法添加到SqlDataReader。由于GetChar() 已经被使用(尽管只使用NotImplmentedException 实现),我们必须将其命名为GetChar() 以外的名称。我叫它GetSingleChar()

internal static class ExtensionMethods
{
    internal static char GetSingleChar(this SqlDataReader reader, int columnIndex)
    {
        System.Data.SqlTypes.SqlChars val = reader.GetSqlChars(columnIndex);
        if (val.Length != 1)
        {
            throw new ApplicationException(
                "Expected value to be 1 char long, but was "
                + val.Length.ToString() + " chars long.");
        }
        return val[0];
    }
}

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 2020-06-02
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多