SqlDataReader GetChar(int index) 方法

6

MSDN中指定:

MSDN - SqlDataReader GetChar,但该方法被标记为

[EditorBrowsable(EditorBrowsableState.Never)]

虽然您可以编写代码并进行编译,但运行该方法会抛出“不支持的方法”异常。

是否有任何方法可以从读取器中读取单个字符,而无需使用(需要缓冲区)GetChars方法或将其作为字符串读取然后获取[0]字符?

(此外,这些方法不应该被隐藏或在MSDN上用某种方式标记,说明您不应该使用它们吗?)

编辑:

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


2
不支持该操作。 - Daniel A. White
2
我会通过使用 GetString(index).First() 来避免这个问题。 - Jeremy Holovacs
当你调用GetValue时,你得到的是什么类型?如果那里是字符串,那就使用GetString。当你尝试不同的东西时,没有什么可赢的。 - Ralf
这个该死的问题已经困扰我的代码6年了。由于存在一些间接的catch块,我找不到问题所在,好几个小时都没解决。谢谢。 - sanitizedUser
2个回答

7

虽然我可以使用以下代码:

reader.GetString(colIndex)[0]

但我选择了以下代码:

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

装箱/拆箱: "装箱是将值类型转换为对象类型或由该值类型实现的任何接口类型的过程。当CLR对值类型进行装箱时,它将值包装在System.Object中并将其存储在托管堆上。拆箱从对象中提取值类型。装箱是隐式的;拆箱是显式的。装箱和拆箱的概念构成了C#类型系统的统一视图,在该视图中,任何类型的值都可以被视为对象。" https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx - A.J.Bauer

5
因为SqlDataReader实现了IDataReader接口,它有一个GetChar()方法。但是在SqlDataReader上,该方法的实现只是抛出一个NotImplementedException异常。尽管您可以在SqlDataReader的结尾输入GetChar(),看到它编译通过,但在运行时会产生NotImplementedException异常,因此SqlDataReader不会在intellisense中提供GetChar()。这让人感到非常失望,因为我认为.Net团队只需要几行代码就可以实现GetChar()
幸运的是,通过使用扩展方法,我们可以向SqlDataReader添加自己的GetChar()方法。由于GetChar()已经被占用,虽然仅仅是抛出一个NotImplmentedException异常,我们必须将其命名为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];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接