我正在编写一个存储过程生成器,我需要将 CLR 类型映射到它们的 SQL Server 类型。
MSDN 列出了类型映射:http://msdn.microsoft.com/en-us/library/ms131092.aspx 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”。
这变得相当复杂,因为它取决于您愿意针对哪个版本的 SQL Server。
- With a 2008 target you would probably want instances of DateTime to map to the improved datetime2 http://technet.microsoft.com/en-us/library/bb677335.aspx rather than datetime.
- TimeSpan 更糟糕,因为您的后备选项是使用 DateTime 或 varchar。
这是sql server将如何处理的指南复制场景中的数据类型 http://msdn.microsoft.com/en-us/library/ms143241.aspx
SQL Server Compact Edition 进一步增加了混乱,因为它不支持 varchar(max)、varbinary(max) 列类型(您只能使用显式的约 4K 长度列)。
在某些时候,您还需要对具有多个选项的领域做出启发式决策。
- textual information may be varchar(n) or varchar(max).
- 或从 2005 年起使用 XML
- 或 TEXT 但已弃用
- 十进制可以很好地映射到数字输入,但在输出上存在风险,因为数字具有更大的比例
- should bitmaps be image or varbinary?
- Unsigned integers
- uint 可以安全地放入 bigint
- ulong的问题比较多
-
bigints http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(VS.100).aspx会更有趣。
鉴于这一切,在实用程序函数中使用一个简单的 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.
}
您可能还想添加可选的精度/大小值,尽管您可能选择将其留给用户。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)