2

私はしばらくの間、このプロジェクトを単独の開発者として構築してきました。フロント エンドと中間層には慣れていますが、データベースを本来あるべき方法で行っているとは思えません。その理由とはなぜかというと、それ以外の方法をまったく知らないからです。私が現在データを取得している方法は、MySQL ワークベンチでクエリをテストし、SQL を文字列リテラルとして DB を呼び出し、データをプルし、オブジェクトをハイドレートするメソッドにコピー アンド ペーストすることです。

これは、クエリのモンスターを作成する必要があり、これを行うためのより良い方法があるのではないかと考えさせられた最近まで、実際には問題ではありませんでした。私は正式な 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 サーバー):

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

ここではストアド プロシージャを呼び出しますが、この場合は単純な select ステートメントであり、ADO を介してオブジェクトに読み込みます。これで、再コンパイルせずにクエリを変更できます。パラメータを追加しない限り、その場合はコード内のパラメータも更新する必要があります。

于 2012-09-04T20:29:22.737 に答える