【问题标题】:Get .NET Type from SQL ColumnType从 SQL ColumnType 获取 .NET 类型
【发布时间】:2016-11-26 11:26:30
【问题描述】:

我正在开发类似“SQL 查询生成器”的东西。 为了能够创建WHERE 子句,我需要找出数据库中值的类型。

ie:如果值是 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”,我无法将其转换为字符串。

有没有内置函数可以转换这个?

【问题讨论】:

  • 您必须手动完成,因为类型的数量非常有限,这不是什么大事
  • @SamiKuhmonen 好的,所以我从数据库中获取类型作为字符串,然后检查是否 (varchar => string, int => int, => dateTime => dateTime) ?
  • 是的,只需为映射构建一个字典,您就可以轻松处理它
  • @SamiKuhmonen 感谢 dict 听起来不错!

标签: c# sql .net types converter


【解决方案1】:

很遗憾,没有内置“SQL Server 数据类型 -> .NET 数据类型”映射表;因此,您必须自己进行映射。

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

映射本身记录在这里:

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

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

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    相关资源
    最近更新 更多