C#分析SqlDbType转换

本文关键字:转换 SqlDbType 分析 | 更新日期: 2023-09-27 18:20:14

有什么方法可以做这样的事情吗:

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

C#分析SqlDbType转换

返回我的解决方法:

    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!

不幸的是,不是。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
 }

我认为这很难做到,而且这不是最可读的方式。我通过扩展方法来处理这个问题,以帮助全面使用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。它更加清晰易懂,并将所有的解析逻辑封装到扩展方法的幕后。