我想從“產品”表中讀取所有記錄并從每個記錄創建物件。它只從資料庫中獲取一條記錄,任何想法可能會有所幫助?
public IReadOnlyList<Product> Search(string name)
{
var result = new List<Product>();
using (var conn = new SqlConnection(connectionString))
{
if (name == null)
{
var command = new SqlCommand("SELECT * FROM Product ", conn);
conn.Open();
using var reader = command.ExecuteReader();
{
while (reader.Read())
{
var prod = new Product((int)reader["ID"], (string)reader["Name"],
(double)reader["Price"], (int)reader["Stock"], (int)reader["VATID"],
(string)reader["Description"]);
result.Add(prod);
reader.NextResult();
}
reader.Close();
conn.Close();
return result;
};
}
}
uj5u.com熱心網友回復:
您使用NextResultwhich 將閱讀器推進到下一個結果集。如果您有多個 sql 查詢并且在 while 回圈之后使用它,這是有道理的。在這里,這是不必要的和錯誤的。
您已經推進讀者到下一個記錄用Read。
如果我擺脫它,則會發生此錯誤:無法將“System.DBNull”型別的物件轉換為“System.String”。
您可以使用IsDBNull:
int nameIndex = reader.GetOrdinal("Name");
string name = reader.IsDBNull(nameIndex) ? null : reader.GetString(nameIndex);
int descIndex = reader.GetOrdinal("Description");
string description = reader.IsDBNull(descIndex) ? null : reader.GetString(descIndex);
var prod = new Product((int)reader["ID"],
name,
(double)reader["Price"],
(int)reader["Stock"],
(int)reader["VATID"],
description);
將它用于每個可為空的列,對于數字列,您可以使用可空型別,如int?.
uj5u.com熱心網友回復:
如果你有幾個結果集,你應該回圈它們,即你應該再放一個外回圈,例如
using var reader = command.ExecuteReader();
do {
while (reader.Read()) {
var prod = new Product(
Convert.ToInt32(reader["ID"]),
Convert.ToString(reader["Name"]),
Convert.ToDouble(reader["Price"]), // decimal will be better for money
Convert.ToInt32(reader["Stock"]),
Convert.ToInt32(reader["VATID"]),
Convert.ToString(reader["Description"])
);
result.Add(prod);
}
}
while (reader.NextResult());
注意外部do .. while回圈,因為我們總是至少有一個結果集。
uj5u.com熱心網友回復:
您的代碼中有錯誤:洗掉該行 reader.NextResult();
NextResult 用于移動到下一個結果集而不是下一條記錄。
uj5u.com熱心網友回復:
果斷洗掉NextResult()。但這不是在同一個查詢個人記錄之間移動。Read()已經為你做這件事了。相反,NextResult()允許您在同一個查詢中包含多個查詢,CommandText并在一次訪問資料庫的程序中運行它們。
嘗試這個:
public IEnumerable<Product> Search(string name)
{
using (var conn = new SqlConnection(connectionString))
using (var command = new SqlCommand("SELECT * FROM Product ", conn))
{
if (!string.IsNullOrEmpty(name) )
{
command.CommandText = " WHERE Name LIKE @Name '%'";
command.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = name;
}
conn.Open();
using var reader = command.ExecuteReader();
{
while (reader.Read())
{
var prod = new Product((int)reader["ID"], reader["Name"].ToString(),
(double)reader["Price"], (int)reader["Stock"], (int)reader["VATID"],
reader["Description"].ToString());
yield return prod;
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/330743.html
上一篇:如何在圖片框角上繪制圓角橢圓?
