Метод SqlDataReader GetChar (int index)

Указано в MSDN:

MSDN — SqlDataReader GetChar За исключением того, что этот метод помечен

[EditorBrowsable(EditorBrowsableState.Never)]

атрибут, и хотя вы можете закодировать -> скомпилировать его, при запуске метода он выдает исключение «метод не поддерживается».

Есть ли способ затем прочитать один символ из считывателя без использования (требуется буфер) метода GetChars или прочитать его как строку, а затем получить символ [0]?

(Кроме того, разве эти методы не должны быть либо скрыты, либо отмечены чем-то в MSDN, указывающим, что вы не должны их использовать?)

РЕДАКТИРОВАТЬ:

Как указал Дэниел А. Уайт, в разделе примечаний есть единственная строка, в которой говорится, что метод не поддерживается для SqlClient.


person Rostov    schedule 06.06.2013    source источник
comment
отмечено, что он не поддерживается.   -  person Daniel A. White    schedule 06.06.2013
comment
Я бы избежал этой проблемы, используя GetString(index).First()   -  person Jeremy Holovacs    schedule 06.06.2013
comment
Какой тип вы получите, если просто вызовете GetValue? Если это строка, просто используйте GetString. Ничего не выиграть, когда вы пробуете что-то другое.   -  person Ralf    schedule 06.06.2013
comment
Прошло 6 лет, а этот insert a bad word here все еще глючит в моем коде. Я не мог найти причину проблемы в течение хорошего часа, потому что были некоторые непрямые блоки catch. Спасибо.   -  person sanitizedUser    schedule 27.04.2020


Ответы (2)


Хотя я мог бы использовать:

reader.GetString(colIndex)[0]

Вместо этого я выбрал:

var buffer = new char[1];
reader.GetChars(colIndex, 0, buffer, 0, 1);
person Rostov    schedule 07.06.2013
comment
Упаковка/распаковка: Упаковка — это процесс преобразования типа значения в объект типа или в любой тип интерфейса, реализованный этим типом значения. Когда среда CLR упаковывает тип значения, она упаковывает значение в System.Object и сохраняет его в управляемой куче. Распаковка извлекает тип значения из объекта. Бокс неявный; распаковка явная. Концепция упаковки и распаковки лежит в основе унифицированного представления C# системы типов, в которой значение любого типа может рассматриваться как объект. msdn.microsoft.com/en-us/library/yz2be5wk.aspx - person A.J.Bauer; 03.12.2015

Поскольку SqlDataReader реализует IDataReader, у него есть метод GetChar(). Но на SqlDataReader реализация этого заключается в том, чтобы просто выбросить NotImplementedException. SqlDataReader помечен так, чтобы не предлагать GetChar() в IntelliSense, хотя, если вы введете 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];
    }
}
person Jinlye    schedule 12.12.2016