首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#解析SqlDbType转换

C#解析SqlDbType转换
EN

Stack Overflow用户
提问于 2013-06-28 23:36:16
回答 3查看 4.2K关注 0票数 2

有没有办法做到这一点:

代码语言:javascript
复制
(SqlDbType.Int).Parse(dtbDataTable.Rows[0]["Id"])
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-05 21:03:07

发回我的解决方法:

代码语言:javascript
复制
    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;
        }
    }

谢谢!

票数 2
EN

Stack Overflow用户

发布于 2013-06-28 23:47:08

不幸的是,没有。SqlDbType是一个枚举,所以(SqlDbType.Int)实际上归结为一个整数值,而不是一个类型。我能想到的唯一方法是使用某种switch语句:

代码语言:javascript
复制
switch (SqlDbType dbType)
{
    case SqlDbType.Int:
       int value = Int32.Parse(dtbDataTable.Rows[0]["Id"]);
       //Do stuff with this value
    //repeat for other types
 }
票数 0
EN

Stack Overflow用户

发布于 2013-06-28 23:50:15

我认为这很难做到,而且也不是最具可读性的方式。我通过扩展方法来处理这个问题,以全面地帮助处理TinyInt、SmallInt和可空的值。例如:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17368482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档