2009-08-18 242 views
0

我在写一个存储过程生成器,我需要将CLR类型映射到它们的SQL Server类型。映射CLR参数数据

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”。

回答

2

这是相当复杂的,因为它取决于你愿意针对哪个版本的sql server。

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

这里是一个指导如何SQL Server将处理datatypes in replication scenarios

SQL Server精简版增加了进一步的混乱,因为它不支持varchar(max),VARBINARY(max)列类型(你只限于明确的〜4K长度的列)。

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

  • 文本信息可能是varchar(n)或varchar(max)。
    • 或XML从2005年起
    • 或文本,但使用已过时
  • 小数将很好地映射到数字输入,但是是有风险的输出数值有较大规模
  • 应的位图是图像还是varbinary?
    • 再次显示图像已被弃用,但这可能会惹恼仍在使用它的人。
  • 无符号整数
    • UINT可以安全地投入BIGINT
    • ULONG是相当多问题
    • bigints将更加有趣。

考虑到这一切会在一个效用函数一个不错的简单switch语句将使生活更不是试图依靠仅用于类型转换,而不是文字SQL创建一些不透明BCL库更容易。
它也通过默认的抛出或默认的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. 
} 

您可能需要添加可选的精度/大小太超值了,虽然这可能是你选择离开给用户的东西。