我正在使用 .net 构建我的第一个网络应用程序,它需要与一个非常大的现有数据库进行交互。我设置了连接,并创建了一个类,我可以调用该类来构建选择、插入、更新和删除查询,传递多个参数。
我可以通过在按钮点击中编写我想要的查询来连接,但我想知道这是最好的解决方案吗?这种方式似乎很难调试,因为它会将数据库代码与其他代码混合在一起。
过去(用其他语言)我创建了一个类,其中包含所有数据库查询字符串和参数,其余代码将调用这些字符串和参数。这样,如果像存储过程参数这样简单的东西发生变化,代码都集中在一个地方。
当我在 .net 中查找此内容时,我看不到以这种方式进行的任何操作,我很想学习最佳实践。
protected void Button1_Click(object sender, EventArgs e)
{
NameLabel.Text = UserNoTextBox.Text;
string spName = "SP_SelectUser";
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@User_No", UserNoTextBox.Text)
};
DataAccess dbAccess = new DataAccess();
DataTable retVal = dbAccess.ExecuteParamerizedSelectCommand(spName, CommandType.StoredProcedure, parameters);
}
更新:我指的类是来自以下网站的 DataAccess 类: http://www.codeproject.com/Articles/361579/A-Beginners-Tutorial-for-Understanding-ADO-NET (类(class)可在 http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=361579 获得)
更新:最后我选择将 MVC 3 与 Entity Framework 一起使用 - 太棒了!
最佳答案
这是一个很大的话题,但是非常简短的观点可能如下:
DataTable
必须死(好的,它有一些少数用途,但总的来说:它必须死);考虑使用自定义类型,例如:public class User { public int Id {get;set;} public string Name {get;set;} public string EmployeeNumber {get;set;} // etc }
还应注意,许多 ORM 工具会为您生成这些底层表结构。
不要混合使用 UI 和数据访问;将这段代码分开,最好分成单独的类,但至少分成单独的方法:
protected void Button1_Click(object sender, EventArgs e) { NameLabel.Text = UserNoTextBox.Text; var user = SomeType.GetUser(UserNoTextBox.Text); // do something with user } ... public User GetUser(string userNumber) { ... your DB code here }
使用诸如 ORM(EF、LINQ-to-SQL、LLBLGenPro)或微型 ORM(dapper、PetaPoco 等)之类的库 - 例如,这是带有 dapper 的代码:
public User GetUser(string userNumber) { using(var conn = GetOpenConnection()) { return conn.Query<User>("SP_SelectUser", new {User_No = userNumber}, // <=== parameters made simple commandType: CommandType.StoredProcedure).FirstOrDefault() } }
或使用 LINQ-to-SQL(EF 非常相似):
public User GetUser(string userNumber) { using(var db = GetDataContext()) { return db.Users.FirstOrDefault(u => u.User_No == userNumber); } }
不是所有的东西都需要是存储过程;过去两者之间存在巨大的性能差异 - 但现在已不再如此。使用它们有充分的理由(非常精细的安全性、与多个应用程序消费者共享数据库、认为自己是开发人员的 dba),但它们也会产生维护问题,尤其是在部署更改时。在大多数情况下,我会毫不犹豫地使用原始(但参数化)SQL,例如:
public User GetUser(string userNumber) { using(var conn = GetOpenConnection()) { return conn.Query<User>(@" select [some columns here] from Users where User_No = @userNumber", new {userNumber}).FirstOrDefault() } }
关于c# - 在 .net 中存储 SQL 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12194085/