none
Linq to SQL query丟FormatException,不知道該如何除錯 RRS feed

  • 問題

  •     using(var db = new GovDoc.ADDBpPDMDataContext(ChkPresdoc.Settings.DB)) {
         db.Log = Console.Out;
         var q異常presdoc = db.PRESDOC.Where(i =>
          i.Pre_No.Length == 17 && i.Pre_No.CompareTo("201104") > 0 && i.cont == "1" && i.Stat == '1'
          && i.SDEP_id == "888" && i.RDEP_id == "888"
          && i.ORD == db.PRESDOC.Where(j => j.Pre_No == i.Pre_No).Max(j => j.ORD));
         foreach(var 異常presdoc in q異常presdoc) {
          //...
         }
        }
    
    

    執行時在foreach那行會發生FormatException

    Exception.ToString()如下:

     

    System.FormatException: 字串長度必須剛好一個字元。
      於 System.Convert.ToChar(String value, IFormatProvider provider)
      於 System.String.System.IConvertible.ToChar(IFormatProvider provider)
      於 System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
      於 System.Data.Linq.DBConvert.ChangeType(Object value, Type type)
      於 Read_PRESDOC(ObjectMaterializer`1 )
      於 System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
      於 ChkPresdoc.Program.Main(String[] args) 於 \\tsclient\D\work\ChkPresdoc\Program.cs: 行 16
    DataContext.Log如下:
    SELECT [t0].[Pre_No], [t0].[ORD], [t0].[cont], [t0].[Stat], [t0].[SDEP_id], [t0].[SUSR_id], [t0].[SDate], [t0].[RDEP_id], [t0].[RUNIT_id], [t0].[RUSR_id], [t0].[RDate], [t0].[ODate], [t0].[Sign], [t0].[SecrMark], [t0].[ABC_mark], [t0].[T_Co
    nt], [t0].[P_Cdept], [t0].[P_Cunit], [t0].[Chk], [t0].[Bak_Sor]
    FROM [dbo].[PRESDOC] AS [t0]
    WHERE (LEN([t0].[Pre_No]) = @p0) AND ([t0].[Pre_No] > @p1) AND ([t0].[cont] = @p2) AND (UNICODE([t0].[Stat]) = @p3) AND ([t0].[SDEP_id] = @p4) AND ([t0].[RDEP_id] = @p5) AND ([t0].[ORD] = ((
      SELECT MAX([t1].[ORD])
      FROM [dbo].[PRESDOC] AS [t1]
      WHERE [t1].[Pre_No] = [t0].[Pre_No]
      )))
    -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [17]
    -- @p1: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [201104]
    -- @p2: Input VarChar (Size = 1; Prec = 0; Scale = 0) [1]
    -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [49]
    -- @p4: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [888]
    -- @p5: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [888]
    -- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.30729.5420
    

    從以上資訊,看不出是哪裡發生問題造成FormatException? >_<

    請問可有大大看得出錯誤原因 或指點一下我該去哪裡找問題

    多謝指教

     

    2011年4月19日 上午 03:31

解答

  • 找到原因在此:

    http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/ac91e587-6e91-454c-9fa2-bab20b7a258c

    • 已標示為解答 SoftStone 2012年3月23日 上午 03:19
    2011年5月31日 上午 10:41

所有回覆

  • 請問你下列這句SQL拿到SSMS裡面可以正常執行嗎?

    SELECT [t0].[Pre_No], [t0].[ORD], [t0].[cont], [t0].[Stat], [t0].[SDEP_id], [t0].[SUSR_id], [t0].[SDate], [t0].[RDEP_id], [t0].[RUNIT_id], [t0].[RUSR_id], [t0].[RDate], [t0].[ODate], [t0].[Sign], [t0].[SecrMark], [t0].[ABC_mark], [t0].[T_Co
    nt], [t0].[P_Cdept], [t0].[P_Cunit], [t0].[Chk], [t0].[Bak_Sor]
    FROM [dbo].[PRESDOC] AS [t0]
    WHERE (LEN([t0].[Pre_No]) = @p0) AND ([t0].[Pre_No] > @p1) AND ([t0].[cont] = @p2) AND (UNICODE([t0].[Stat]) = @p3) AND ([t0].[SDEP_id] = @p4) AND ([t0].[RDEP_id] = @p5) AND ([t0].[ORD] = ((
     SELECT MAX([t1].[ORD])
     FROM [dbo].[PRESDOC] AS [t1]
     WHERE [t1].[Pre_No] = [t0].[Pre_No]
     )))
    


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年4月19日 上午 05:53
  • ㄟ...不知道有沒有誤會大大的意思

    是指直接複製那段select statement到SQL Server Management Studio裡新增查詢去執行嗎

    當然是不行

    因為沒有宣告@p0、@p1等這些變數 ^^"

    2011年4月19日 上午 06:15
  • ㄟ...不知道有沒有誤會大大的意思

    是指直接複製那段select statement到SQL Server Management Studio裡新增查詢去執行嗎

    當然是不行

    因為沒有宣告@p0、@p1等這些變數 ^^"

    你可以透過類似下列的方式取得LINQ TO SQL幫你轉的TSQL命令及參數,再拿到SSMS去執行看是否會有在AP遇到的錯誤訊息。

    Using nw As New NWDataContext()
          Dim query = From p In nw.Region _
                Where p.RegionID = 1 _
                    Select p
          For Each item As Region In query
            Console.WriteLine(String.Format("{0},{1}", item.RegionID.ToString(), item.RegionDescription))
          Next
          Console.WriteLine(nw.GetCommand(query).CommandText)
          For Each p As System.Data.Common.DbParameter In nw.GetCommand(query).Parameters
            Console.WriteLine(String.Format("{0},{1}", p.ParameterName, p.Value))
          Next
        End Using


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年4月19日 上午 08:18
  • 我有裝QueryVisualizer

    所以可以設中斷點在debug時看到完整的select statement

    複製去SSMS執行沒有錯誤訊息

    但有一個關鍵是

    目前並沒有符合的record

    在沒有符合的record的情況下

    執行我的程式也不會有Exception

    所以我猜問題是發生在SQL server撈到record

    交給LINQtoSQL/ADO.NET轉成entity的這個過程中

    但到底是什麼問題還是猜不出來 orz

     

    另一個疑問順便請教

    我那個table裡有一個欄位叫[cont],是varchar(2)

    為什麼LINQtoSQL產出的where clause中關於這個欄位的部份卻是

    ([t0].[cont] = 1) 而不是 ([t0].[cont] = '1') 啊?

    完整select statement如下:

    SELECT [t0].[Pre_No], [t0].[ORD], [t0].[cont], [t0].[Stat], [t0].[SDEP_id], [t0].[SUSR_id], [t0].[SDate], [t0].[RDEP_id], [t0].[RUNIT_id], [t0].[RUSR_id], [t0].[RDate], [t0].[ODate], [t0].[Sign], [t0].[SecrMark], [t0].[ABC_mark], [t0].[T_Cont], [t0].[P_Cdept], [t0].[P_Cunit], [t0].[Chk], [t0].[Bak_Sor]
    FROM [dbo].[PRESDOC] AS [t0]
    WHERE (LEN([t0].[Pre_No]) = 17) AND ([t0].[Pre_No] > '201104') AND ([t0].[cont] = 1) AND (UNICODE([t0].[Stat]) = 49) AND ([t0].[SDEP_id] = '888') AND ([t0].[RDEP_id] = '888') AND ([t0].[ORD] = ((
      SELECT MAX([t1].[ORD])
      FROM [dbo].[PRESDOC] AS [t1]
      WHERE [t1].[Pre_No] = [t0].[Pre_No]
      )))
    

    2011年4月20日 上午 02:42
  • 找到原因在此:

    http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/ac91e587-6e91-454c-9fa2-bab20b7a258c

    • 已標示為解答 SoftStone 2012年3月23日 上午 03:19
    2011年5月31日 上午 10:41