【问题标题】:C# read boolean from databaseC# 从数据库中读取布尔值
【发布时间】:2018-01-06 20:14:55
【问题描述】:

我正在尝试从数据库中读取一个布尔值(enabled 字段),并使用它来初始化对象。我正在使用数据表:

DataTable dt = new DataTable();
dt.Load(reader);

List<Account> accounts = dt.AsEnumerable().Select(row =>
    new Account
    {
        name = row.Field<string>("user")
        enabled = row.Field<Boolean>("enabled")
    }).ToList();

字段enabled在mysql数据库中被声明为boolean。 在数据库中,enabled 字段定义为:enabled boolean default false,

尝试读取enabled 变量时出现错误:

“System.InvalidCastException”类型的异常发生在 System.Data.DataSetExtensions.dll 但未在用户代码中处理

我在enabled = row.Field&lt;Boolean&gt;("enabled") 行收到错误。 我认为错误是 C# 的布尔数据类型。 当我使用 `enabled = "1".Equals(row.Field("enabled"))` 和 `enabled = row.Field("enabled")==1` 时,我也遇到了同样的问题。如果我用 `enabled = true` 替换它,一切正常。

更新: 数据库连接:

string connString = "SERVER=localhost" + ";" +
                "DATABASE=accs;" +
                "UID=root;" +
                "PASSWORD=root;";
MySqlConnection cnMySQL = new MySqlConnection(connString);

UPDATE2:更详细的错误消息

System.InvalidCastException 未被用户代码处理
HResult=-2147467262 Message=指定的转换无效。
源 = System.Data.DataSetExtensions StackTrace: 在 System.Data.DataRowExtensions.UnboxT`1.NullableField[TElem](对象 价值) 在 System.Data.DataRowExtensions.Field[T](DataRow 行,字符串 columnName) 在 WebApplication5.WebService1.c.b__1_0(DataRow 行)在 WebService1.asmx.cs:第 88 行 在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 在 System.Collections.Generic.List`1..ctor(IEnumerable`1 集合) 在 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源) 在 WebService1.asmx.cs:line 87 InnerException 中的 WebApplication5.WebService1.getUserSentPackages(String userName) 处

【问题讨论】:

  • 启用列的 SQL 数据类型是什么?它可以为空吗?
  • `enabled` boolean default false, ,但表中的所有行都初始化了 enabled 字段。
  • 试试Boolean?。并且您的Account 类的enabled 属性也必须是Boolean?
  • 去哪里试试Boolean?在数据库中还是在 C# 中?
  • MySQL 实际上没有 bool 类型,并将“bool”视为TINYINT 的别名。真正的问题来自不知道这一点的 NET。将;treattinyasboolean=True 添加到您的连接字符串以进行转换

标签: c# mysql datatable boolean


【解决方案1】:

如 cmets 中所述,MySql 中的布尔类型是 TinyInt(1) 的同义词。如果您无法按照建议更改连接字符串,则 C# 中的等效类型为 byte。如果数据库中可能有空值,那么您应该使用byte?(可空字节)。代码是:

enabled = row.Field<byte?>("enabled")==1

【讨论】:

  • 是:An exception of type 'System.ArgumentException' occurred in System.Data.dll but was not handled in user code
  • 我们不知道发生在哪里
  • 这是您的原始连接字符串还是上面建议的新连接字符串?这应该与原始连接字符串一起使用。我建议您在尝试将其放入列表之前进行调试并查看数据表中的值。
  • 如何检查这些值?我也可以自动获取类型吗?
  • 如果您在代码中设置断点,则可以单步执行。填充数据表后,将鼠标悬停在数据表上,您将能够查看值。此外,除非您将它用于其他用途,否则您可以直接从数据阅读器中填充您的列表,数据表可能不是必需的。
【解决方案2】:

我通过以下方式解决了这个问题:

enabled = "1".Equals(row.Field<Object>("enabled").ToString())

如果要检查是否为假,请使用"false" 而不是"1"

enabled = "false".Equals(row.Field<Object>("enabled").ToString())

使用String 代替Object 不起作用!

【讨论】:

  • 这行得通,但它的形式很差。将(实例化)转换为字符串,然后将其与另一个字符串进行比较,感觉很明显,但这是相当多的开销。此外,这种比较读起来并不明显/很好。
猜你喜欢
  • 2011-08-21
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 2016-02-06
相关资源
最近更新 更多