由于我认为这个问题需要更简洁,所以我删除了大量文本。-Serg
这是我想做的事情。用户选择一个州,然后ComboBox会加载该州的城市,然后当用户选择一个城市时,ListBox会加载该城市的所有项目。
运行应该将项目加载到ComboBox的方法时,我收到以下错误:
已引发异常 调用目标的内部异常是: "{"指定的强制转换无效。"}"valid."}"
这是导致异常的方法:
private void LoadProjectsToListBox(long idCity)
{
ProjectRepository projectRepo = new ProjectRepository();
//This line causes the error.
var projects = projectRepo.FindAllProjects().Where(c => c.IDCity == 1).ToList();
}
在 Linq 查询中,你会看到我正在与一个硬编码的数字进行比较。1 是具有项目的城市的有效 ID,因此应该可以工作。只有当我给 Linq 查询一个具有项目的城市 ID 时才会引发异常。因此,似乎是在查询返回结果时引发了错误。
这是我用来生成 Project 和 City 表的 SQL 语句:
create table City
(
ID integer primary key autoincrement,
Name string,
IDState integer references State(ID)
);
create table Project
(
ID integer primary key autoincrement,
Name string,
StartDate text,
IDManager integer references Manager(ID),
IDCity integer references City(ID),
IDDepartment integer references Department(ID),
ContactNumber string,
Description string
);
让我感到奇怪的是,使用完全相同的模式和访问代码来显示部门列表(只是我的数据库中的另一个表),一切都按预期工作。例如,这是我目前为了测试如何加载部门:
private void LoadProjectsToListBox(long idCity)
{
ProjectRepository projectRepo = new ProjectRepository();
DepartmentRepository departmentRepo = new DepartmentRepository();
//Doesn't work - raises exception.
var projects = projectRepo.FindAllProjects().Where(c => c.IDCity == 1).ToList();
//Works exactly as expected.
var deps = departmentRepo.FindAllDepartments().Where(c => c.IDParentDepartment == 7).ToList();
lstProjects.Items.Clear();
foreach (var item in deps)
{
lstProjects.Items.Add(item.Name);
}
}
编辑:
FindAllDepartments()、FindAllCities()和FindAllProjects()方法本质上是相同的。
DocumentsDBEntities db = new DocumentsDBEntities();
public IQueryable<Project> FindAllProjects()
{
return db.Projects;
}
public IQueryable<City> FindAllCities()
{
return db.Cities;
}
public IQueryable<Department> FindAllDepartments()
{
return db.Departments;
}
如前所述,部门获取可行;项目获取导致异常。
编辑3:
我解决了!问题出在在项目表中使用了“文本”数据类型。如果我将该列的数据类型从“文本”更改为“字符串”,它就可以完美地工作了。有人能告诉我为什么吗?
FindAllProjects()
方法在哪里?这很可能是无效转换异常发生的地方。 - Ian Mercer