2013-06-28 3 views
2

Есть ли способ сделать что-то вроде этого:C# Анализировать SqlDbType Convertion

(SqlDbType.Int).Parse(dtbDataTable.Rows[0]["Id"]) 

ТКС

+0

Каково значение 'dtbDataTable.Rows [0] [" Id "]'? – manji

+0

Действительно ли «Идентификатор» является идентификатором типа данных, или вы пытаетесь выяснить данные идентификатора столбца? – vcsjones

+0

Можете ли вы объяснить, почему вы хотите вывести поле ["Id"] в перечисление типа SqlDbType? Не хотите делать Int.Parse (dtbDataTable.Rows [0] ["Id"]. ToString()) или просто (int) dtbDataTable.Rows [0] ["Id"], если это уже целое число ? – saamorim

ответ

1

Проводка назад мой обходной путь:

public static string ParseValue(SqlDbType psdtParameter, string pstrValue, string pstrDateFormat = null) 
    { 
     object objReturn = new object(); 
     if (pstrValue != "") 
     { 
      switch (psdtParameter.ToString()) 
      { 
       case "BigInt": 
        objReturn = TypeDescriptor.GetConverter(typeof(Int64)).ConvertFromString(pstrValue); 
        break; 
       case "Bit": 
        objReturn = TypeDescriptor.GetConverter(typeof(Boolean)).ConvertFromString(pstrValue); 
        break; 
       case "NText": 
       case "NVarChar": 
       case "VarChar": 
       case "NChar": 
       case "Text": 
       case "Char": 
        objReturn = TypeDescriptor.GetConverter(typeof(String)).ConvertFromString(pstrValue); 
        break; 
       case "SmallDateTime": 
       case "DateTime": 
        objReturn = DateTime.ParseExact(pstrValue, pstrDateFormat, CultureInfo.InvariantCulture); 
        //TypeDescriptor.GetConverter(typeof(DateTime)).ConvertFromString(pstrValue); 
        break; 
       case "Money": 
       case "SmallMoney": 
       case "Decimal": 
        objReturn = TypeDescriptor.GetConverter(typeof(Decimal)).ConvertFromString(null, CultureInfo.InvariantCulture, pstrValue); 
        break; 
       case "Float": 
        objReturn = TypeDescriptor.GetConverter(typeof(Double)).ConvertFromString(pstrValue); 
        break; 
       case "Binary": 
       case "VarBinary": 
       case "Timestamp": 
       case "Image": 
        objReturn = TypeDescriptor.GetConverter(typeof(Byte[])).ConvertFromString(pstrValue); 
        break; 
       case "Int": 
        objReturn = TypeDescriptor.GetConverter(typeof(Int32)).ConvertFromString(pstrValue); 
        break; 
       case "Real": 
        objReturn = TypeDescriptor.GetConverter(typeof(Single)).ConvertFromString(pstrValue); 
        break; 
       case "SmallInt": 
        objReturn = TypeDescriptor.GetConverter(typeof(Int16)).ConvertFromString(pstrValue); 
        break; 
       case "TinyInt": 
        objReturn = TypeDescriptor.GetConverter(typeof(Byte)).ConvertFromString(pstrValue); 
        break; 
      } 
      return objReturn.ToString(); 
     } 
     else 
     { 
      return null; 
     } 
    } 

Tks!

+0

Прохладный, но я не понимаю, почему вам нужно преобразовать psdtParameter в строку ... – Antonio

0

К сожалению, нет. SqlDbType - это перечисление, поэтому (SqlDbType.Int) фактически сводится к целочисленному значению, а не типу. Единственный способ, которым я могу думать, чтобы сделать это своего рода переключатель заявление:

switch (SqlDbType dbType) 
{ 
    case SqlDbType.Int: 
     int value = Int32.Parse(dtbDataTable.Rows[0]["Id"]); 
     //Do stuff with this value 
    //repeat for other types 
} 
+0

Это хороший способ решить мою проблему @Omada, я использую ее внутри своей Framework для других вещей, но она немного снижает производительность из-за существующего множества параметров. – raddesso

+0

Если существует какой-то способ не выполнять синтаксический анализ и переключатель будет выглядеть лучше – raddesso

0

Я думаю, что будет трудно сделать, и это не самый читаемый способ. Я обрабатываю это с помощью методов расширения, чтобы помочь с TinyInt, SmallInt и значениями, допускающими значение NULL по всей доске. Например .:

using (var dr = new SafeDataReader(cmd.ExecuteReader()) { 
    while (dr.Read()) { 
    int? id = dr.GetNullableIntFromSqlTinyInt(0); 
    // Other stuff like that to handle type conversions 
    } 
} 

SafeDataReader является частью структуры бизнес-объекта CSLA, но вы могли бы реализовать свой собственный DataReader, если вы хотите. Это гораздо более разборчиво и инкапсулирует всю логику синтаксического анализа за кулисами в метод расширения.

+0

Он не применим только к Int, существуют различные типы данных @Joe, это решение выглядит специфично для типов Int/Tinyint – raddesso

+0

В этом примере да, поэтому у вас будет библиотека таких методов расширения GetXFromSqlY(). У нас около 15 или около того. – Joe