繁体   English   中英

使用 C# 和实体框架获取在 SQL Server 中创建的列的“sql 数据类型”

[英]Get the "sql datatype" of a column created in SQL server using C# and entity framework

我有一个由 2 列组成的表tblDetails

Id INT 不为空

名称 VARCHAR(20)

通过将 EntityFramework 6 和 C# 用于我的 WPF 应用程序,我获取数据以在前端显示它。 我也想获得列的“sql 数据类型”。

这是用于数据库连接的实体模型:

public class tblDetails
{
public int Id{get; set;}
public string Name{get;set;}
}

为此,我使用了GetProperty()方法。 下面是一个代码示例:

private void GetDataType()
{
     var col = typeof(tblDetails).GetProperty("Name"); 
            string dataType = col.PropertyType.Name;
}

问题

数据类型变量被分配了值string但我想要列的确切 Sql 数据类型,即VARCHAR(20)

我已经经历了许多如下的解决方案,但没有得到我的问题的解决方案。

如何使用 C# 实体框架获取 SQL Server 表/视图等中每列的数据类型?

有人有一个 C# 函数可以将列的 SQL 数据类型映射到它的 CLR 等效项吗?

实体框架数据注释设置 StringLength VarChar

更新

下面是我使用 Dbcontext 的类:

 public class DomainService : DbContext
   {
   public DomainService() : base("ConnectionString")
   {
     Configuration.LazyLoadingEnabled = true;
    #if DEBUG
       Database.Log = (s) => Debug.WriteLine(s);
    #endif
    }
  public DbSet<tblDetails> tblDetails { get; set; }
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
  }

实体框架(实际上任何“通用 ORM”)都是通用的,因此您不知何故失去了知道确切数据类型的能力。

即使您正在查看有时由不同 ORM 存储的属性或映射以在实际针对数据库执行工作之前启用某种验证 - 您也不能保证有人没有更改 SQL Server 上的架构结束 - 并没有更新模型。

在大多数情况下,这并不重要 - 使用匹配的 CLR 数据类型应该为您提供足够的信息(例如,对于用户界面的使用)。

如果您需要知道服务器存储和知道的确切数据类型,您有以下选择:

  • 如果您对表或视图架构感兴趣,您可以使用 SMO(SQL Server 管理对象)连接到服务器并查询表或视图的实际架构。
  • 如果您想知道特定查询返回的架构,您可以使用 sp_describe_first_result_set SP ( https://msdn.microsoft.com/en-us/library/ff878602.aspx ) 获取 SQL 查询并返回描述每列的结果集您可以期望在查询的结果集中。 您可能可以为您使用的查询运行一次,然后缓存结果或其他东西。

希望能帮助到你。

在反射中使用DbContext object代替您自己创建的model class

DomainService context = new DomainService();
private void GetDataType()
{
     var col = typeof(context.tblDetails).GetProperty("Name"); 
            string dataType = col.PropertyType.Name;
}

得到了一个解决方案:获取数据类型和长度以及VARCHARNCHARNVARCHAR类型的变量

SqlConnection connection = new SqlConnection("ConnectionString");
connection.Open();

string sqlcmnd = string.Format(
                        @"SELECT CASE UPPER(DATA_Type) 
                        WHEN 'NCHAR'    THEN  CONCAT(UPPER(DATA_Type),'(',ISNULL(CHARACTER_MAXIMUM_LENGTH,''),')') 
                        WHEN 'VARCHAR'  THEN  CONCAT(UPPER(DATA_Type),'(',ISNULL(CHARACTER_MAXIMUM_LENGTH,''),')') 
                        WHEN 'NVARCHAR' THEN  CONCAT(UPPER(DATA_Type),'(',ISNULL(CHARACTER_MAXIMUM_LENGTH,''),')') 
                        ELSE UPPER(DATA_Type) END AS DATA_TYPE
                        FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{0}' AND COLUMN_NAME = '{1}'", tableName, ColumnName);

SqlCommand cmd = new SqlCommand(sqlcmnd, connection);

SqlDataReader reader = cmd.ExecuteReader();  
while (reader.Read())
string dataType = reader["DATA_TYPE"].ToString();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM