我有一個異步任務方法,用于查詢資料庫表中特定列中的 Credits 總量。我在用于查詢的方法中有一個字串引數,用于識別登錄的用戶,該引數存盤在Properties.Settings.Default.Student_Number;. 資料庫中學生編號的列是一個 varchar 并且我的代碼中的其他任何地方都是一個字串,但我收到一個例外說Input string was not in correct format. 知道我做錯了什么
private async Task<int> Count_Credits(string student_number)
{
int count = 0;
string sql = "SELECT SUM(Module_Credit) AS TOTAL_CREDITS FROM Module_Data WHERE Student_Number=@num";
using (var conn = new SqlConnection(connString))
using (var cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.Add("@num", SqlDbType.VarChar, 55).Value = student_number;
await conn.OpenAsync();
count = int.Parse(cmd.ExecuteScalar().ToString());
}
return count;
}
我如何呼叫方法
Task<int> count_credits = Count_Credits(Student_Number);
module_info.Total_Credits = await count_credits; //Exception Goes to this line
我在標簽上使用系結
module_info.Total_Credits
uj5u.com熱心網友回復:
ExecuteScalar在轉換型別之前,您需要檢查是否回傳了結果。
object result = cmd.ExecuteScalar();
if(result != null)
{
count = (int)result;
}
要進行更簡潔的檢查,請使用模式匹配(根據 Olivier 的評論):
if(cmd.ExecuteScalar() is int i)
{
count = i;
}
此外,您應該await在獲取值時使用方法本身:
int count_credits = await Count_Credits(Student_Number);
module_info.Total_Credits = count_credits;
uj5u.com熱心網友回復:
回傳的結果ExecuteScalar將是 anint或 be null。此外,不需要通過字串進行往返。但我們必須檢查null.
最近版本的 C# 中引入了模式匹配,允許在許多情況下使用更簡潔的代碼:
count = cmd.ExecuteScalar() is int i ? i : 0;
如果標量是裝箱int物件,它將被強制轉換int并分配給新變數i,is運算式的結果將為true. 我們在三元運算式中使用此結果來確定最終結果。
還有一種可能:
count = (cmd.ExecuteScalar() as int?) ?? 0;
如果as轉換成功,則運算子將輸入轉換為所需型別,否則回傳null。因此目標型別必須可以為空。因此我們指定int?(= Nullable<int>) 作為目標型別。我們使用空合并運算子??轉換null為0.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/341582.html
上一篇:如何更改在回圈內宣告的變數?
下一篇:C#串列排序與OR條件
