【问题标题】:How to read Yes/No value as boolean from an Access database?如何从 Access 数据库中读取是/否值作为布尔值?
【发布时间】:2012-01-20 11:50:07
【问题描述】:

帮助我以布尔格式从 MS 访问中检索 YES/NO 数据类型。

我尝试解析它,但它总是返回 false。

更新:实际上没有问题
抱歉,它确实接受 YES/NO 作为布尔值。

OleDbconnection dbConnect = new OleDbConnection(".....*.MDB");
dbConnect.Open();
.....
...
//xyz = dbCommand.ExecuteReader()
bool value = (bool)xyz[1];

下次我会研究更多并在询问之前发现小错误..对不起人们

【问题讨论】:

  • 它是布尔值并保持布尔值。
  • 你能展示你尝试过的东西吗(更具体地说是你的代码)?

标签: c# .net wpf ms-access


【解决方案1】:

希望最终能解决这个问题:

  1. Access 数据库引擎使用什么来表示Yes/TrueNo/False 的内部表示无关紧要。我们返回一个System.Boolean 值。

  2. 在 Access 中,Yes/No 字段为 Yes/TrueNo/FalseNULL 的值为No/False

测试数据:

测试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;

namespace oleDbTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string myConnectionString;
            myConnectionString =
                    @"Provider=Microsoft.ACE.OLEDB.12.0;" +
                    @"Data Source=C:\Users\Public\Database1.accdb;";

            using (var con = new OleDbConnection())
            {
                con.ConnectionString = myConnectionString;
                con.Open();

                using (var cmd = new OleDbCommand())
                {
                    // just to be sure, let's force one of the values to Null
                    cmd.Connection = con;
                    cmd.CommandText =
                            "UPDATE YesNoTable SET YesNoField = NULL " +
                            "WHERE Description = 'Null'";
                    cmd.ExecuteNonQuery();
                }

                using (var cmd = new OleDbCommand())
                {
                    cmd.Connection = con;
                    cmd.CommandText =
                            "SELECT ID, YesNoField, Description FROM YesNoTable";
                    OleDbDataReader rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {
                        Console.WriteLine(String.Format("Row {0}:", rdr["ID"]));
                        bool boolValue = Convert.ToBoolean(rdr["YesNoField"]);
                        Console.WriteLine(String.Format("    Description is: {0}", rdr["Description"]));
                        Console.WriteLine(String.Format("    Return type is: {0}", rdr["YesNoField"].GetType()));
                        Console.WriteLine(String.Format("    raw value is: {0}", rdr["YesNoField"]));
                        Console.WriteLine(String.Format("    boolValue is: {0}", boolValue));
                        Console.WriteLine();
                    }
                }
                con.Close();
            }
            Console.WriteLine("Done.");
        }
    }
}

结果:

Row 1:
    Description is: Yes
    Return type is: System.Boolean
    raw value is: True
    boolValue is: True

Row 2:
    Description is: No
    Return type is: System.Boolean
    raw value is: False
    boolValue is: False

Row 3:
    Description is: Null
    Return type is: System.Boolean
    raw value is: False
    boolValue is: False

Done.

【讨论】:

    【解决方案2】:

    问题是.Net的布尔值被定义为

    0 = false
    1 = true
    

    但 MS Access 使用以下值作为其布尔值

    0 = false
    -1 = true
    

    所以你必须手动将这个整数值转换成对应的布尔值。

    【讨论】:

      【解决方案3】:
      false = 0
      true = !false
      

      这就是你需要知道的一切。

      【讨论】:

        【解决方案4】:
        if (Convert.ToBoolean(ds.Tables[0].Rows[i]["UseCurrInWords"].ToString()))
            chkBobUseCurrencyInWords.Checked = true;
        

        【讨论】:

        • 来自审核队列:我可以请求您在您的答案周围添加更多上下文。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者都有帮助。
        【解决方案5】:

        ms 访问可能是 .mdb 文件或 .accdb。

        用调试器观察返回的值。

        我的猜测是 true 是 == 0,而 False 是 !=0。

        【讨论】:

          【解决方案6】:

          据我记得,是/否实际上是 1 或 -1 的数字,其中 1 为真。

          每个 Remou 的更正... 0 = false,-1 = true.. 我上次使用 Access 大约是 2005 年,所以我并不完美 :)

          【讨论】:

          • @Remou,对此感到抱歉......我最后一次使用 access 是在 2005 年左右,但至少我记得它不是像“YES”或“NO”这样的字符串,或其他可枚举的:)
          猜你喜欢
          • 2020-12-03
          • 2011-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-27
          • 2012-08-18
          • 1970-01-01
          相关资源
          最近更新 更多