从SQL ColumnType获取.NET类型

本文关键字:NET 类型 获取 ColumnType SQL | 更新日期: 2023-09-27 17:58:17

我正在研究类似于"SQL查询生成器"的东西。为了能够biuld WHERE子句,我需要找出该值在数据库中的类型。

即:如果值是int,我将使用类似(<,>,=)的运算符,在DateTime上,我想添加<、>,=和一个组合框,用户可以在其中选择"DateTime.Now"之类的内容。

所以这就是为什么我需要在不同的类型之间有所不同。

有什么方法可以从转换为.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;
     }                    
}

因此,假设DB中的类型为int,则工作正常,因为Type.GetType("int")将返回typeof(int):

但只要它是例如"nvarchar",我就无法将其转换为字符串。

有什么内置函数可以转换这个吗?

从SQL ColumnType获取.NET类型

不幸的是,没有内置"SQL Server数据类型->.NET数据类型"映射表;因此,您必须自己进行映射。

由于数据类型的数量受到限制(您的应用程序实际使用的数据类型的数目可能会受到更多限制),这应该不会太难。从实现的角度来看,这可以通过一个巨大的switch语句或字典来完成。

这里记录了映射本身:

  • SQL Server数据类型映射

C#中的映射可以在这里找到:

  • SQL Server到.Net的类型转换

注意:请注意,SQL Server数据类型和.NET数据类型之间甚至可能没有精确的对应关系:例如,decimal(4,2)的范围比.NET的Decimal短得多。datetime也是如此(SQL中为1753-9999年,.NET中为0001-9999年),很可能还有其他版本。