2010-11-26 85 views
1

我一直在使用LINQ的工作,現在到SQL一段時間,我從來沒有問題......到現在爲止。我有一個將查詢發送到數據庫的方法,但與其他時間不同,我無法將結果(無論是List還是Array)轉換。方法如下:問題與LINQ to SQL的

public List<vwContainer> GetConteinerPorto(int id) 
{ 
    return (from cont in db.vwContainers 
      where cont.idHarbor == id 
      orderby cont.Year 
      select cont).ToList(); 
} 

我試過了它的一些變體,但總是會出現「指定的轉換無效」的結果。拋出異常。你們能給我點光嗎?

堆棧跟蹤:

[InvalidCastException: Specified cast is not valid.] 
    System.Data.SqlClient.SqlBuffer.get_Int32() +6271252 
    Read_vwCargas_movimentadas_conteiner(ObjectMaterializer`1) +636 
    System.Data.Linq.SqlClient.ObjectReader`2.MoveNext() +42 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +472 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +80 
    WebPortosSEP.Web.Models.PortoRepository.GetConteinerPorto(Int32 id) +867 
    WebPortosSEP.Web.Controllers.PortoController.Cargas(Int32 id) +255 
    lambda_method(Closure , ControllerBase , Object[]) +112 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +258 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 
    System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +125 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709 
    System.Web.Mvc.Controller.ExecuteCore() +162 
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +58 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371 
+1

什麼是確切的錯誤?這會給你一個線索,因爲它將包括它不能投射的類型。 – 2010-11-26 17:19:50

+0

請參閱http://stackoverflow.com/questions/8332060/linq-executequery-error/23949896#23949896。 – admintehran 2014-05-30 08:36:31

回答

4

這可能是因爲在數據庫中的類型的列和.Net類型之間的不匹配。

當從數據庫中讀取像cont.idHarbor和cont.Year字段的值,並轉換成.NET類型所得到的類型可能不匹配在類的那些屬性。

檢查idHarbor是BIGINT數據庫,並把你與一個int比較它。同時檢查年份字段類型。你可以從堆棧跟蹤中找出線索。是由SqlDataReader.GetInt64或任何類似的方法引發的異常?

2

這似乎是cont實際上不是vwContainer

+0

如果是這樣的話,編譯時是否會出現錯誤? – codymanix 2010-11-26 17:21:20

+0

嘗試一下,通過「從vwContainer cont in ...」或「.. select(vwContainer)cont」執行,並明確地將「cont」轉換爲vwContainer。 – VVS 2010-11-26 18:08:50

+0

試過VVS解決方案,但沒有奏效。另外,當我將鼠標懸停時,intelisense說它來自正確的類型。 – 2010-11-26 18:34:56

0

你的方法不包含任何演員。 您確定Exception是從方法內部拋出而不是從其調用位置拋出?

+0

我很確定。我重新安排了很多次,並且還使用了其他表格(可以工作)。 – 2010-11-26 18:35:47

0

試試這個:

public List<vwContainer> GetConteinerPorto(int id) 
{ 
    return (from cont in db.vwContainers 
      where cont.idHarbor == id 
      orderby cont.Year 
      select cont).ToList<vwContainer>(); 
} 
+0

嘗試並收到相同的結果。 – 2010-11-26 18:36:58

0

這是可能的,你改變了數據庫架構(例如進入到一個字符串),並沒有更新DBML(你只會看到在運行時,這個錯誤,當您第一次訪問有錯誤的表)

0

如果它是一個運行時異常而不是編譯tome錯誤,那麼問題幾乎可以肯定的是你的dbml文件在某個級別上與數據庫不同步。當你在同一個命名空間中有多個dbml文件時,我也會遇到類似的問題。

嘗試刪除有問題的表與DBML文件並重新創建它。

UPDATE:

根據您的堆棧跟蹤,我覺得非常可疑了lambda方法內發生的異常,但你所種的是代碼不包括任何lambda表達式。這並不是說可能沒有內部lambda繼續,但我不這麼認爲。

另外請注意,您的堆棧跟蹤包括這樣的:

Read_vwCargas_movimentadas_conteiner

這是從您發佈的代碼不同。

更新2:

的異常在一個Int32轉換,這表明您的數據列中的一個未正確定義存在的。你是否將類型從可爲空改爲不可空?