在.net中存储SQL命令

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与实体框架一起使用 - 这太棒了!

Mar*_*ell 6

这是一个很大的主题,但一个非常简短的观点可能如下:

  1. 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工具将从底层表结构为您生成这些工具.

  2. 不要混用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)
  3. 使用一个库,如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)
  4. 并非所有东西都需要成为存储过程; 曾经两者之间存在巨大的性能差异 - 但现在已经不是这样了.有充分理由使用它们(非常精细的安全性,与多个应用程序使用者共享数据库,认为自己是开发人员的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)