【问题标题】:The value '' cannot be parsed as the type 'Boolean in Console Application值“”无法解析为控制台应用程序中的“布尔”类型
【发布时间】:2017-12-30 00:48:12
【问题描述】:

我在控制台应用程序中使用 wcf 服务。我想根据帐号检索帐户信息。当我输入帐号时,它可以正常运行,但我在控制台应用程序中出现以下错误。

: '格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:AccountBalanceCheekResult 时出错。 InnerException 消息是“反序列化 System.Boolean 类型的对象时出错。值 '' 不能被解析为类型 'Boolean'。'。有关详细信息,请参阅 InnerException。'

这是课程。

[DataContract]
    public class AccountBalanceRequest : Current_Account_Details
    {
        string account_number;

        [DataMember]
        public string Account_Number
        {
            get { return account_number; }
            set { account_number = value; }
        }
    }
}

这是实现,我在 ADO.NET 代码中没有发现任何错误。

   public AccountBalanceRequest AccountBalanceCheek(AccountBalanceRequest accountNumber)
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                conn.Open();

                var cmd = new SqlCommand("SELECT * FROM Current_Account_Details WHERE Account_Number = '" + accountNumber.Account_Number + "'", conn);


                cmd.CommandType = CommandType.Text;

                var reader = cmd.ExecuteReader();
                //read the result of the execute command.
                while (reader.Read())
                {
                    //assuming that your property is the same as your table schema. refer to your table schema Current_Account_Details

                    accountNumber.Account_Number = reader["Account_Number"].ToString();
                    accountNumber.Account_Creation_Date = reader["Account_Creation_Date"].ToString();

                    accountNumber.Account_Type = reader["Account_Type"].ToString();
                    accountNumber.Branch_Sort_Code = reader["Branch_Sort_Code"].ToString();
                    accountNumber.Account_Fees = reader["Account_Fees"].ToString();
                    accountNumber.Account_Balance = reader["Account_Balance"].ToString();
                    accountNumber.Over_Draft_Limit = reader["Over_Draft_Limit"].ToString();
                }
                return accountNumber;
            }
        }

这是控制台窗口代码。

  public static void Balance()
        {
            MyService.HalifaxCurrentAccountServiceClient currentAccount = new MyService.HalifaxCurrentAccountServiceClient("NetTcpBinding_IHalifaxCurrentAccountService");
            MyService.AccountBalanceRequest cs = new MyService.AccountBalanceRequest();


            string AccountNumber;


            Console.WriteLine("\nEnter your Account Number--------:");
            AccountNumber = Console.ReadLine();
            cs.Account_Number = AccountNumber;
            // MyService.AccountBalanceRequest cs1 = currentAccount.AccountBalanceCheek(AccountNumber);



           if (currentAccount.AccountBalanceCheek(cs))**//Error on this line**
            {

                    Console.WriteLine("Your Account Number is :" + cs.Account_Number);
                    Console.WriteLine("Your Account Type :" + cs.Account_Balance);
                    Console.WriteLine("Your Account Account Fee :" + cs.Account_Fee);
                    Console.WriteLine("Your Account Balance:" + cs.Account_Balance);
                    Console.WriteLine("Your Account Over Draft Limit :" + cs.Over_Draft_Limit);

                    Console.Write("--------------------------");
                    Console.ReadLine();
                    //Console.Clear();


           }

        }

这是我运行应用程序时的屏幕截图。

click here to see the error

【问题讨论】:

  • 这是一个非常基础的问题。您调用的方法不返回 bool,但您正在检查它是否返回 bool

标签: c# wcf ado.net console-application


【解决方案1】:

在你的代码中你有测试

 if (currentAccount.AccountBalanceCheek(cs))

这假定AccountBalanceCheek() 函数返回一个布尔值,但是该函数的签名表明它返回一个AccountBalanceRequest 类型而不是布尔值。

public AccountBalanceRequest AccountBalanceCheek(AccountBalanceRequest accountNumber)

这里有几个选项,要么调整AccountBalanceCheek 以返回布尔值,要么调整 if 函数以进行比较,即

if(currentAccount.AccountBalanceCheek(cs) == someExpectedType)

【讨论】:

  • 我应该输入什么 someExpectedType??
  • 这将取决于您要测试的内容...现在您返回类型为 AccountBalanceRequest 的对象,因此您可以测试它是否为空,以便您可以执行 != null 或者如果您想测试该类中的特定值然后执行此操作。
  • 正如您在控制台代码中看到的,我想根据帐号显示帐户详细信息
  • 只需将if (currentAccount.AccountBalanceCheek(cs)) 更改为if (currentAccount.AccountBalanceCheek(cs) != null)
【解决方案2】:

还有另外一种方法可以处理。

由于您正在从控制台读取帐号,并且如果读取器对象能够找出至少一条记录,则表示具有该号码/id 的帐户存在,否则帐号不存在。

    bool IsExist=false;

    while (reader.Read())
    {
    //into the loop means at least one record found so
    IsExist=true;
    accountNumber.Account_Number = reader["Account_Number"].ToString();
    }
return IsExist;

也改变方法的签名从

public AccountBalanceRequest AccountBalanceCheek(AccountBalanceRequest accountNumber)

public bool AccountBalanceCheek(AccountBalanceRequest accountNumber)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多