2

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

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

4

1 回答 1

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

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

于 2012-09-04T20:29:22.737 回答