繁体   English   中英

映射CLR参数数据

[英]Mapping CLR Parameter Data

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

MSDN在以下位置列出了类型映射: http : //msdn.microsoft.com/zh-cn/library/ms131092.aspx,但是我不想使用大的switch语句来处理映射。

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

我想要这样的方法签名:

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

因此,给出以下调用:

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

sqlType应该包含:“ int”。

这变得相当复杂,因为它取决于您希望定位的SQL Server版本。

  • 对于2008年的目标,您可能希望DateTime的实例映射到改进的datetime2而不是datetime。
    • 由于您的后备选项使用DateTime或varchar,因此TimeSpan甚至更糟。

这是有关SQL Server 在复制方案中如何处理数据类型的指南

SQL Server Compact Edition不支持varchar(max)和varbinary(max)列类型(您只能使用显式的〜4K长度的列),这进一步加剧了混乱。

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

  • 文本信息可以是varchar(n)或varchar(max)。
    • 或XML(从2005年开始)
    • 或TEXT,但已弃用
  • 小数点将很好地映射到输入的数字,但是在输出时存在风险,因为数字的比例更大
  • 位图应该是图像还是varbinary?
    • 再次弃用了图像,但这可能会使仍在使用它的人们感到烦恼。
  • 无符号整数
    • uint可以安全地放入bigint
    • 乌龙更成问题
    • 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.
}

您可能也想添加可选的精度/尺寸值,尽管这可能是您选择留给用户的。

暂无
暂无

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

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