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

时间:2012-05-24 06:24:06

标签: asp.net mysql visual-studio-2010 data-access-layer

我一直在构建这个项目作为solo dev一段时间,虽然我在前端和中间层很舒服,但我并不认为我按照我应该的方式做数据库,原因是因为我根本不知道其他任何方式。我目前获取数据的方法是在我的MySQL工作台中测试查询,并将SQL作为字符串文字复制并粘贴到一个方法中,该方法调用数据库,提取数据并保护我的对象。

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

1 个答案:

答案 0 :(得分:0)

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

示例:

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

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