Типизация результатов SqlDataReader

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

В прошлой теме для получения результатов SqlDataReader использовался метод GetValue, который возвращал значение определенного столбца в текущей ячейки в виде объекта типа object. Однако в ряде случаев такой способ не является оптимальным. Например, мы знаем, что в третьем столбце хранится возраст пользователя, который представляет целое число, и в программе мы хотели бы его использовать как целое число. Так как GetValue возвращает объект типа object, то, чтобы его использовать, к примеру, как число, нам надо его привести к типу int. Однако мы моем выбрать другой путь - использовать типизированные методы. Итак, изменим код программы следующим образом:

static void Main(string[] args)
{
    string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";

    string sqlExpression = "SELECT * FROM Users";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        SqlCommand command = new SqlCommand(sqlExpression, connection);
        SqlDataReader reader = command.ExecuteReader();

        if(reader.HasRows) // если есть данные
        {
            // выводим названия столбцов
            Console.WriteLine("{0}\t{1}\t{2}", reader.GetName(0), reader.GetName(1), reader.GetName(2));

            while (reader.Read()) // построчно считываем данные
            {
                int id = reader.GetInt32(0);
                string name = reader.GetString(1);
                int age = reader.GetInt32(2);

                Console.WriteLine("{0} \t{1} \t{2}", id, name, age);
            }
        }
        
        reader.Close();
    }
            
    Console.Read();
}

Для получения данных здесь теперь используются методы GetInt32() и GetString(), которые возвращают объекты типа int и string соответственно. Причем поскольку мы знаем, что в столбце id хранится число, то мы можем получить его именно с помощью метода GetInt32, но никак не GetString. И также в этот метод передается номер столбца в таблице (нумерация опять же начинается с нуля).

Для получения данных каждого примитивного типа есть свой метод:

Тип sql

Тип .NET

Метод

bigint

Int64

GetInt64

binary

Byte[]

GetBytes

bit

Boolean

GetBoolean

char

String и Char[]

GetString и GetChars

datetime

DateTime

GetDateTime

decimal

Decimal

GetDecimal

float

Double

GetDouble

image и long varbinary

Byte[]

GetBytes и GetStream

int

Int32

GetInt32

money

Decimal

GetDecimal

nchar

String и Char[]

GetString и GetChars

ntext

String и Char[]

GetString и GetChars

numeric

Decimal

GetDecimal

nvarchar

String и Char[]

GetString и GetChars

real

Single (float)

GetFloat

smalldatetime

DateTime

GetDateTime

smallint

Intl6

GetIntl6

smallmoney

Decimal

GetDecimal

sql variant

Object

GetValue

long varchar

String и Char[]

GetString и GetChars

timestamp

Byte[]

GetBytes

tinyint

Byte

GetByte

uniqueidentifier

Guid

GetGuid

varbinary

Byte[]

GetBytes

varchar

String и Char[]

GetString и GetChars

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850