我不确定这是否可行,但在C#中是否有一种方法可以生成数据库表中所有查找值的静态成员或枚举器?
例如,如果我有一个包含2列国家/地区的表:code,countryname。我想要一种方法将此表中的所有行转换为每行具有适当性的类,以便我可以执行以下操作:
string countryCode = Country.Egypt.Code
其中埃及是数据库表中生成的属性。
答案 0 :(得分:1)
当您说“转换所有行”时,您实际上是指“转换所有列”吗?
我是这样,如果您的ADO.NET提供程序支持它,您可以使用 LINQ to SQL 自动生成一个具有与表中列相匹配的属性的类。您可以按照以下步骤操作:
DataClasses1DataContext
类的DataClasses1.dbml文件。假设你的表名是COUNRTY,字段名为NAME和CODE,你可以在代码中使用它,如下所示:
using (var db = new DataClasses1DataContext()) {
COUNRTY egypt = db.COUNRTies.Where(row => row.NAME == "Egypt").SingleOrDefault();
if (egypt == null) {
// "Egypt" is not in the database.
}
else {
var egypt_code = egypt.CODE;
// Use egypt_code...
}
}
如果您实际上是指“行”,我不知道这样做的自动方式(这并不意味着它不存在!)。编写一个遍历所有行的小程序,提取实际值并生成一些C#文本应该是一个相当简单的练习。
但即使你这样做,你会如何处理数据库更改?比如,一个值从数据库中删除但它仍然存在于您的程序中,因为它在编译时存在?或者已添加到数据库中,但程序中缺少该文件?
答案 1 :(得分:0)
这是不可能的,因为{em}必须在编译时可用。我认为你的选择是:
从数据库生成Country类的代码。当然,问题是客户将如何使用它?
保持静态声明属性并在应用程序启动期间从数据库中读取其代码
保留属性以及静态声明的代码,并在应用程序启动期间针对数据库进行检查。
除了上面的#1之外,如果客户端代码不依赖于各个属性名称,那么这些不是类型而是数据,您也可以使用Country.Egypt
属性来启动时初始化。