繁体   English   中英

C#数据类型为SQL Server数据类型

[英]C# data types to SQL Server data types

如何将C#数据类型“转换”为SQL Server数据类型(已知SqlDbType

即:

C# -> "String"
SQL Server -> N'String'

试试这个:它是一个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");
            }
        }
    }
}

首先,您可以从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的情况下,我只用了一杯咖啡就把它写在了我的头顶。)

编辑

请注意,在处理.NET字符串的解析时,这会变得模糊。 它是varchar,nvarchar,文本还是备忘录? 在这些情况下,此方法无法知道任何方法,并且在根据表和列名称(或过程和参数名称)调用方法后,您可能必须做出更明智的决策。

我不知道如何做这样的转换,但可能有更好的方法:

我假设您要使用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 } );

这是一个古老但仍然有效的问题,所以这里有一个不同的方式。 有人已经做了这个编码。 如果您执行类似于此的查询...

select

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

...您的数据库驱动程序将为您执行数据类型映射。 您只需检索数据并访问生成的列定义。 列名称将是DBMS数据类型(名称),列数据类型将是您正在使用的任何语言的数据类型。 您的查询可以限于您关注的特定DBMS数据类型。 请注意,这不限于任何特定的数据库管理系统。 需要注意的是,这并不能告诉您哪些数据类型需要长度参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM