映射 CLR 参数数据
下表列出了 Microsoft SQL Server 数据类型、它们在 SQL Server 公共语言运行时 (CLR) 的 System.Data.SqlTypes 命名空间中的等效类型,以及它们在 Microsoft .NET Framework 中的本机 CLR 等效类型。
SQL Server 数据类型 |
类型(在 System.Data.SqlTypes 或 Microsoft.SqlServer.Types 中) |
CLR 数据类型 (.NET Framework) |
bigint |
SqlInt64 |
Int64, Nullable<Int64> |
binary |
SqlBytes, SqlBinary |
Byte[] |
bit |
SqlBoolean |
Boolean, Nullable<Boolean> |
char |
无 |
无 |
cursor |
无 |
无 |
date |
SqlDateTime |
DateTime, Nullable<DateTime> |
datetime |
SqlDateTime |
DateTime, Nullable<DateTime> |
datetime2 |
无 |
DateTime, Nullable<DateTime> |
DATETIMEOFFSET |
None |
DateTimeOffset, Nullable<DateTimeOffset> |
decimal |
SqlDecimal |
Decimal, Nullable<Decimal> |
float |
SqlDouble |
Double, Nullable<Double> |
geography |
SqlGeography SqlGeography 在 Microsoft.SqlServer.Types.dll 中定义,该文件随 SQL Server 一起安装,并且可以从 SQL Server 2008 功能包下载。 |
无 |
geometry |
SqlGeometry SqlGeometry 在 Microsoft.SqlServer.Types.dll 中定义,该文件随 SQL Server 一起安装,并且可以从 SQL Server 2008 功能包下载。 |
无 |
hierarchyid |
SqlHierarchyId SqlHierarchyId 在 Microsoft.SqlServer.Types.dll 中定义,该文件随 SQL Server 一起安装,并且可以从 SQL Server 2008 功能包下载。 |
无 |
image |
无 |
无 |
int |
SqlInt32 |
Int32, Nullable<Int32> |
money |
SqlMoney |
Decimal, Nullable<Decimal> |
nchar |
SqlChars, SqlString |
String, Char[] |
ntext |
无 |
无 |
numeric |
SqlDecimal |
Decimal, Nullable<Decimal> |
nvarchar |
SqlChars, SqlString SQLChars 更适合用于数据传输和访问,而 SQLString 更适合用于执行字符串运算。 |
String, Char[] |
nvarchar(1), nchar(1) |
SqlChars, SqlString |
Char, String, Char[], Nullable<char> |
real |
SqlSingle |
Single, Nullable<Single> |
rowversion |
无 |
Byte[] |
smallint |
SqlInt16 |
Int16, Nullable<Int16> |
smallmoney |
SqlMoney |
Decimal, Nullable<Decimal> |
sql_variant |
无 |
Object |
table |
无 |
无 |
text |
无 |
无 |
time |
无 |
TimeSpan, Nullable<TimeSpan> |
timestamp |
无 |
无 |
tinyint |
SqlByte |
Byte, Nullable<Byte> |
uniqueidentifier |
SqlGuid |
Guid, Nullable<Guid> |
User-defined type(UDT) |
无 |
绑定到相同程序集或依赖程序集中的用户定义类型的相同类。 |
varbinary |
SqlBytes, SqlBinary |
Byte[] |
varbinary(1), binary(1) |
SqlBytes, SqlBinary |
byte, Byte[], Nullable<byte> |
varchar |
无 |
无 |
xml |
SqlXml |
无 |
使用 Out 参数的自动数据类型转换
通过以 out 修饰符 (Microsoft Visual C#) 或 <Out()> ByRef (Microsoft Visual Basic) 来标记输入参数,CLR 方法可以将信息返回到发起调用的代码或程序。如果输入参数是 System.Data.SqlTypes 命名空间中的 CLR 数据类型,并且发起调用的程序指定其等效 SQL Server 数据类型作为输入参数,则会在 CLR 方法返回数据类型时自动发生类型转换。
例如,以下 CLR 存储过程具有以 out (C#) 或 <Out()> ByRef (Visual Basic) 进行标记的 SqlInt32 CLR 数据类型的输入参数:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void PriceSum(out SqlInt32 value)
{ … }
<Microsoft.SqlServer.Server.SqlProcedure> _
Public Shared Sub PriceSum( <Out()> ByRef value As SqlInt32)
…
End Sub
在数据库中生成和创建程序集之后,将用以下 Transact-SQL 在 SQL Server 中创建存储过程,该 Transact-SQL 指定 SQL Server 数据类型 int 作为 OUTPUT 参数:
CREATE PROCEDURE PriceSum (@sum int OUTPUT)
AS EXTERNAL NAME TestStoredProc.StoredProcedures.PriceSum
调用 CLR 存储过程时,SqlInt32 数据类型将自动转换到 int 数据类型,并返回到调用程序。
但是,并非所有 CLR 数据类型都可以通过 out 参数自动转换到其等效的 SQL Server 数据类型。下表列出了这些例外类型。
CLR 数据类型 (SQL Server) |
SQL Server 数据类型 |
Decimal |
smallmoney |
SqlMoney |
smallmoney |
Decimal |
money |
DateTime |
smalldatetime |
SQLDateTime |
smalldatetime |