【问题标题】:What is the correct way to convert a value that is bit in Sql to Int in C#将Sql中的位值转换为C#中的Int的正确方法是什么
【发布时间】:2013-09-20 16:40:06
【问题描述】:

问题:将 Sql 中的位值转换为 C# 中的 Int 的正确方法是什么?

目标: 使用Sql2008R2 和C#,将值转换为整数以插入另一个表。

错误:以下代码返回此错误。输入字符串的格式不正确。

    public struct Mystruct
    {
        public Int32 Active
    }

    public static bool ReturnActivity
    {
        String sql = "";

       {
           conn.Open();

           sql = "SELECT " +
                     "database.dbo.table1.Active " +
                 "FROM " +
                     "database.dbo.tabe1 ";

           SqlCommand cmd = new SqlCommand(sql, conn);

           SqlDataReader dr = cmd.ExecuteReader();
           while (dr.Read())
           {
                MyStruct ReturnActivity = new MyStruct();

                ReturnActivity.Active = Convert.ToInt32(dr.GetValue(0).ToString());

                SomeArraylist.Add(MyStruct);

           }

                dr.Close();
                conn.Close();

                return true;
     }

提前感谢您提供任何 cmets、建议或建议。

【问题讨论】:

  • 在哪里此代码中发生的错误?您是否已调试以查找值是什么?
  • 错误发生在“ReturnActivity.Active = Convert...”它没有生成值
  • 您的列可以为空吗?如果是这样,并且您没有转换为可为空的 int (int?),那么您一定会遇到异常。
  • 你的错误到底是什么?
  • @TristanDescartes 将GetValue() 更改为GetBoolean(0),同时删除ToString(),您应该已经设置好了。

标签: c# sql converter


【解决方案1】:

使用GetBoolean方法将位列的值作为bool返回:

ReturnActivity.Active = dr.GetBoolean(0) ? 1 : 0;

请注意,?…:ternary operator。它将计算 ? 左侧的布尔表达式,如果是 true,则返回 : 左侧的值,如果是 false,则返回 : 右侧的值.

这大致相当于:

if (dr.GetBoolean(0))
{
    ReturnActivity.Active = 1;
} else {
    ReturnActivity.Active = 0;
}

【讨论】:

  • 谢谢 GetBoolean 正是我所缺少的
【解决方案2】:

我假设是这条线

ReturnActivity.Active = Convert.ToInt32(dr.GetValue(0).ToString());

那是失败的。它失败了,因为GetValue 返回一个object,并且在对象上调用ToString(注意它的底层类型是bool 类型)返回"True""False",而不是0 或@您在 sql 中看到的 987654330@。使用GetBoolean 将其获取为 bool 类型,然后检查返回值是否为 0 或 1:

ReturnActivity.Active = dr.GetBoolean(0) ? 0 : 1;

另外,有一个东西叫做Verbatim String,而不是这个:

sql = "SELECT " +
      "database.dbo.table1.Active " +
      "FROM " +
      "database.dbo.tabe1 ";

你可以这样做:

sql = @"SELECT 
            database.dbo.table1.Active
        FROM
            database.dbo.tabe1";

这更容易查看和维护。

【讨论】:

    【解决方案3】:

    通常,当您从 SQL 数据库中提取 BIT 值时,您使用 GetBoolean() 而不是简单的 GetValue()。然后,您可以简单地将布尔值传递给 Convert.ToInt32(bool b) 而不是字符串。这将相应地返回 0 或 1。

    不需要先转成字符串再转回int。

    【讨论】:

    • 这是有道理的,我接受了你的建议并放弃了 ToString
    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多