2009-08-31 78 views
0

首先我首先讓我說我沒有完全理解Linq。我試圖動態查詢數據庫,第一個查詢使用LINQ-SQL的正常工作,但第二個動態調用是在運行時有什麼失敗Linq Select * from Table ExecuteQuery

public void getTables() 
    { 
     foreach (var c in dc.GetTable<TableListing>()) 
     { 
      List<TableData> res = tableBrowse(c.TableName); 
     }     
    } 

public List<TableData> tableBrowse(string tablename) 
    { 
     string sql = "Select * from " + tablename; 
     var results = dc.ExecuteQuery<TableData>(sql); 
     return results.ToList(); 
    } 

public class TableData 
    { 
     public int Time { get; set; } 
     public string Value { get; set; } 
    } 

我查詢的「主表」,這檢索列表要查詢的表格。它們都具有與TableData類中定義的相同的結構。我得到一個關於Specified cast的運行時錯誤無效。我並沒有真正在尋找代碼,因爲我正在尋找我做錯了什麼以及如何解決它。謝謝。

回答

1

您沒有明確地將返回值從dc.ExecuteQuery<TableData>(sql)轉換爲您定義的TableData類型。我期望ExecuteQuery抱怨,因爲它不知道TableData類型是什麼。

ExecuteQuery幫助程序需要返回數據庫中定義的DBML(LINQ-to-SQL生成)類型。

但我建議你不要走這條路。如果你想從表中獲取記錄,比如客戶,只需使用content.Customers - LINQ-to-SQL的意義在於它已經包含了所有這些訪問器以節省您的時間。

2

您可能會嘗試使用ColumnAttributes裝飾您的類屬性,指定列名稱和類型,以便LINQ to SQL知道如何將列數據的版本執行到屬性。您可能還需要設置其他屬性以使其正常工作。我還會在SQL中指定列名稱而不是使用*。將列名與您的屬性出現在類中的順序相同,因爲我相信它按照與定義屬性相同的順序處理結果值。不確定它會不會起作用,但基本上你正在重新創造設計師會爲你做的事情。

public List<TableData> tableBrowse(string tablename) 
{ 
    string sql = "Select [time], [value] from " + tablename; 
    var results = dc.ExecuteQuery<TableData>(sql); 
    return results.ToList(); 
} 

public class TableData 
{ 
    [Column(Name="Time", DbType="DateTime NOT NULL", ...)] 
    public int Time { get; set; } 

    [Column(Name="Value", DbType="VARCHAR(255) NOT NULL", ...)] 
    public string Value { get; set; } 
} 
+0

不幸的是,我嘗試了你所說的話,它對演員例外沒有幫助。 – mcauthorn 2009-08-31 13:52:52

0

其實我發現了什麼問題,我缺少一個表定義。其中一個表中有第三種數據類型。一旦我定義了這個表類並檢查了它的數據類型,它就可以正常工作。令人遺憾的是,編譯器並沒有給出太多錯誤信息。

相關問題