Прочитать на английском

Поделиться через


Типы SqlType и набор данных

В ADO.NET 2.0 добавлена поддержка расширенных типов DataSet через пространство имен System.Data.SqlTypes. Типы в пространстве имен System.Data.SqlTypes предназначены для предоставления типов данных с той же семантикой и точностью, которыми обладают типы данных в базе данных SQL Server. Каждый тип данных в пространстве имен System.Data.SqlTypes имеет эквивалентный тип данных в SQL Server с аналогичным базовым представлением данных.

Использование System.Data.SqlTypes непосредственно в DataSet дает несколько преимуществ при работе с типами данных SQL Server. System.Data.SqlTypes поддерживает такую же семантику, как и собственные типы данных SQL Server. Указав любой из типов System.Data.SqlTypes в определении DataColumn, вы исключите потерю точности от преобразования типов данных decimal или numeric в типы данных среды CLR.

Пример

В следующем примере создается объект DataTable с явным определением типов данных DataColumn при помощи System.Data.SqlTypes, а не типов CLR. Этот код заполняет таблицу DataTable данными из таблицы Sales.SalesOrderDetail базы данных AdventureWorks в SQL Server. Выходные данные, отображаемые в окне консоли, содержат тип данных для каждого столбца и значения, полученные из SQL Server.

static void GetSqlTypesAW(string connectionString)
{
    // Create a DataTable and specify a SqlType
    // for each column.
    DataTable table = new();
    table.Columns.Add("SalesOrderID", typeof(SqlInt32));
    table.Columns.Add("UnitPrice", typeof(SqlMoney));
    table.Columns.Add("LineTotal", typeof(SqlDecimal));
    table.Columns.Add("ModifiedDate", typeof(SqlDateTime));

    // Open a connection to SQL Server and fill the DataTable
    // with data from the Sales.SalesOrderDetail table
    // in the AdventureWorks sample database.
    using (SqlConnection connection = new(connectionString))
    {
        const string queryString =
            "SELECT TOP 5 SalesOrderID, UnitPrice, LineTotal, ModifiedDate "
            + "FROM Sales.SalesOrderDetail WHERE LineTotal < @LineTotal";

        // Create the SqlCommand.
        SqlCommand command = new(queryString, connection);

        // Create the SqlParameter and assign a value.
        SqlParameter parameter =
            new("@LineTotal", SqlDbType.Decimal)
            {
                Value = 1.5
            };
        command.Parameters.Add(parameter);

        // Open the connection and load the data.
        connection.Open();
        SqlDataReader reader =
            command.ExecuteReader(CommandBehavior.CloseConnection);
        table.Load(reader);

        // Close the SqlDataReader.
        reader.Close();
    }

    // Display the SqlType of each column.
    Console.WriteLine("Data Types:");
    foreach (DataColumn column in table.Columns)
    {
        Console.WriteLine($" {column.ColumnName} -- {column.DataType.UnderlyingSystemType}");
    }

    // Display the value for each row.
    Console.WriteLine("Values:");
    foreach (DataRow row in table.Rows)
    {
        Console.Write(" {0}, ", row["SalesOrderID"]);
        Console.Write(" {0}, ", row["UnitPrice"]);
        Console.Write(" {0}, ", row["LineTotal"]);
        Console.Write(" {0} ", row["ModifiedDate"]);
        Console.WriteLine();
    }
}

См. также