Типы данных C # для типов данных SQL Server

Как я могу "конвертировать"? Тип данных C # для типа данных SQL Server (SqlDbType известен)

то есть:

C# -> "String"
SQL Server -> N'String'
 Larry12 июн. 2012 г., 15:22
За исключением случаев, когда у вас есть какое-то конкретное приложение для генерации кода, основанное на базе данных SQL Server, это обычно не требуется: ADO.NET делает это автоматически при добавлении параметров в запрос. Пожалуйста, поделитесь кодом, чтобы мы могли это проверить.
 christiandev12 июн. 2012 г., 15:23
что ты пытаешься достичь? вы хотите создать свою базу данных из классов? Если так, посмотрите на Entity Framework, Code-First.codeproject.com/Articles/318010/… и посмотри наFluentAPI, Это очень мощный способ создания БД из ваших классов.
 hwcverwe12 июн. 2012 г., 15:26
Почему вы не используете параметры. Тогда вам не нужно думать об этой проблеме.
 Romil Kumar Jain12 июн. 2012 г., 15:20
поделитесь кодом, где вам это нужно.
 Jayesh Sorathia12 июн. 2012 г., 15:24
Обнаружили ли вы проблему вставки данных разных языков в базу данных?

Ответы на вопрос(4)

Во-первых, вы можете получить список сопоставлений из MSDN. Их можно найтиВот.

Затем просто создайте хеш-таблицу (HashTable), чтобы найти один тип и преобразовать его в соответствующий SqlDbType. Что-то вроде этого:

private static types = new HashTable<Type, SqlDbType>();
public static SqlDbType GetSqlDbType(Type type)
{
    if (types == null)
    {
        var types = new HashTable<Type, SqlDbType>();
        types.Add(int.GetType(), SqlDbType.Int);
        // And so forth...
    }

    return types[type];

}

Или слова на этот счет. Естественно, рефакторинг для соответствия StyleCop и ремонтопригодности. (Я написал это на макушке без IDE и только после одной чашки кофе.)

EDIT

Обратите внимание, что это может стать нечетким при работе с разрешением строк .NET. Это varchar, nvarchar, текст или памятка? В этих случаях этот метод не будет иметь никакого способа узнать, и вам, вероятно, придется принимать более обоснованное решение после вызова метода на основе имени таблицы и столбца (или имени процедуры и параметра).

 12 июн. 2012 г., 18:11
То, что вы предполагаете, он спрашивает, и то, что он спрашивает, это две совершенно разные вещи. Он явно попросил преобразование между типом CLR и SqlDbType. Вот что я ему дал.
 12 июн. 2012 г., 15:43
Майк хороший ответ, но он, вероятно, хочет знать, как использовать значение в запросе. Так что NVarChar используетN'yourvalue' целое число просто1 логическое значение должно быть преобразовано в бит и т. д.

Это старый, но все еще действующий вопрос, так что здесь по-другому. Кто-то уже сделал это кодирование. Если вы выполните запрос, похожий на этот ...

select

    @@serverName  as [Varchar],
    GetDate()     as [DateTime],
    3.14159       as [Decimal],
    256           as [Int],
    :
    :
    -- And So On

... ваш драйвер базы данных выполнит сопоставление типов данных за вас. Вам просто нужно получить данные и получить доступ к полученным определениям столбцов. Имя столбца будет типом данных СУБД (name), а тип данных столбца будет типом данных для любого языка, на котором вы работаете. Ваш запрос может быть ограничен конкретными типами данных СУБД, которые вас интересуют. Обратите внимание, что это не ограничивается какой-либо конкретной системой управления базами данных. Одно предостережение состоит в том, что это не говорит вам, какие типы данных требуют параметров длины.

Попробуй это: Это класс Extension, поэтому в файле вы хотите использовать эти методы при добавлении:

using Utility;

Вот код:

using System;
using System.Data;
using Microsoft.SqlServer.Server;

namespace Utility
{
    public static class TypeExtension
    {
        public static SqlDbType ToSqlDbType(this Type clrType)
        {
            var s = new SqlMetaData("", SqlDbType.NVarChar, clrType);
            return s.SqlDbType;
        }


        public static Type ToClrType(SqlDbType sqlType)
        {
            switch (sqlType)
            {
                case SqlDbType.BigInt:
                    return typeof (long?);

                case SqlDbType.Binary:
                case SqlDbType.Image:
                case SqlDbType.Timestamp:
                case SqlDbType.VarBinary:
                    return typeof (byte[]);

                case SqlDbType.Bit:
                    return typeof (bool?);

                case SqlDbType.Char:
                case SqlDbType.NChar:
                case SqlDbType.NText:
                case SqlDbType.NVarChar:
                case SqlDbType.Text:
                case SqlDbType.VarChar:
                case SqlDbType.Xml:
                    return typeof (string);

                case SqlDbType.DateTime:
                case SqlDbType.SmallDateTime:
                case SqlDbType.Date:
                case SqlDbType.Time:
                case SqlDbType.DateTime2:
                    return typeof (DateTime?);

                case SqlDbType.Decimal:
                case SqlDbType.Money:
                case SqlDbType.SmallMoney:
                    return typeof (decimal?);

                case SqlDbType.Float:
                    return typeof (double?);

                case SqlDbType.Int:
                    return typeof (int?);

                case SqlDbType.Real:
                    return typeof (float?);

                case SqlDbType.UniqueIdentifier:
                    return typeof (Guid?);

                case SqlDbType.SmallInt:
                    return typeof (short?);

                case SqlDbType.TinyInt:
                    return typeof (byte?);

                case SqlDbType.Variant:
                case SqlDbType.Udt:
                    return typeof (object);

                case SqlDbType.Structured:
                    return typeof (DataTable);

                case SqlDbType.DateTimeOffset:
                    return typeof (DateTimeOffset?);

                default:
                    throw new ArgumentOutOfRangeException("sqlType");
            }
        }
    }
}

Я не знаю, как делать такие преобразования, но, вероятно, есть лучший способ:

Я предполагаю, что вы хотите вставить значение с помощью C # в запрос SQL.

Почему вы не используете параметры?

Вместо:

SqlCommand command = 
    new SqlCommand(String.Format(
       "SELECT * FROM MyTable WHERE mycolumn = {0}", 
       ConvertValueToSql(whateverobject))); 
// ConvertValueToSql is what you are asking basically

Попробуйте сделать это:

// Conversion list of used types
Dictionary<Type, SqlDbType> typeConversion = new Dictionary<Type, SqlDbType>();
typeConversion.Add(typeof(String), SqlDbType.NVarChar);
typeConversion.Add(typeof(Int32), SqlDbType.Integer);
// you can even do this if you want
typeConversion.Add(typeof(MyCustomImageClass), SqlDbType.VarBinary);
typeConversion.Add(typeof(MyOtherNiceClass), SqlDbType.NVarChar);

// In the method
SqlCommand command = new SqlCommand("SELECT * FROM MyTable WHERE mycolumn = @Value");
command.Parameters.Add(new SqlParameter("@Value", typeConversion[whateverobject.GetType()]) { Value = whateverobject } );

Ваш ответ на вопрос