6

在 MSDN 中指定:

MSDN - SqlDataReader GetChar 除了该方法被标记为

[EditorBrowsable(EditorBrowsableState.Never)]

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

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

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

编辑:

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

4

2 回答 2

7

虽然我可以使用:

reader.GetString(colIndex)[0]

我反而选择了:

var buffer = new char[1];
reader.GetChars(colIndex, 0, buffer, 0, 1);
于 2013-06-07T13:10:41.443 回答
5

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

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

令人高兴的是,通过使用扩展方法,我们可以将自己的GetChar()方法添加到SqlDataReader. 正如GetChar()已经采取的那样(尽管仅使用 a 实现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];
    }
}
于 2016-12-12T13:47:25.883 回答