В прошлой теме для получения результатов 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 в качестве параметра передается номер столбца, данные которого мы хотим получить.