【问题标题】:C# Parse SqlDbType ConversionC# 解析 SqlDbType 转换
【发布时间】:2013-06-26 10:47:46
【问题描述】:

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

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

【问题讨论】:

  • dtbDataTable.Rows[0]["Id"]的值是多少?
  • “Id”实际上是一个数据类型标识符,还是你想弄清楚 Id 列的数据?
  • 能否解释一下为什么要将["Id"]字段输出到SqlDbType类型的枚举中?如果这已经是一个整数,你不想做 Int.Parse(dtbDataTable.Rows[0]["Id"].ToString()) 还是干脆 (int)dtbDataTable.Rows[0]["Id"] ?
  • 它不是类型化的DataTable,因为它是动态的...Id 包含一个像150 这样的数字
  • @saamorim,我不想让任何数据的转换错误发生在存储过程中,因为我不知道哪一列的类型错误,所以我想在设置时间进行tryparse

标签: c# parsing casting type-conversion sqldbtype


【解决方案1】:

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

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

【讨论】:

  • 这是解决我的问题的好方法@Omada,我在我的框架中使用它来做其他事情,但由于有时存在很多参数,它会降低一点性能
  • 如果存在某种不进行解析和切换案例的方式,它会更好看
【解决方案2】:

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

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

【讨论】:

  • 它不仅适用于 Int,有多种数据类型@Joe,这个解决方案看起来特定于 Int/Tinyint 类型
  • 这个例子是的,所以你会有一个 GetXFromSqlY() 扩展方法的库。我们大约有 15 个左右。
【解决方案3】:

发回我的解决方法:

    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;
        }
    }

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2020-03-31
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多