【发布时间】:2023-01-29 21:00:10
【问题描述】:
我正在尝试构建我的第一个用于学习目的的应用程序,但我遇到了困难。
我的目标是从一个标有 PC 的表和几个具有 ID 和字符串值的外键表中检索数据。我能够执行一个 SQL 查询,从 PC 表中检索所有信息(包括外键 ID),但我希望能够看到 pc 的“品牌”和“型号”。
这是我得到的错误:
System.InvalidCastException:“指定的转换无效。”
我在 C# 中的 PC 模型如下所示:
public class PC { public int PC_ID { get; set; } public string PC_SERIAL { get; set; } public string PC_NAME { get; set; } public Nullable<int> PC_BRAND_ID { get; set; } public PCBrand PC_Brand { get; set; } public Nullable<int> PC_MODEL_ID { get; set; } public PCBrand PC_Model { get; set; } public Nullable<int> PC_OS_ID { get; set; } public PCOS PC_OS { get; set; } public Nullable<int> PC_NET_ID { get; set; } public PCNet PC_Net { get; set; } public Nullable<int> PC_RAM_ID { get; set; } public PCRam PC_Ram { get; set; } public override string ToString() { return $"{PC_ID} - {PC_NAME} - {PC_SERIAL} - {PC_Model} - {PC_Brand} - {PC_OS} - {PC_Net} - {PC_Ram}"; } }例如,我的一个外键表如下所示:
namespace Inventory.Data.Model { public class PCBrand { public int PC_BRAND_ID { get; set; } public string PC_BRAND { get; set; } } }这是我的存储库类中的代码:
private const string SqlGetAllPC = @"Select PC.PC_ID, PC.PC_NAME, PC_BRAND.PC_BRAND,PC_MODEL.PC_MODEL,PC_NET. PC_NET,PC_OS.PC_OS,PC_RAM.PC_RAM FROM PC INNER JOIN PC_BRAND on PC.PC_BRAND_ID=PC_BRAND.PC_BRAND_ID INNER JOIN PC_MODEL ON PC.PC_MODEL_ID=PC_MODEL.PC_MODEL_ID INNER JOIN PC_NET ON PC.PC_NET_ID=PC_NET.PC_NET_ID INNER JOIN PC_OS ON PC.PC_OS_ID=PC_OS.PC_OS_ID INNER JOIN PC_RAM ON PC.PC_RAM_ID=PC_RAM.PC_RAM_ID"; public IEnumerable<PC> GetAllFromPc() { IEnumerable<PC> list = null; try { connector.OpenConnection(); System.Data.DataTable data = connector.GetData(SqlGetAllPC); if (data != null && data.Rows.Count > 0) { list = ConvertToPC(data); } } catch (Exception) { throw; } finally { connector.CloseConnection(); } return list; } private IEnumerable<PC> ConvertToPC(DataTable data) { List<PC> tmp = new List<PC>(); foreach (DataRow row in data.Rows) { tmp.Add(new PC() { PC_ID = row.Field<int>(0), PC_SERIAL = row.Field<string>(1), PC_NAME = row.Field<string>(2), PC_BRAND_ID = row.Field<int>(3), PC_MODEL_ID = row.Field<int>(4), PC_OS_ID = row.Field<int>(5), PC_NET_ID = row.Field<int>(6), PC_RAM_ID = row.Field<int>(7), }); } return tmp; } }最后是我检索数据的按钮
private void GetAllButton(object sender, RoutedEventArgs e) { Data.Repositories.PCRepository newpc = new Data.Repositories.PCRepository(); IEnumerable<Data.Model.PC> data = newpc.GetAllFromPc(); if (data != null) { StringBuilder sb = new StringBuilder(); data.ToList() .ForEach(x=> sb.AppendLine(x.ToString())) MessageBox.Show(sb.ToString()); } }通过一些编辑,我能够从我的 PC 表中检索。但我还想从数据库中的
PC_Brand和PC_Model表中检索 PC 的型号/品牌名称:
【问题讨论】:
-
代码中的哪一行抛出异常?
-
我推荐小巧玲珑。我会忘记你那里有什么并开始使用它,因为它会使数据库访问更简单。
-
@Chetan 它看起来像 PCRepository 中的 tmp.Add(new PC()
-
当您正在读取的数据与您的视图模型或模型使用不匹配时,您还应该定义纯粹用于数据访问的 dto 类。
-
@Andy 感谢您的建议。它可能更简单,但我的“导师”告诉我,我应该尝试看看我是否可以以这种方式工作......