C#解析SqlDbType转换

时间:2013-06-28 15:36:16

标签: c# parsing casting type-conversion sqldbtype

有没有办法做这样的事情:

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

3 个答案:

答案 0 :(得分: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;
        }
    }

韩国社交协会!

答案 1 :(得分: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
 }

答案 2 :(得分:0)

我认为这样做很难,而且这不是最易读的方式。我通过扩展方法处理这个问题,以帮助整个板上的TinyInt,SmallInt和可空值。 E.g:

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。它更加清晰,并将幕后的所有解析逻辑封装到扩展方法中。