2017-03-09 50 views
-1

我剛剛從JAVA轉到C#(只是爲了獲得一些經驗),我試圖從數據庫中獲取一些數據。c#linq從表中獲取值的代碼不起作用

該數據庫包含一個名爲USERS和列USER(串)和POINTS(INT)

現在我試圖用LINQ數據上下文和使用的方式之一,選擇一個表的表,但它不」出於某種原因將不起作用......

private int getUserPoints(string nickname) 
{ 
    int points = 0; 
    try { 
     var p = from r in db.USERs 
        where r.USER1 == nickname 
        select r.POINTS; 

     points = p.First(); 
    } catch (Exception e){ 
     Console.WriteLine(e.Message); 
    } 
    return points; 
} 

錯誤扔到p.First();

System.InvalidOpe rationException:序列不包含任何元素

你能幫我解決這個問題嗎?我仍然在學習c#,並且我知道我在前進一點,但是我正在嘗試做一些有趣的事情,需要數據庫通信。

謝謝!

這個異常處理是否正確?我對這種方式的提示感到高興。

更新:
我相信我配置了它,我創建了一個LINQ to SQL CLASS,並將表拖入它。

然後我初始化這樣的背景下:

linkToSqlClassDataContext db = new linkToSqlClassDataContext(
          Properties.Settings.Default.pointsGambleConnectionString); 
+6

它究竟如何不起作用?你有什麼例外? –

+1

你配置了linq類的數據庫嗎? – BugFinder

+2

在您的答案中發佈例外文本。最好發佈* full *異常,包括調用堆棧和內部異常。就像記錄Exception.ToString()的結果一樣簡單' –

回答

3

,如果你得到這樣的:System.InvalidOperationException異常就意味着你不能在一個空的收集調用First()

你可以解決這個問題,通過使用FirstOrDefault這可能會導致的0的分配(int默認值)points你的情況。

我想你需要弄清楚爲什麼你不能找到任何條目where r.USER1 == nickname

作爲一個側面說明,這將是推薦用來使用using塊,這樣連接會得到所需要的值後正確關閉:

private int getUserPoints(string nickname) 
{ 
    using (linkToSqlClassDataContext db = new linkToSqlClassDataContext(Properties.Settings.Default.pointsGambleConnectionString)) 
    { 
     var p = from r in db.USERs 
       where r.USER1 == nickname 
       select r.POINTS; 

     return p.FirstOrDefault(); 
    } 
} 

調用此方法時,您可以使用try/catch塊:

int points = 0; 
try 
{ 
    points = getUserPoints("yourname"); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.Message); 
} 
+0

謝謝大家,幫了很大忙,還發現了這個愚蠢的問題,暱稱沒有收到正確的字符串(我只是使用了一些更多不同的庫,我確信它收到了一個我雖然),並感謝提示以及! – user2852371

+1

@ user2852371歡迎您。如果你收到一個空集合,通常過濾是問題;)(根據我的經驗,至少) –