SQL Server 数据类型的 C# 等效项

Posted

技术标签:

【中文标题】SQL Server 数据类型的 C# 等效项【英文标题】:C# Equivalent of SQL Server DataTypes 【发布时间】:2010-09-30 08:04:52 【问题描述】:

对于以下 SQL Server 数据类型,C# 中对应的数据类型是什么?

精确数字

bigint
numeric
bit
smallint
decimal
smallmoney
int
tinyint
money

近似数值

float
real

日期和时间

date
datetimeoffset
datetime2
smalldatetime
datetime
time

字符串

char
varchar
text

Unicode 字符串

nchar
nvarchar
ntext

二进制字符串

binary
varbinary
image

其他数据类型

cursor
timestamp
hierarchyid
uniqueidentifier
sql_variant
xml
table

(来源:MSDN)

【问题讨论】:

我认为这就是您可能正在寻找的:Mapping CLR Parameter Data 【参考方案1】:

这是给SQL Server 2005的。 SQL Server 2008、SQL Server 2008 R2、SQL Server 2012 和 SQL Server 2014 的表格有更新版本。

SQL Server 数据类型及其 .NET Framework 等效项

下表列出了 Microsoft SQL Server 数据类型、它们在 System.Data.SqlTypes 命名空间中 SQL Server 的公共语言运行时 (CLR) 中的等效项,以及它们在 Microsoft SQL Server 中的本机 CLR 等效项。 .NET 框架。

SQL Server data type          CLR data type (SQL Server)    CLR data type (.NET Framework)  
varbinary                     SqlBytes, SqlBinary           Byte[]  
binary                        SqlBytes, SqlBinary           Byte[]  
varbinary(1), binary(1)       SqlBytes, SqlBinary           byte, Byte[] 
image                         None                          None

varchar                       None                          None
char                          None                          None
nvarchar(1), nchar(1)         SqlChars, SqlString           Char, String, Char[]     
nvarchar                      SqlChars, SqlString           String, Char[] 
nchar                         SqlChars, SqlString           String, Char[] 
text                          None                          None
ntext                         None                          None

uniqueidentifier              SqlGuid                       Guid 
rowversion                    None                          Byte[]  
bit                           SqlBoolean                    Boolean 
tinyint                       SqlByte                       Byte 
smallint                      SqlInt16                      Int16  
int                           SqlInt32                      Int32  
bigint                        SqlInt64                      Int64 

smallmoney                    SqlMoney                      Decimal  
money                         SqlMoney                      Decimal  
numeric                       SqlDecimal                    Decimal  
decimal                       SqlDecimal                    Decimal  
real                          SqlSingle                     Single  
float                         SqlDouble                     Double  

smalldatetime                 SqlDateTime                   DateTime  
datetime                      SqlDateTime                   DateTime 

sql_variant                   None                          Object  
User-defined type(UDT)        None                          user-defined type     
table                         None                          None 
cursor                        None                          None
timestamp                     None                          None 
xml                           SqlXml                        None

【讨论】:

.Net 框架中的short 应该使用哪种 CLR 数据类型(SQL Server)? @yogeshpatel, short (docs.microsoft.com/en-us/dotnet/csharp/language-reference/…) 等于此清单中的 System.Int16。所以这将是 SQL Server 中的 smallint。 重要提示:SQL 数据类型“float”默认为“float(54)”,它转换为 C#“double”。但是,SQL 数据类型“float(24)”仅转换为 C#“float”。因此,如果您不需要很多位数的精度并希望提高性能/内存,请在 SQL 中使用 float(24),并在 C# 中键入“float”。【参考方案2】:

SQL Server 和 .Net 数据类型映射

【讨论】:

【参考方案3】:

如果有人正在寻找从/转换为 C# 和 SQL Server 格式的方法,这里有一个简单的实现:

private readonly string[] SqlServerTypes =  "bigint", "binary", "bit",  "char", "date",     "datetime", "datetime2", "datetimeoffset", "decimal", "filestream", "float",  "geography",                              "geometry",                              "hierarchyid",                              "image",  "int", "money",   "nchar",  "ntext",  "numeric", "nvarchar", "real",   "rowversion", "smalldatetime", "smallint", "smallmoney", "sql_variant", "text",   "time",     "timestamp", "tinyint", "uniqueidentifier", "varbinary", "varchar", "xml" ;
private readonly string[] CSharpTypes    =  "long",   "byte[]", "bool", "char", "DateTime", "DateTime", "DateTime",  "DateTimeOffset", "decimal", "byte[]",     "double", "Microsoft.SqlServer.Types.SqlGeography", "Microsoft.SqlServer.Types.SqlGeometry", "Microsoft.SqlServer.Types.SqlHierarchyId", "byte[]", "int", "decimal", "string", "string", "decimal", "string",   "Single", "byte[]",     "DateTime",      "short",    "decimal",    "object",      "string", "TimeSpan", "byte[]",    "byte",    "Guid",             "byte[]",    "string",  "string" ;

public string ConvertSqlServerFormatToCSharp(string typeName)

    var index = Array.IndexOf(SqlServerTypes, typeName);

    return index > -1
        ? CSharpTypes[index]
        : "object";


public string ConvertCSharpFormatToSqlServer(string typeName)

    var index = Array.IndexOf(CSharpTypes, typeName);

    return index > -1
        ? SqlServerTypes[index]
        : null;

编辑:修正错字

【讨论】:

您的方法 ConvertCSharpFormatToSqlServer 将始终返回找到的第一个实例,因为 CSharp 类型不是唯一的,即“byte[]”将始终返回“binary”,即使它映射到 5 个其他 Sql Server 类型。 @David 虽然你说的在技术上并没有错,但是当你使用ConvertSqlServerFormatToCSharp 方法时它是有道理的。这只是一个示例,您可以随时根据自己的需要进行修改。【参考方案4】:

SQL Server 和 .NET Framework 基于不同的类型系统。例如,.NET Framework Decimal 结构的最大小数位数为 28,而 SQL Server 十进制和数字数据类型的最大小数位数为 38。单击此处为a link!详细介绍

https://msdn.microsoft.com/en-us/library/cc716729(v=vs.110).aspx

【讨论】:

你能解释一下为什么我的答案是-1吗? 不是我对答案投了反对票,但理想情况下,您应该回答问题,而不是提供链接。【参考方案5】:
public static string FromSqlType(string sqlTypeString)

    if (! Enum.TryParse(sqlTypeString, out Enums.SQLType typeCode))
    
        throw new Exception("sql type not found");
    
    switch (typeCode)
    
        case Enums.SQLType.varbinary:
        case Enums.SQLType.binary:
        case Enums.SQLType.filestream:
        case Enums.SQLType.image:
        case Enums.SQLType.rowversion:
        case Enums.SQLType.timestamp://?
            return "byte[]";
        case Enums.SQLType.tinyint:
            return "byte";
        case Enums.SQLType.varchar:
        case Enums.SQLType.nvarchar:
        case Enums.SQLType.nchar:
        case Enums.SQLType.text:
        case Enums.SQLType.ntext:
        case Enums.SQLType.xml:
            return "string";
        case Enums.SQLType.@char:
            return "char";
        case Enums.SQLType.bigint:
            return "long";
        case Enums.SQLType.bit:
            return "bool";
        case Enums.SQLType.smalldatetime:
        case Enums.SQLType.datetime:
        case Enums.SQLType.date:
        case Enums.SQLType.datetime2:
            return "DateTime";
        case Enums.SQLType.datetimeoffset:
            return "DateTimeOffset";
        case Enums.SQLType.@decimal:
        case Enums.SQLType.money:
        case Enums.SQLType.numeric:
        case Enums.SQLType.smallmoney:
            return "decimal";
        case Enums.SQLType.@float:
            return "double";
        case Enums.SQLType.@int:
            return "int";
        case Enums.SQLType.real:
            return "Single";
        case Enums.SQLType.smallint:
            return "short";
        case Enums.SQLType.uniqueidentifier:
            return "Guid";
        case Enums.SQLType.sql_variant:
            return "object";
        case Enums.SQLType.time:
            return "TimeSpan";
        default:
            throw new Exception("none equal type");
    


public enum SQLType

    varbinary,//(1)
    binary,//(1)
    image,
    varchar,
    @char,
    nvarchar,//(1)
    nchar,//(1)
    text,
    ntext,
    uniqueidentifier,
    rowversion,
    bit,
    tinyint,
    smallint,
    @int,
    bigint,
    smallmoney,
    money,
    numeric,
    @decimal,
    real,
    @float,
    smalldatetime,
    datetime,
    sql_variant,
    table,
    cursor,
    timestamp,
    xml,
    date,
    datetime2,
    datetimeoffset,
    filestream,
    time,

【讨论】:

【参考方案6】:

尝试以下链接: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings

 SQL Server Database Engine type    .NET Framework type SqlDbType enumeration   SqlDataReader SqlTypes typed accessor   DbType enumeration  SqlDataReader DbType typed accessor
bigint  Int64   BigInt  GetSqlInt64 Int64   GetInt64
binary  Byte[]  VarBinary   GetSqlBinary    Binary  GetBytes
bit Boolean Bit GetSqlBoolean   Boolean GetBoolean
char    String

Char[]  Char    GetSqlString    AnsiStringFixedLength,

String  GetString

GetChars
date 1

(SQL Server 2008 and later) DateTime    Date 1  GetSqlDateTime  Date 1  GetDateTime
datetime    DateTime    DateTime    GetSqlDateTime  DateTime    GetDateTime
datetime2

(SQL Server 2008 and later) DateTime    DateTime2   None    DateTime2   GetDateTime
datetimeoffset

(SQL Server 2008 and later) DateTimeOffset  DateTimeOffset  none    DateTimeOffset  GetDateTimeOffset
decimal Decimal Decimal GetSqlDecimal   Decimal GetDecimal
FILESTREAM attribute (varbinary(max))   Byte[]  VarBinary   GetSqlBytes Binary  GetBytes
float   Double  Float   GetSqlDouble    Double  GetDouble
image   Byte[]  Binary  GetSqlBinary    Binary  GetBytes
int Int32   Int GetSqlInt32 Int32   GetInt32
money   Decimal Money   GetSqlMoney Decimal GetDecimal
nchar   String

Char[]  NChar   GetSqlString    StringFixedLength   GetString

GetChars
ntext   String

Char[]  NText   GetSqlString    String  GetString

GetChars
numeric Decimal Decimal GetSqlDecimal   Decimal GetDecimal
nvarchar    String

Char[]  NVarChar    GetSqlString    String  GetString

GetChars
real    Single  Real    GetSqlSingle    Single  GetFloat
rowversion  Byte[]  Timestamp   GetSqlBinary    Binary  GetBytes
smalldatetime   DateTime    DateTime    GetSqlDateTime  DateTime    GetDateTime
smallint    Int16   SmallInt    GetSqlInt16 Int16   GetInt16
smallmoney  Decimal SmallMoney  GetSqlMoney Decimal GetDecimal
sql_variant Object 2    Variant GetSqlValue 2   Object  GetValue 2
text    String

Char[]  Text    GetSqlString    String  GetString

GetChars
time

(SQL Server 2008 and later) TimeSpan    Time    none    Time    GetDateTime
timestamp   Byte[]  Timestamp   GetSqlBinary    Binary  GetBytes
tinyint Byte    TinyInt GetSqlByte  Byte    GetByte
uniqueidentifier    Guid    UniqueIdentifier    GetSqlGuid  Guid    GetGuid
varbinary   Byte[]  VarBinary   GetSqlBinary    Binary  GetBytes
varchar String

Char[]  VarChar GetSqlString    AnsiString, String  GetString

GetChars
xml Xml Xml GetSqlXml   Xml none

【讨论】:

以上是关于SQL Server 数据类型的 C# 等效项的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 的 mysqldump 等效项

C# 的哪种数据类型相当于 SQL Server 中的钱? [复制]

SQL Server 'Resume Next' 等效项

SQL Server 到 Netezza 数据类型等效

JavaScript 中的 C# 字典等效项

SQL Server 中的 Oracle TO_CHAR 格式模块“FM099999999V99MI”等效项