映射CLR参数数据

时间:2009-08-18 12:46:32

标签: c# sql-server clr types

我正在编写存储过程生成器,我需要将CLR类型映射到它们的SQL Server类型。

MSDN列出了http://msdn.microsoft.com/en-us/library/ms131092.aspx的类型映射,但我不想使用大的switch语句来处理映射。

是否有一种简单的方法可以使用System.Data.SqlTypes使用的任何进程将SQL Server类型检索为字符串?

我想像这样的方法签名:

static string GetSqlType(Type clrType)
{
    ...
    return sqlType;
}

所以给出了以下电话:

string sqlType = GetSqlType(1.GetType());

sqlType应包含:“int”。

1 个答案:

答案 0 :(得分:2)

这更加复杂,因为它取决于您愿意定位的sql server版本。

  • 对于2008目标,您可能希望DateTime实例映射到改进的datetime2而不是日期时间。
    • TimeSpan更糟糕,因为您的后备选项使用DateTime或varchar。

以下是sql server如何处理datatypes in replication scenarios

的指南

SQL Server Compact Edition增加了混乱,因为它不支持varchar(max),varbinary(max)列类型(您只能使用显式的~4K长度列)。

在某些时候,您还需要对具有多个选项的区域做出启发式决策。

  • 文本信息可以是varchar(n)或varchar(max)。
    • 或2005年起的XML
    • 或TEXT但不推荐使用
  • 十进制将很好地映射到数字用于输入,但在输出时有风险,因为数字具有更大的比例
  • 位图应该是图像还是varbin?
    • 再次使用图片,但这可能会让人们仍在使用它。
  • 无符号整数
    • uint可以安全地放入bigint
    • ulong更有问题
    • bigints会更有趣。

鉴于所有这一切,在实用程序函数中使用一个简单的switch语句将比使用一些仅用于类型转换而不是文本sql创建的不透明BCL库更容易。 它还通过默认的throw或默认varchar(max)清楚地表明你的“尚未定义”的行为将在你的控制之下。

从表单的方法中返回一个简单的不可变类:

public sealed class SqlServerTypeDescription
{
    // for sql text construction
    public readonly string SqlServerName;
    // for code construction
    public readonly SqlDbType SqlDbType;
    // for code construction
    public readonly Type ClrType;

    // constructor etc.
}

您可能还想添加可选的精度/大小值,尽管这可能是您选择留给用户的内容。