Типизация результатов SqlDataReader. Сопоставление типов C# и SQL

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

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

Так, при создании таблицы в одной из прошлых тем использовался слеедующий скрипт sql:

CREATE TABLE Users (Id INT PRIMARY KEY IDENTITY, Age INT NOT NULL, Name NVARCHAR(20) NOT NULL)

То есть, мы знаем, что во втором столбце хранится возраст пользователя, который представляет целое число, и в программе мы хотели бы использовать это значение как целое число.

Так как GetValue возвращает объект типа object, то, чтобы использовать значение столбца, к примеру, как число, нам надо его привести к типу int. Однако мы можем выбрать другой путь - использовать типизированные методы.

Итак, изменим код программы следующим образом:

using Microsoft.Data.SqlClient;
using System;
using System.Threading.Tasks;

namespace HelloApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string connectionString = "Server=(localdb)\\mssqllocaldb;Database=adonetdb;Trusted_Connection=True;";

            string sqlExpression = "SELECT * FROM Users";

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                await connection.OpenAsync();

                SqlCommand command = new SqlCommand(sqlExpression, connection);
                using (SqlDataReader reader = await command.ExecuteReaderAsync())
                {
                    if (reader.HasRows) // если есть данные
                    {
                        // выводим названия столбцов
                        string columnName1 = reader.GetName(0);
                        string columnName2 = reader.GetName(1);
                        string columnName3 = reader.GetName(2);

                        Console.WriteLine($"{columnName1}\t{columnName3}\t{columnName2}");

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

                            Console.WriteLine($"{id} \t{name} \t{age}");
                        }
                    }
                }
            }
            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

date

DateTime

GetDateTime

datetime

DateTime

GetDateTime

datetime2

DateTime

GetDateTime

decimal

Decimal

GetDecimal

float

Double

GetDouble

image

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

rowversion

Byte[]

GetBytes

smalldatetime

DateTime

GetDateTime

smallint

Intl6

GetInt16

smallmoney

Decimal

GetDecimal

sql_variant

Object

GetValue

time

TimeSpan

GetTimeSpan

timestamp

Byte[]

GetBytes

tinyint

Byte

GetByte

uniqueidentifier

Guid

GetGuid

varbinary

Byte[]

GetBytes

varchar

String и Char[]

GetString и GetChars

Во все выше перечисленные методы SqlDataReader в качестве параметра передается номер столбца, данные которого мы хотим получить.

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