2016-05-20 7 views
1

Есть ли способ из класса POCO получить фактический тип данных DB различных свойств? Для примера: Давайте предположим, что класс PocoПолучить DB DataType ServiceStack Ormlite

public class Product : IHasId<int> 
{ 
    [Alias("id")] 
    [Required] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

поля Название и описание может быть, как VARCHAR (п) или текст в базе данных (SQL Server). Возможно ли получить фактический DB DataType из свойств POCO?

ответ

3

OrmLite ожидает, что основной RDBMS схемы определения столбца для того, что указано в TypeConverter, который вы можете получить с:

var converter = OrmLiteConfig.DialectProvider.GetStringConverter(); 
var columnDef = converter.ColumnDefinition; 

Чтобы получить фактическое определение столбца, который нужно использовать пользовательские SQL для запроса SQL Server

var sql = @"select COLUMN_NAME, data_type + 
    case 
     when data_type like '%text' or data_type like 'image' or data_type like 'sql_variant' or data_type like 'xml' 
      then '' 
     when data_type = 'float' 
      then '(' + convert(varchar(10), isnull(numeric_precision, 18)) + ')' 
     when data_type = 'numeric' or data_type = 'decimal' 
      then '(' + convert(varchar(10), isnull(numeric_precision, 18)) + ',' + convert(varchar(10), isnull(numeric_scale, 0)) + ')' 
     when (data_type like '%char' or data_type like '%binary') and character_maximum_length = -1 
      then '(max)' 
     when character_maximum_length is not null 
      then '(' + convert(varchar(10), character_maximum_length) + ')' 
     else '' 
    end as COLUMN_DEFINITION 
FROM information_schema.columns"; 

using (var db = dbFactory.OpenDbConnection()) 
{ 
    var results = db.Dictionary<string,string>(sql + " WHERE table_name = 'Product'"); 

    var nameColumnDef = results["Name"]; //= varchar(8000) 

    //Or print out all column definitions for each field with: 
    results.PrintDump(); 
    /* 
    { 
     Id: int, 
     Name: varchar(8000) 
     ... 
    } 
    */ 
} 
Смежные вопросы