从SQL ColumnType获取.NET类型

时间:2016-07-22 14:04:18

标签: c# sql .net types converter

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

ie:如果值是int,我会使用像(<,>,=)这样的运算符,在DateTime上我想添加<,>,=和一个组合框,用户可以在其中选择像& #34; 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;
     }                    
}

因此,假设数据库中的类型为int,这样可以正常工作,因为Type.GetType("int")将返回typeof(int)

但是,例如&#34; nvarchar&#34;我无法将其转换为字符串。

是否有任何内置函数可以转换它?

1 个答案:

答案 0 :(得分:1)

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

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

这里记录了映射本身:

可以在此处找到C#中的映射:

请注意:请注意,SQL Server数据类型与.NET数据类型之间甚至可能没有完全对应关系:例如,decimal(4,2)的范围要短得多比.net的Decimaldatetime(SQL中的1753-9999,.NET中的0001-9999)也是如此,也可能是其他人。