Car*_*all 3 c# database asp.net ado.net
我正在使用.net构建我的第一个Web应用程序,它需要与一个非常大的现有数据库进行交互.我已建立连接,并创建了一个类,我可以调用它来构建选择,插入,更新和删除传递几个参数的查询.
我可以通过在按钮单击中编写我想要的查询来连接,但我想知道这是最好的解决方案吗?这种方式似乎很难调试,因为它将数据库代码与其他代码混合在一起.
在过去(在其他语言中),我创建了一个类,它将包含所有数据库查询字符串和参数,这些字符串和参数将由其余代码调用.这样,如果像存储过程参数这样简单的东西发生变化,代码就会集中在一个地方.
当我在.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);
}
Run Code Online (Sandbox Code Playgroud)
更新:我所指的类是来自以下网站的DataAccess类:http: //www.codeproject.com/Articles/361579/A-Beginners-Tutorial-for-Understanding-ADO-NET (类可在http: //www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=361579)
更新:最后我选择将MVC 3与实体框架一起使用 - 这太棒了!
这是一个很大的主题,但一个非常简短的观点可能如下:
DataTable必须死(好吧,它有一些用途,但一般来说:它必须死); 考虑使用自定义类型,例如:
public class User {
public int Id {get;set;}
public string Name {get;set;}
public string EmployeeNumber {get;set;}
// etc
}
Run Code Online (Sandbox Code Playgroud)
还应该注意,许多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
}
Run Code Online (Sandbox Code Playgroud)使用一个库,如ORM(EF,LINQ-to-SQL,LLBLGenPro)或微ORM(小巧玲珑,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()
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用LINQ-to-SQL(EF非常相似):
public User GetUser(string userNumber) {
using(var db = GetDataContext()) {
return db.Users.FirstOrDefault(u => u.User_No == userNumber);
}
}
Run Code Online (Sandbox Code Playgroud)并非所有东西都需要成为存储过程; 曾经两者之间存在巨大的性能差异 - 但现在已经不是这样了.有充分理由使用它们(非常精细的安全性,与多个应用程序使用者共享数据库,认为自己是开发人员的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()
}
}
Run Code Online (Sandbox Code Playgroud)