- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在寻找 .Net System.Type 和 SqlDbType 之间的智能转换。我发现它是以下想法:
private static SqlDbType TypeToSqlDbType(Type t)
{
String name = t.Name;
SqlDbType val = SqlDbType.VarChar; // default value
try
{
if (name.Contains("16") || name.Contains("32") || name.Contains("64"))
{
name = name.Substring(0, name.Length - 2);
}
val = (SqlDbType)Enum.Parse(typeof(SqlDbType), name, true);
}
catch (Exception)
{
// add error handling to suit your taste
}
return val;
}
上面的代码不是很好,有代码味,这就是为什么我写了下面的代码,幼稚,不聪明,但有用的功能,基于https://msdn.microsoft.com/en-us/library/cc716729(v=vs.110).aspx :
public static SqlDbType ConvertiTipo(Type giveType)
{
var typeMap = new Dictionary<Type, SqlDbType>();
typeMap[typeof(string)] = SqlDbType.NVarChar;
typeMap[typeof(char[])] = SqlDbType.NVarChar;
typeMap[typeof(int)] = SqlDbType.Int;
typeMap[typeof(Int32)] = SqlDbType.Int;
typeMap[typeof(Int16)] = SqlDbType.SmallInt;
typeMap[typeof(Int64)] = SqlDbType.BigInt;
typeMap[typeof(Byte[])] = SqlDbType.VarBinary;
typeMap[typeof(Boolean)] = SqlDbType.Bit;
typeMap[typeof(DateTime)] = SqlDbType.DateTime2;
typeMap[typeof(DateTimeOffset)] = SqlDbType.DateTimeOffset;
typeMap[typeof(Decimal)] = SqlDbType.Decimal;
typeMap[typeof(Double)] = SqlDbType.Float;
typeMap[typeof(Decimal)] = SqlDbType.Money;
typeMap[typeof(Byte)] = SqlDbType.TinyInt;
typeMap[typeof(TimeSpan)] = SqlDbType.Time;
return typeMap[(giveType)];
}
有人知道如何以更干净、更好、更好的方式获得相同的结果吗?
最佳答案
您的方法是一个好的开始,但正如 Ian 在评论中所说,填充该字典应该只完成一次。
这里有一个基于相同想法的 GIST,尽管它不会在相同类型集之间进行转换:https://gist.github.com/abrahamjp/858392
警告
我有a working example下面,但您需要注意这种方法确实存在一些问题。例如:
string
,如何在Char
、NChar
、VarChar
、NVarChar
、Text
或 NText
(甚至可能是 Xml
)?byte[]
这样的 blob,您应该使用 Binary
、VarBinary
还是 Image
? decimal
、float
和double
,你应该选择Decimal
、Float
code>、Money
、SmallMoney
还是 Real
?DateTime
,您需要 DateTime2
、DateTimeOffset
、DateTime
还是 SmallDateTime
?Nullable
类型,例如 int?
?这些很可能会提供与基础类型相同的 SqlDbType
。此外,仅提供 Type
不会告诉您其他约束,例如字段大小和精度。做出正确的决定还与数据在您的应用程序中的使用方式以及数据在数据库中的存储方式有关。
最好的办法就是让ORM为你做这个。
代码
public static class SqlHelper
{
private static Dictionary<Type, SqlDbType> typeMap;
// Create and populate the dictionary in the static constructor
static SqlHelper()
{
typeMap = new Dictionary<Type, SqlDbType>();
typeMap[typeof(string)] = SqlDbType.NVarChar;
typeMap[typeof(char[])] = SqlDbType.NVarChar;
typeMap[typeof(byte)] = SqlDbType.TinyInt;
typeMap[typeof(short)] = SqlDbType.SmallInt;
typeMap[typeof(int)] = SqlDbType.Int;
typeMap[typeof(long)] = SqlDbType.BigInt;
typeMap[typeof(byte[])] = SqlDbType.Image;
typeMap[typeof(bool)] = SqlDbType.Bit;
typeMap[typeof(DateTime)] = SqlDbType.DateTime2;
typeMap[typeof(DateTimeOffset)] = SqlDbType.DateTimeOffset;
typeMap[typeof(decimal)] = SqlDbType.Money;
typeMap[typeof(float)] = SqlDbType.Real;
typeMap[typeof(double)] = SqlDbType.Float;
typeMap[typeof(TimeSpan)] = SqlDbType.Time;
/* ... and so on ... */
}
// Non-generic argument-based method
public static SqlDbType GetDbType(Type giveType)
{
// Allow nullable types to be handled
giveType = Nullable.GetUnderlyingType(giveType) ?? giveType;
if (typeMap.ContainsKey(giveType))
{
return typeMap[giveType];
}
throw new ArgumentException($"{giveType.FullName} is not a supported .NET class");
}
// Generic version
public static SqlDbType GetDbType<T>()
{
return GetDbType(typeof(T));
}
}
这就是您将如何使用它:
var sqlDbType = SqlHelper.GetDbType<string>();
// or:
var sqlDbType = SqlHelper.GetDbType(typeof(DateTime?));
// or:
var sqlDbType = SqlHelper.GetDbType(property.PropertyType);
关于c# - .NET 系统类型到 SqlDbType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35745226/
我想将一些字符串类型的变量分配给 SQL Server 2008 中某些类型的最大值。 例如: string foo = MaxValueInDbFor(SqlDbType.Int); string
数据库中所有包含文本的列过去都是 nvarchar,但出于性能原因,我们将它们转换为 varchar。我现在剩下的所有 SqlParameters 仍在使用 SqlDbType.NVarChar,我想
对于 .NET DateTime 类型,为什么推断的数据库类型是 SqlDbTypes.DateTime 而不是 SqlDbTypes.DateTime2? (见 http://msdn.micros
我有很多看起来像这样的 C# VS2008 代码: new SqlParameter("@Description", SqlDbType.NChar, 1500) 或者这个: new SqlParam
我要编辑文本框的值..但我看到有问题 protected void btn_edit_Click(object sender, EventArgs e) { Databas
我正在尝试将字符串值转换为 SqlDbType。我的代码能够将“Text”转换为 SqlDbType.Text 而不会出现任何错误,但是当我尝试将“bit”转换为 SqlDbType.Bit 时,我收
我想将时间存储在表中,并将 time(7) 作为存储时间的数据类型。当我减去两个 DateTime 时,我的 "1.18:36:36.7484253" 变量得到了 TimeSpan 作为结果。但问题是
using System.Data; using System.Data.SqlClient; 我正在使用 SqlDbType.DateTime 的 SqlCommand cmd.Parameters
我应该为 numeric T-SQL 数据类型使用 SqlDbType 枚举中的什么值? 最佳答案 十进制。 查看此页面:http://msdn.microsoft.com/en-us/library
我只是想知道是否有任何逻辑或架构意见不在 c# 中的 SqlDbType 枚举中包含地理数据类型 他们在名为“Microsoft.SqlServer.Smo”的新程序集中添加了 SqlDataType
我一直在寻找 .Net System.Type 和 SqlDbType 之间的智能转换。我发现它是以下想法: private static SqlDbType TypeToSqlDbType(Type
我在下面有这个工作代码。但是,我没有采用名称、值和 SqlDbType 的 SqlParameter 构造函数,我只想提供日期参数的类型。有没有一种不需要添加大量代码的方法? SqlParameter
来自 msdn website我得到以下信息: A special data type for specifying structured data contained in table-valued
除了手动构建映射之外,是否有一种干净的方法可以将 system_type_id(在 sys.types View 中找到)转换为 System.Data.SqlDbType 枚举?它似乎具有内置功能,
我想在将 System.DateTime 值作为参数添加到我的 SqlCommand 实例之前对其进行验证。 SqlDbType 枚举的 MSDN 文档说: 日期和时间数据,取值范围从 1753 年
有谁知道等同于 SqlDbType.Bit 的 DbType 是什么? 我正在尝试转换 param[0] = new SqlParameter("@Status", SqlDbType.Bit); p
有一个相关的问题: What's the best method to pass parameters to SQLCommand? 但是我想知道有什么不同,不同的方式是否有任何问题。 我通常使用这样
有很多示例我们如何从标准 :net 类或实例转换 SqlDbType 枚举。我没有在互联网上找到任何落后的解决方案。它似乎不那么常见,但应该(我认为)是一种更简单的方法,然后只是一个包含所有 31 个
我想将一组ID传递给将使用NHibernate映射的存储过程。这项技术是在Sql Server 2008中引入的(此处的更多信息=> Table-Valued Parameters)。我只是不想在nv
为 bigint 参数指定的大小是多少? SqlParameter param = new SqlParameter("@Param", SqlDbType.Bigint); param.Size =
我是一名优秀的程序员,十分优秀!