2016-12-12 8 views
0

Я пытаюсь принести следующие детали столбцов из SQL Server:Указанного бросок не действует при извлечении детали столбцов из SQL Server

  • Размер
  • Precision
  • Масштаб

I я успешно получаю данные, когда у меня ниже схемы для таблицы:

T able1:

Col1 : varchar(40),null) 
Col2 : varchar(2,null) 
Col3 : varchar(57,null) 
Col4 : varchar(245 ,null) 
Col5 : datetime(not null) 

Но я получаю сообщение об ошибке

Указано бросок не является действительным.

в случае этой схемы:

Col1 : varchar(34,null) 
Col2 : varchar(1066,null) 
Col3 : varchar(500,null) 
Col4 : varchar(600,null) 
Col5 : numeric(31,13,null) 
Col6 : numeric(31,13,null) 
Col7 : datetime(null) 

Код:

String[] columnRestrictions = new String[4]; 
columnRestrictions[0] = 'MyDb'; 
columnRestrictions[1] = 'dbo'; 
columnRestrictions[2] = 'Employee'; 

using (SqlConnection con = new SqlConnection("MyConnectionString")) 
{ 
    con.Open(); 
    var columns = con.GetSchema("Columns", columnRestrictions).AsEnumerable() 
     .Select 
      (
       t => new 
       { 
        Name = t[3].ToString(), 
        Datatype = t.Field<string>("DATA_TYPE"), 
        IsNullable = t.Field<string>("is_nullable"), 
        Size = t.Field<int?>("character_maximum_length"), 
        NumericPrecision = t.Field<int?>("NUMERIC_PRECISION"), //error on this field 
        NumericScale = t.Field<int?>("NUMERIC_SCALE") 
       }).ToList(); 

Источник:

Reference1

Reference2

Update: эта линия вызывает вопрос

NumericPrecision = t.Field<int?>("NUMERIC_PRECISION"), //error on this field 

Как я могу решить эту ошибку и размер выборки, точность и масштаб для столбцов?

+0

Итак, какая линия бросает исключение? Вы должны сузить его до одного поля ... –

+0

@JonSkeet: Name, Datatype, isnullable работает, но я думаю, проблема связана с остальными свойствами. –

+1

Вместо того, чтобы гадать, вы должны сделать работу, чтобы сузить ее. Найдите одно свойство, которое * определенно * вызывает проблему, и, в идеале, в отладчике работает то, что является * актуальным * типом. –

ответ

2

Проблема в коде является то, что вы Кастинг byte к int?, то Field -метод поддерживает NULLABLE типов (если столбец может быть пустым), но не конвертировать из byte? в int?. Вместо этого оно исключает это исключение. Source

Так просто используйте:

NumericPrecision = t.Field<byte?>("NUMERIC_PRECISION"), 

Вы всегда можете посмотреть на DataColumn «s DataType собственности.