因此,我是一名相当新的程序员,致力于本科Comp Sci学位,并且工作经验非常少.在为我的课程寻找实习型工作时,我注意到我从几位教授那里听到的 - "使用数据库占所有现代计算机科学工作的90%" - 看起来确实如此.但是,我的课程直到第3年才开始有任何数据库课程,所以我试着至少自己学习一些东西.
对于像我这样的人,我在SO和互联网上看到的很少.关于如何在数据库中读取和写入数据的机制似乎有大量的教程,但关于相关的最佳实践却很少.为了展示我正在谈论的内容,并帮助我解决实际问题,可以在互联网上轻松找到:
public static void Main ()
{
using (var conn = new OdbcConnection())
{
var command = new OdbcCommand();
command.Connection = conn;
command.CommandText = "SELECT * FROM Customer WHERE id = 1";
var dbAdapter = new OdbcDataAdapter();
dbAdapter.SelectCommand = command;
var results = new DataTable();
dbAdapter.Fill(results);
}
// then you would do something like
string customerName = (string) results.Rows[0]["name"];
}
Run Code Online (Sandbox Code Playgroud)
等等.这很容易理解,但显然有很多问题.我开始使用这样的代码,很快就开始说"好像只是让SQL到处都是愚蠢的,我应该把所有这些都放在一个常量文件中." 然后我意识到,在整个地方使用相同的代码行并将所有内容与连接对象等放在方法中是很愚蠢的:
public DataTable GetTableFromDB (string sql)
{
// code similar to first sample
}
string getCustomerSql = String.Format(Constants.SelectAllFromCustomer, customerId);
DataTable customer = GetTableFromDB(getCustomerSql);
string customerName = (string) customer.Rows[0]["name"];
Run Code Online (Sandbox Code Playgroud)
这似乎是一个很大的进步.现在,从OdbcConnection更改为SQLiteConnection是非常容易的.但访问数据的最后一行似乎仍然很尴尬; 更改字段名称(例如从"名称"转到"CustName"或其他内容)仍然很痛苦.我开始阅读有关使用类型化数据集或自定义业务对象的内容.我仍然对所有术语感到困惑,但无论如何都决定调查它.我认为依靠闪亮的数据库向导为我做所有这些事情是愚蠢的(比如在链接的文章中),然后我才真正了解发生了什么,以及为什么.所以我自己就把它刺了一下,开始得到这样的东西:
public class Customer
{
public string Name {get; set;}
public int Id {get; set;}
public void Populate ()
{
string getCustomerSql = String.Format(Constants.SelectAllFromCustomer, this.Id);
DataTable customer = GetTableFromDB(getCustomerSql);
this.Name = (string) customer.Rows[0]["name"];
}
public static IEnumerable<Customer> GetAll()
{
foreach ( ... ) {
// blah blah
yield return customer;
}
}
}
Run Code Online (Sandbox Code Playgroud)
隐藏丑陋的表格并提供一些强大的输入,允许外部代码只做一些事情
var customer = new Customer(custId);
customer.Populate();
string customerName = customer.Name;
Run Code Online (Sandbox Code Playgroud)
这真的很好.如果Customer表发生更改,则代码中的更改只需要在一个位置发生:在Customer类中.
所以,在所有这些漫无边际的结尾,我的问题就是这个.我数据库代码的缓慢演变是否朝着正确的方向发展?我下一步去哪儿?这种风格对于小型数据库来说都很好,但是当有大量不同的表时,为每个表写出所有这些类都会很痛苦.我听说过可以为你生成这种类型的代码的软件,但是仍然有点被DAL/ORM/LINQ2SQL/etc行话弄糊涂了,那些巨大的软件都是压倒性的.我正在寻找一些优秀而非压倒性复杂的资源,可以指引我朝着正确的方向前进.我在这个主题上找到的只是复杂的文章,或者只是向您展示如何在Visual Studio中使用点击式向导的文章.还要注意我
感谢您阅读这个巨大的文字墙.
Mat*_*hew 18
确实非常好的问题,你肯定是在正确的轨道上!
作为一名计算机工程师,数据库以及如何编写与数据库交互的代码也从未成为我大学学位的重要组成部分,而且我确实负责所有工作中的数据库代码.
这是我的经验,使用90年代早期的传统技术在一个项目和现代技术与C#和WPF在另一个项目.
我会尽我所能解释术语,但我自己肯定不是专家.
表,对象和映射哦,我的!
数据库包含表但实际上是什么?这只是与其他平面数据相关的平面数据,如果你潜入并开始抓住它会迅速变得混乱!字符串将遍布各处,SQL语句重复,记录加载两次等等...因此,将每个表记录(或表记录集合取决于它们的关系)表示为单个对象通常是一种很好的做法,通常称为作为一个模型.这有助于封装数据并提供维护和更新其状态的功能.
在您的发布中,您的Customer类将充当模型!所以你已经意识到这种好处.
现在有各种各样的工具/框架(LINQ2SQL,dotConnect,Mindscape LightSpeed)可以为您编写所有的Model代码.最后,他们将对象映射到关系表或O/R映射,因为它们引用它.
正如预期的那样,当您的数据库发生更改时,您的O/R映射也会如此.就像你提到的那样,如果你的客户发生了变化,你必须在一个地方修复它,再次为什么我们把东西放在课堂上.对于我的遗留项目,更新模型消耗了大量时间,因为它们太多了,而在我的新项目中只需点击几下,但最终结果是相同的.
谁应该知道什么?
在我的两个项目中,对象如何与其表进行交互有两种不同的方式.
在一些营地,模型应该了解其表的一切,如何自救,必须连接/会话直接共享访问,并可以执行类似的行动Customer.Delete(),并Customer.Save()通过自己的所有.
其他阵营,在管理课上放读,写,删除,逻辑.例如, MySessionManager.Save( myCustomer ).该方法的优点是能够轻松实现对象的更改跟踪并确保所有对象引用相同的基础表记录.然而,实现它比前面提到的本地化类/表逻辑方法更复杂.
结论
你正走在正确的轨道上,在我看来,与数据库进行交互是非常有益的.当我第一次开始自己研究时,我记得我的脑袋旋转.
我建议尝试一下,启动一个小项目可能是一个简单的发票系统,并尝试自己编写模型.之后尝试另一个小项目并尝试利用数据库O/R映射工具并查看差异.
你的进化肯定是正确的方向.还有一些事情需要考虑:
| 归档时间: |
|
| 查看次数: |
18745 次 |
| 最近记录: |