Недопустимое исключение приведения, хранимая процедура, LINQ TO SQL - PullRequest
1 голос
/ 22 июня 2009

9 месяцев спустя та же проблема появляется снова. Я перепробовал все, что мог придумать:

  • Я применяю как varchar (max) для хранимой процедуры;
  • Я изменил отображение;
  • попытался найти коллекцию, с которой работает linq, но нигде не смог найти;

Я уже некоторое время выполнял эту хранимую процедуру, сопоставляя ее с моими объектами, используя LINQ to SQL, и теперь LINQ внезапно пытается преобразовать поле 'value' в double.


ошибка:

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

Ответы [ 3 ]

1 голос
/ 23 июня 2009

Я предполагаю, что в вашей таблице есть значение, которое запускает преобразование SQL Server через «числовой» тип данных. т. е. ваше значение преобразуется в неточный тип данных (с плавающей запятой или в вещественное число) и заставляет LINQ to SQL предпринять попытку удвоения. См. Предостережение в файле справки SQL Server для int

0 голосов
/ 06 сентября 2016

Я опаздываю с тем же сообщением об ошибке в том же контексте.

Проблема в том, что в моем результате в Proc Stock произошла ошибка. Нет проблем извинить это в студии управления. Нет проблем с регистрацией в моем dbml, но неверное приведение во время выполнения.

Надеюсь, что поможет

0 голосов
/ 17 марта 2010

Я изменил 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 }

и это сработало!

Понятия не имею, почему это работает. Может ли маркировка (как значение) быть причиной?

Спасибо

...