c# - 在 .net 中存储 SQL 命令

标签 c# asp.net database ado.net

我正在使用 .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 一起使用 - 太棒了!

最佳答案

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

  1. DataTable 必须死(好的,它有一些少数用途,但总的来说:它必须死);考虑使用自定义类型,例如:

    public class User {
        public int Id {get;set;}
        public string Name {get;set;}
        public string EmployeeNumber {get;set;}
        // etc
    }
    

    还应注意,许多 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
    }
    
  3. 使用诸如 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);
        }
     }
    
  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()
        }
    }
    

关于c# - 在 .net 中存储 SQL 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12194085/

相关文章:

javascript - 操作 MongoDB 中引用数组中元素的顺序

c# - SSH.NET C# 发送 Yes 或 No 到 linux 服务器

c# - 无法加载 DLL UIAutomationCore.dll

c# - 加载外部 javascript 文件时 Colorbox 延迟打开和 "lock"

c# - 如何使用asp.net在登录控件中验证用户名和密码是否有效

php - 重复从数据库中选择下拉列表值

c# - tfs 构建错误无法注册程序集 "MyAssembly.dll"- 访问被拒绝

c# - 在 C# 中旋转图像的矩阵乘法

c# - HtmlGenericControl 和 id

javascript - 通过 php 将数据发布到我的 AngularjS 数据库