【问题标题】:Error in C# using LINQ to SQL and sqlmetal System.InvalidCastException: Specified cast is not valid使用 LINQ to SQL 和 sqlmetal System.InvalidCastException 的 C# 中的错误:指定的强制转换无效
【发布时间】:2013-03-07 13:44:34
【问题描述】:

在我们的生产服务器或其他开发人员机器上运行我编写的一些代码时,它会在这一行崩溃。

Ac_CalcDetail xy = db.Ac_CalcDetails.Where(chld => chld.CalcIdent.Equals(CalcIdent)).First();

CalcIdent 只是一个字符串形式的 guid。

我在我的本地数据库上运行了 sqlmetal,其中 Ac_CalcDetail 是我们的主表,以创建这个强类型代码和 Ac_CalcDetail 类。问题是当我在生产服务器或其他开发人员的一台机器上运行代码时。我们已经使用 LINQ 一年多了,从来没有遇到任何问题,所以对此感到非常困惑。以前我得到的异常非常具体,说哪个字段丢失了,哪个很棒,但从我的研究来看,这个错误显然可能是某个字段具有错误的数据类型。噩梦,完全不可能通过这个错误进行调试。

我认为目前唯一的解决方案是在 SQL Server Management Studio 中备份我的数据库,然后让其他人使用它。由于我们是一家小公司,我们倾向于对我们自己的数据库做任何我们想做的事情,然后创建各种 SQL 脚本放在一个保管箱文件夹中以使我们的数据库同步(或者至少我们认为是同步的)。不确定这是否意味着我们要么必须停止使用 LINQ,要么开始使用一些更高级的 SQL 东西(SQL 存储库或 SQL 数据库比较工具等)。

这很奇怪,因为我知道我们的数据库已经很久没有完全一样了(如果有的话)所以不知道为什么现在会发生这个错误以及为什么错误消息没有说明任何内容!

【问题讨论】:

  • Ac_CalcDetails是什么类型,CalcIdent是什么类型?
  • 在 CalcIdent 上方的 C# 代码行中是一个字符串。在数据库中它是一个唯一标识符。我认为这不是问题,因为当其他开发人员使用我的数据库时它很好。 Ac_CalcDetails 和 Ac_CalcDetail 由 sqlmetal 生成(非常聪明,它知道如何从行类的表名中删除“s”)。将进入调试器让您确切知道
  • Ac_CalcDetails 是一个使用泛型的表,类型为 System.Data.Linq.Table 这一切都是由使用 sqlmetal 的脚本自动创建的。因此,在另一台开发人员机器上,它会生成此错误,但可以通过以下方式修复它:a)给他我的数据库的备份,然后他将其恢复,并改用这个数据库 b)让他在他的本地数据库上运行 sqlmetal。但是当他签入新代码时,我得到了同样的错误
  • 您是否能够在输入/输出工作/不工作时追踪它(当它不工作时输出可能会很棘手!) - 听起来像是基于使用 sql 的人的细微变化工具最后。
  • 包含导致此的代码。我怀疑你的错误在这里 .Equals(CalcIdent) 因为它似乎是一个类而不是一个字符串,所以转换失败,但很难从一行代码中分辨出来。

标签: c# asp.net sql linq sqlmetal


【解决方案1】:

改变

Ac_CalcDetail xy

变量 xy

比尝试调试它。但很明显,您似乎弄错了一些类型。

【讨论】:

  • 干杯 Yahya,我认为你在那儿有所作为。老实说,我不确定为什么我一直没有使用匿名类型。我现在将使用导致它崩溃的相同数据库再次单步执行我的代码,但使用“var”代替任何类,如 ac_calcDetails,看看会发生什么。会回复欢呼
  • 我在运行此代码var xyz = from cd in db.Ac_CalcDetails where cd.CalcIdent.Equals(CalcIdent) select cd;var xy = xyz.First(); 时得到完全相同的异常.First() 上发生相同的异常非常奇怪,因为当我检查xyz.First(); 它是一个类型为 {e2Linq.Ac_CalcDetail} 的类看起来它应该对我有用
  • 如果有帮助,即使只是在调试器中调用xyz.First(); 也会得到'xyz.First()' threw an exception of type 'System.InvalidCastException' e2Linq.Ac_CalcDetail {System.InvalidCastException}
  • @Buswell 你为什么不试试这样的 Ac_CalcDetail xy = db.Ac_CalcDetails.FristOrDefault(chld => chld.CalcIdent.Equals(CalcIdent));
  • Cheers Yahya,但 Ac_CalcDetail xy = db.Ac_CalcDetails.FirstOrDefault(chld => chld.CalcIdent.Equals(CalcIdent)); 行仍然抛出相同的异常 Specified cast is not valid.
猜你喜欢
  • 2013-08-27
  • 2012-01-15
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多