gpt4 book ai didi

c# - Linq 错误 输入字符串的格式不正确。 System.Exception {System.FormatException}

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:10 25 4
gpt4 key购买 nike

当我尝试按字段名 uuid 查找记录时,出现以下错误:

{输入的字符串格式不正确。}

更多注意事项:似乎从 MySQL 解析 ENUM 在 c# 中是个大麻烦

当我改变时它没有错误地工作

public BankAccountReconciled? Reconciled { get; set; }

到:

public string Reconciled { get; set; }

现在,我需要知道如何指示 Linq 将枚举从 Mysql 解析回 C# 枚举:

    public enum BankAccountReconciled
{
[Display(Name = "true")]
True,
[Display(Name = "false")]
False
}

Try/Catch 错误:

{"Input string was not in a correct format."}
- e {"Input string was not in a correct format."} System.Exception {System.FormatException}

当按下 SHIFT+f9 并评估时,我得到以下错误:

"Method System.Data.Entity.Core.Objects.ObjectQuery`1[T] MergeAs(System.Data.Entity.Core.Objects.MergeOption) contains generic parameters"
public XeroBankAccount FindAccountByUuid(String uuid)
{
try
{
using (SyncBankDbContext dbContext = new SyncBankDbContext())
{
string tempUuid = uuid;
var result = dbContext.XeroBankAccounts.SingleOrDefault(x => x.AccountUuid == tempUuid);
return result;
}
}
catch (Exception e)
{
string errorMessage = e.Message;
return null;
}
}

堆栈跟踪:

   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at MySql.Data.Entity.EFMySqlDataReader.ChangeType(Object sourceValue, Type targetType)
at MySql.Data.Entity.EFMySqlDataReader.GetValue(Int32 ordinal)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetUntypedValueDefault(DbDataReader reader, Int32 ordinal)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
at lambda_method(Closure , Shaper )
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__2[TResult](IEnumerable`1 sequence)
at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
at System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression)
at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source, Expression`1 predicate)
at SyncBank.Service.XeroAccountService.FindAccountByUuid(String uuid)

XeroBankAccount.cs:

using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using SyncBank.Xero;

namespace SyncBank.Models
{
[Serializable]
[Table("xero_bank_account")]
public class XeroBankAccount
{

[Key]
[Column("id")]
public int Id { get; set; }

[ForeignKey("XeroOrganisation")]
[Column("organisation_id")]
public int XeroOrganisationId { get; set; }

public XeroOrganisation XeroOrganisation { get; set; }

[Column("bank_id")]
public int? BankId { get; set; }


[Column("title")]
[MinLength(1), MaxLength(128)]
[Required]
public String AccountTitle { get; set; }

[Column("number")]
[StringLength(50)]
public String AccountNumber { get; set; }

[Column("balance_statement")]
public double? BalanceStatement { get; set; }

[Column("balance_xero")]
public double? BalanceXero { get; set; }

[Column("last_statement_date")]
public DateTime? LastStatementDate { get; set; }

[Column("reconciled")]
public BankAccountReconciled? Reconciled { get; set; }

[Required]
[Column("uuid")]
[StringLength(256)]
public string AccountUuid { get; set; }

[Column("orders")]
public int Orders { get; set; }

public override int GetHashCode()
{
return Id.GetHashCode();
}

public override bool Equals(Object obj)
{
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(obj is XeroBankAccount))
{
return false;
}
XeroBankAccount other = (XeroBankAccount)obj;
return Id == other.Id;
}

public override String ToString()
{
return "org.syncbank.entity.XeroBankAccount[ accountId=" + Id + " ]";
}
}
}

SQL xero_bank_account:

CREATE TABLE `xero_bank_account` (
`id` int(11) NOT NULL,
`organisation_id` int(11) NOT NULL,
`bank_id` int(11) DEFAULT NULL,
`title` varchar(128) NOT NULL,
`number` varchar(50) DEFAULT NULL,
`balance_statement` decimal(12,2) DEFAULT NULL,
`balance_xero` decimal(12,2) DEFAULT NULL,
`reconciled` enum('true','false') NOT NULL DEFAULT 'false',
`last_statement_date` datetime DEFAULT NULL,
`uuid` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`orders` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `xero_bank_account`
--
ALTER TABLE `xero_bank_account`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `account_uuid` (`uuid`),
ADD KEY `account_title_caption` (`number`),
ADD KEY `bank_id` (`bank_id`);

最佳答案

异常是因为你将 mysql enum 值保存为字符串 true, false 而这在 c# 中未被 enum 解析,因此出现错误。

所以如果可能的话,像这样更改 MySQL 中的枚举

`reconciled` enum(1,0) NOT NULL DEFAULT 0

然后将您的 C# 枚举成员值设置为 0,1 就像

public enum BankAccountReconciled
{
[Display(Name = "true")]
True = 1, //<= Set 1 for true that equivalent to mysql enum value 1
[Display(Name = "false")]
False = 0 //<= Set 0 for false that equivalent to mysql enum value 0
}

编辑:

一种方法是让你的 mysql 枚举保持原样

`reconciled` enum('true','false') NOT NULL DEFAULT 'false',

并将您的类属性数据类型保持为 string

public string Reconciled { get; set; }

并根据 mysql 枚举保留你的 c# 枚举

public enum BankAccountReconciled
{
[Display(Name = "true")]
True,
[Display(Name = "false")]
False
}

现在只需向您的类对象添加一个属性,即可将您的string 转换为enum,如

public BankAccountReconciled EnumReconciled
{
get
{
return GetEnumValue<BankAccountReconciled>(Reconciled);
}
}

上面的属性需要一个可以将字符串转换为枚举的辅助函数

public static T GetEnumValue<T>(string str) where T : struct, IConvertible
{
Type enumType = typeof(T);
if (!enumType.IsEnum)
{
throw new Exception("T must be an Enumeration type.");
}
T val;
return Enum.TryParse<T>(str, true, out val) ? val : default(T);
}

输出:(来自调试器)

enter image description here

关于c# - Linq 错误 输入字符串的格式不正确。 System.Exception {System.FormatException},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54365123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com