【问题标题】:Invalid Cast Exception, Stored Procedure, LINQ TO SQL无效的强制转换异常、存储过程、LINQ TO SQL
【发布时间】:2010-11-04 23:12:39
【问题描述】:

9 个月后,同样的问题再次出现。我已经尝试了所有我能想到的:

  • 我在存储过程中转换为 varchar(max);
  • 我更改了映射;
  • 试图找到适用于 linq 的集合,但在任何地方都找不到;

我已经运行这个存储过程有一段时间了,使用 LINQ to SQL 将它映射到我的对象,现在,突然之间,LINQ 试图将字段“值”转换为双精度。


错误:

specified cast is not valid    
   System.Data.SqlClient.SqlBuffer.get_Double()
   System.Data.SqlClient.SqlDataReader.GetDouble(Int32 i)
   Read_Field(ObjectMaterializer`1 )
   System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
   System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
   CmsCsharp.BL.FieldManager.FindContentField(Int32 id_content, Int32 id_fieldType, String fieldName) 

方法

public static Field FindContentField(int id_content, int id_fieldType, string fieldName)
            {
                using (DbBase conn = new DbBase())
                {
                    try
                    {
                        return conn.ClientDB.sprocFindContentField(id_content, id_fieldType, fieldName).Single();
                    }
                    catch (Exception e)
                    {
                        return null;
                    }
                }
            }



[Function(Name = "dbo.sprocFindContentField")]
        public ISingleResult<Field> sprocFindContentField([Parameter(DbType="Int")] System.Nullable<int> id_content, [Parameter(DbType="Int")]System.Nullable<int> id_fieldType, [Parameter(DbType="Varchar(255)")]string fieldName)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), id_content, id_fieldType, fieldName);
            return ((ISingleResult<Field>)(result.ReturnValue));
        }

领域:

public class TextField : Field
{
   private string _Value;

    [Column(Storage="_Value", DbType="VarChar(MAX) NOT NULL", Name="value", CanBeNull=true)]
    public string Value
    { //get and set }
}

程序:

  SELECT 
         type = 'textField',
         fieldLabel.id_fieldEditor,
         fieldLabel.id_fieldType ,
         fieldLabel.description,
         fieldLabel.id ,         
         sessionField.id  AS relationId,
         fieldLabel.name ,
         fieldText.content AS value,
         fieldText.id  AS valueId,
         cf.id as contentRelationId
  FROM
         fieldLabel
  INNER JOIN
         sessionField
  ON
         sessionField.id_fieldLabel = fieldLabel.id
  INNER JOIN
        cms_contentField AS cf
  ON
        cf.id_sessionField = sessionField.id
  INNER JOIN
         fieldText
  ON
         fieldText.id = cf.id_fieldValue
  INNER JOIN
        fieldType
  ON
        fieldLabel.id_fieldType = fieldType.id
  INNER JOIN
        fieldTable
  ON
        fieldTable.id = fieldType.id_fieldTable
  WHERE
         cf.id_content = @id_content
  AND
        fieldTable.id = 1

【问题讨论】:

  • 出于好奇......该错误消息中的哪些内容将您指向了该特定领域?
  • 您能发布您的数据库表的架构吗?
  • Marcg Gravell:因为如果我删除到字段的映射,则不会引发异常。
  • id_fieldEditor int, id_fieldType int, description varchar(1500), id int, relationId int, name varchar(255), value varchar(max), valueId int, contentRelationId int
  • 我只是想知道他为什么要尝试 get_double,而没有双倍的字段...

标签: c# asp.net sql linq-to-sql


【解决方案1】:

我的猜测是您的表中有一个值通过“数字”数据类型触发 SQL Server 的转换。即您的值被转换为不精确的数据类型(浮点数或实数)并导致 LINQ to SQL 尝试双精度数。请参阅SQL Server's help file for int中的注意事项

【讨论】:

  • 我没有将任何字段作为数字。我已经用每个字段的类型对 OP 发表了评论。谢谢
  • 我看到了。但是,如果您阅读该链接,您会看到参数化查询中的某些事务会将 int 转换为数字并因此返回一个数值,由于它是一种不精确的数据类型,因此将被 .Net 处理为 double .
  • 有趣。但我很确定问题出在“值”字段中,因为如果我注释将字段映射到属性的行,则不会引发异常。而且该字段是 varchar(max),所以,我看不出 int 问题在这种情况下如何应用。您是否知道有什么好方法可以准确找出导致问题的字段?
【解决方案2】:

我已将存储过程中的第 9 行更改为 fieldText.content,

SELECT 
     type = 'textField',
     fieldLabel.id_fieldEditor,
     fieldLabel.id_fieldType ,
     fieldLabel.description,
     fieldLabel.id ,         
     sessionField.id  AS relationId,
     fieldLabel.name ,
     fieldText.content AS value, //this line
     fieldText.id  AS valueId,
     cf.id as contentRelationId

然后我相应地更改了映射:

[Column(Storage="_Value", DbType="VarChar(MAX) NOT NULL", Name="content", CanBeNull=true)]
public string Value
{ //get and set }

它成功了!

不知道它为什么起作用。标签(作为值)是否可能是原因?

谢谢

【讨论】:

    【解决方案3】:

    我迟到了,在相同的上下文中出现相同的错误消息。

    问题是我的 Proc Stock 结果中有一个未命名的列。在管理工作室执行它没问题。在我的 dbml 中注册没问题,但在运行时强制转换无效。

    希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多