从 SQL ColumnType 获取 .NET 类型
Get .NET Type from SQL ColumnType
我正在做类似 "SQL Query generator" 的事情。
为了能够生成 WHERE
子句,我需要找出该值在数据库中的类型。
即:如果值是一个整数,我将使用像 (<,>,=) 这样的运算符,在 DateTime 上我想添加 <,>,= 和一个组合框,用户可以在其中 select 某事像 "DateTime.Now".
所以这就是为什么我需要区分类型。
是否有任何方法可以将 table 的列中的类型转换为 .NET 类型?
我目前得到这个代码:
using (SqlConnection conn = new SqlConnection(MonitoringContext.Instance.ConnectionString))
{
conn.Open();
string query = $"SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{SelectedDatabaseItem}' AND COLUMN_NAME = '{Criteria[currentIndex].ColumnValueComboBox.SelectedItem}'";
SqlCommand command = new SqlCommand(query, conn);
object reader = command.ExecuteScalar();
valueType = Type.GetType(reader.ToString());
}
if(valueType != null)
{
if (valueType == typeof(DateTime))
{
List<string> operators = new List<string>() { "<", ">", "=" };
Criteria[currentIndex].OperatorValueComboBox.ItemsSource = operators;
//Add datePicker
return;
}
if(valueType == typeof(int))
{
//Add textbox to criteria selector
return;
}
}
所以假设数据库中的类型是 int
这工作正常,因为 Type.GetType("int")
将 return typeof(int)
:
但是,例如 "nvarchar",我无法将其转换为字符串。
是否有任何内置函数可以转换它?
很遗憾,没有“SQL服务器数据类型 -> .NET数据类型”映射table 内置;因此,您必须自己进行映射。
由于数据类型的数量受到限制(并且您的应用程序使用的数据类型实际的数量可能受到更多限制),这应该不会太难。从实现的角度来看,这可以通过巨大的 switch
语句或字典来完成。
映射本身在此处记录:
可在此处找到 C# 中的映射:
- SQL Server to .Net type conversions
提醒一句:请注意,SQL 服务器数据类型和 .NET 数据类型之间甚至可能没有 精确 对应关系:例如,decimal(4,2)
的范围比 .net 的 Decimal
短得多。 datetime
(SQL 中的 1753-9999 年,.NET 中的 0001-9999 年)以及其他可能也是如此。
我正在做类似 "SQL Query generator" 的事情。
为了能够生成 WHERE
子句,我需要找出该值在数据库中的类型。
即:如果值是一个整数,我将使用像 (<,>,=) 这样的运算符,在 DateTime 上我想添加 <,>,= 和一个组合框,用户可以在其中 select 某事像 "DateTime.Now".
所以这就是为什么我需要区分类型。
是否有任何方法可以将 table 的列中的类型转换为 .NET 类型?
我目前得到这个代码:
using (SqlConnection conn = new SqlConnection(MonitoringContext.Instance.ConnectionString))
{
conn.Open();
string query = $"SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{SelectedDatabaseItem}' AND COLUMN_NAME = '{Criteria[currentIndex].ColumnValueComboBox.SelectedItem}'";
SqlCommand command = new SqlCommand(query, conn);
object reader = command.ExecuteScalar();
valueType = Type.GetType(reader.ToString());
}
if(valueType != null)
{
if (valueType == typeof(DateTime))
{
List<string> operators = new List<string>() { "<", ">", "=" };
Criteria[currentIndex].OperatorValueComboBox.ItemsSource = operators;
//Add datePicker
return;
}
if(valueType == typeof(int))
{
//Add textbox to criteria selector
return;
}
}
所以假设数据库中的类型是 int
这工作正常,因为 Type.GetType("int")
将 return typeof(int)
:
但是,例如 "nvarchar",我无法将其转换为字符串。
是否有任何内置函数可以转换它?
很遗憾,没有“SQL服务器数据类型 -> .NET数据类型”映射table 内置;因此,您必须自己进行映射。
由于数据类型的数量受到限制(并且您的应用程序使用的数据类型实际的数量可能受到更多限制),这应该不会太难。从实现的角度来看,这可以通过巨大的 switch
语句或字典来完成。
映射本身在此处记录:
可在此处找到 C# 中的映射:
- SQL Server to .Net type conversions
提醒一句:请注意,SQL 服务器数据类型和 .NET 数据类型之间甚至可能没有 精确 对应关系:例如,decimal(4,2)
的范围比 .net 的 Decimal
短得多。 datetime
(SQL 中的 1753-9999 年,.NET 中的 0001-9999 年)以及其他可能也是如此。