MySQL 数据访问层:您如何存储查询?

Posted

技术标签:

【中文标题】MySQL 数据访问层:您如何存储查询?【英文标题】:MySQL Data Access Layer: How do you store your queries? 【发布时间】:2012-05-30 17:24:44 【问题描述】:

我作为独立开发者构建这个项目已经有一段时间了,虽然我在前端和中间层很自在,但我并不认为我正在按照我应该的方式来做数据库,原因是因为我根本不知道任何其他方式。我目前获取数据的方式是在我的 mysql 工作台中测试查询,并将 SQL 作为字符串文字复制并粘贴到一个方法中,该方法调用数据库、提取数据并混合我的对象。

直到最近,当我不得不创建一个查询的怪物时,这才真正成为问题,这让我想到也许有更好的方法来做到这一点。我没有分离出正式的 DAL,所以我知道那里还有改进的空间,但我很好奇存储 SQL 字符串的正确方法是什么。我假设在 VS10 中内置了一个工具,我可以在其中将 SQL 作为 SQL 而不是作为字符串来操作和使用。

【问题讨论】:

听起来是 MyBatis 的好案例:mybatis.org/dotnet.html visual studio 有一个可能有用的实体框架,但它增加了很大的 ORM 复杂性。 我只是在寻找一个放置文件的地方,可能扩展名为.sql,并且能够以某种方式在代码中引用它们。那可能吗?也许我什至可以传入可以引用其属性和方法的对象? 【参考方案1】:

您应该在存储过程中执行此操作。这将基本上格式化和存储您的查询。您设置从代码传入的参数,然后读出结果。

例子:

C#方法:

private void SetNote()

    const string sql = "sp_SelectControllerNoteByID";
    using (var conn = MocSystem.GetMocDbConnection())
    
        using (var comm = new SqlCommand(sql, conn))
        
            comm.CommandType = CommandType.StoredProcedure;
            comm.Parameters.Add(new SqlParameter("@ControllerNoteID", ControllerNoteId));
            try
            
                conn.Open();
                using (var rdr = comm.ExecuteReader())
                
                    while (rdr.Read())
                    
                        CommentText = rdr["NoteText"].ToString();
                        _commentor = new User(new Guid(rdr["NoteAuthor"].ToString()));
                        CommentDate = (DateTime)rdr["NoteDate"];
                        MocRequestId = (int)rdr["MocRequestID"];
                    
                
            
            catch (Exception ex)
            
                HasError = true;
                ErrorMessage += "\nThere was a problem building the note: " + ex.Message;
            
        
    

DBMS(本例中为sql server)上的存储过程:

ALTER proc [dbo].[sp_SelectControllerNoteByID]
    @ControllerNoteID   int
AS
    SELECT
        ControllerNoteID,
        NoteText,
        NoteDate,
        NoteAuthor,
        MocRequestID
    FROM
        ControllerNotes
    WHERE
        ControllerNoteID = @ControllerNoteID

所以这里我们调用存储过程,在这种情况下它只是一个简单的选择语句,然后我们通过 ADO 将它读入一个对象。现在,通过这种方式,您可以修改查询而无需重新编译。除非您添加参数,否则您还必须在代码中更新这些参数。

【讨论】:

以上是关于MySQL 数据访问层:您如何存储查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MYSQL 查询访问 Ms-Access 数据库

当使用实体框架作为数据访问层时,如何实现业务逻辑层?

单元测试数据访问层 - 测试更新方法?

Mysql的数据库引擎

数据访问层设计模式

Serverless 解惑——函数计算如何访问 MySQL 数据库