Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CLR System.InvalidCastException  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Добрый день.

Пытаюсь написать простейшую CLR_ку, которая должна выдать "описание" RecordSet_а

internal struct RSItem
{
  public int ColID;
  public string ColName;
  public string sqltype;
  public int MaxLen;
  public int precision;
  public int scale;

  public RSItem(int ColID, string ColName, string sqltype, int MaxLen, int precision, int scale)
  {
    this.ColID = ColID;
    this.ColName = ColName;
    this.sqltype = sqltype;
    this.MaxLen = MaxLen;
    this.precision = precision;
    this.scale = scale;
  }
}

//----------
    DataTable schema = reader.GetSchemaTable();

    for (int i = 0; i < reader.FieldCount; i++)
    {
      result.Add(new RSItem
        ( 
            i + 1
          , schema.Rows[i]["ColumnName"].ToString()
          , schema.Rows[i]["DataTypeName"].ToString()
          , (int) schema.Rows[i]["ColumnSize"]
          , (int) schema.Rows[i]["NumericPrecision"]  // <- System.InvalidCastException
          , (int) schema.Rows[i]["NumericScale"]     // <- System.InvalidCastException
        )
      );


И при "получении NumericPrecision/NumericScale" вылезает System.InvalidCastException
Хотя, если вывести как строку, то оба св-ва имеют нормальный интовый вид, как в доке (Если ProviderType не является числовым типом данных, то это значение равно 255.)

Как исправить ?

PS. Заранее извиняюсь, знаний по C# чуть ниже плинтуса
23 июн 14, 11:57    [16205571]     Ответить | Цитировать Сообщить модератору
 Re: CLR System.InvalidCastException  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6203
Greenhorn
оба св-ва имеют нормальный интовый вид

Нормальный интовый вид в строковом представлении имеет много чего - в т.ч. даже вообще не являющееся числом.
В данном случае InvalidCastException вылетает из-за того, что используется строгое приведение типа, и фактический тип поля не соответствует приводимому. Истинный тип поля выясняется элементарно:
using (var cnn = new SqlConnection("Data Source=.;Initial Catalog=master;Integrated Security=True"))
using(var cmd = new SqlCommand("select 1.1", cnn))
{
  cnn.Open();
  using(var rd = cmd.ExecuteReader())
  {
    var dt = rd.GetSchemaTable();
    Console.WriteLine(dt.Rows[0]["NumericPrecision"].GetType().FullName);
    Console.WriteLine(dt.Rows[0]["NumericScale"].GetType().FullName);
  }
}

Вывод:

System.Int16
System.Int16

Int16 - это также тип short, т.е. кастовать нужно к short. Либо использовать метод Convert.ToInt32. В данном случае разницы нет, т.к. при присваивании интовому полю класса short-значения произойдет неявное преобразование типа.
23 июн 14, 12:36    [16205788]     Ответить | Цитировать Сообщить модератору
 Re: CLR System.InvalidCastException  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Сон Веры Павловны,

Огромное спасибо - все получилось...
23 июн 14, 12:53    [16205880]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить