-1

私はこれが尋ねられたと確信しています。しかし、正確なコンテキストを見つけることができません。これは初心者ですか、それとも賢明でないアプローチですか?または、これは許容できるアプローチですか。

私が取り組んでいるプロジェクトがあります。私はこれらの4つのテーブルを持っています:

  • お客様
  • 住所
  • サイト
  • ログイン

したがって、データベースは基本的なものであり、あまりにもクレイジーなものではありません。

Restful Serviceしかし、クライアントをサーバーにリンクするためにを作成しました。Crud操作を実行するには、単純なが必要ですInsert Command

好き:

 string sqlInsertStr = "INSERT INTO Customer (First, Last, Phone, Email) 
         VALUES (@first, @last, @phone, @email)";

これで、4つのテーブルのうちの1つを処理できます。私の考えは、次の2つのアプローチのいずれかでした。

  1. を使用しGenericて、個々のクエリを保存します。次に、ループして各クエリを繰り返します。
  2. 反復するGeneric一連のを含むを使用します。Stored Procedures

私の目標はstrings、データベースを繰り返し処理してデータベースに書き込むために、いくつかを回避することです。

私の推論は、クライアントが個々のフィールドまたはプロファイル全体を変更するときでした。すべてのテーブルを一致して処理します。SQL複数のテーブルにデータを挿入しようとすると、制限があることを私は知っています。

それは悪いアプローチですか。これはかなり小さくて単純です。だから私は夢中になるつもりはありません。しかし、それは学校のためです。だから私は私が有効な解決策を考え出しているかどうかを理解しようとしています、そして私がそうであればそれは正しい解決策と見なされますか?

問題と説明に関するどんな入力も素晴らしいでしょう。


アップデート:

ご迷惑をおかけしましたことをお詫び申し上げます。はい、1つのオブジェクトモデルがあります。これには、各テーブルの各列のすべての情報が含まれています。私の質問はこれです:

SQLInserting複数のテーブルにまたがるのは好きではありません。したがって、これは1つのテーブルで問題なく機能します。

using (connection)
{
      string sqlInsertStr = "INSERT INTO Customer (First, Last, Phone, Email) 
             VALUES (@first, @last, @phone, @email)";
      connection = new SqlConnection(connectionStr);
      command = new SqlCommand();
      command.Connection = connection;
      command.Connection.Open();
      command.CommandText = sqlInsertStr;

      SqlParameter firstParam = new SqlParameter(@"first", cust.First);
      SqlParameter lastParam = new SqlParameter(@"last", cust.Last);
      SqlParameter phoneParam = new SqlParameter(@"phone", cust.Phone);
      SqlParameter emailParam = new SqlParameter(@"email", cust.Email);

      command.Parameters.AddRange(new SqlParameter[] 
              { firstParam, lastParam, phoneParam, emailParam});
      command.ExecuteNonQuery();
      command.Connection.Close();
}

これにより、1つのテーブルに簡単に書き込むことができます。しかし、それらの他のテーブルに挿入する必要がある他のすべてのデータはどうですか?sqlInsertStrテーブルごとにを作成する必要がありますか?または、私は単にこのようなことをすることができませんでした:

using(connection)
{
     list<string> sqlInsertStr = new list<string>();
     sqlInsertStr.Add("INSERT INTO Customer (First, Last, Phone, Email) 
              VALUES (@first, @last, @phone, @email)"l
     sqlInsertStr.Add("INSERT INTO Address (Street, City, State, Zip, Country)
               VALUES (@Street, @City, @State, @Zip, @Country)";

     connection = new SqlConnection(connectionStr);
     command = new SqlCommand();
     command.Connection = connection;
     command.CommandText = sqlInsertStr;

     // Repeat with Parameters and etc.
}

したがって、基本的にaを使用するGenericStringBuilder、適切なデータを使用してこれらすべての挿入を処理するために1つの文字列を含めることを許可しませんか?それとも私は完全に自分自身を考えすぎ/混乱させていますか?私はまだ学んでいるので、説明は素晴らしいでしょう。

4

1 に答える 1

3

それを機能させるためにここにある多くの質問に基づいて、あまり一般化して賢くしようとしないことをお勧めします。問題に対する私の推奨アプローチは次のとおりです。

  1. 機能させる - 必要な手段を講じて ({gasp} のコピー アンド ペーストも)
  2. 改善 - リファクタリング、ジェネリック化など
  3. より速くする - プロファイリングを行い、最も遅い部分を最初に確認する

機能する前に 2) と 3) を実行しようとする人が多すぎて、機能させるためだけにハッキングやマイクロ最適化により多くの時間を費やすことになります。最初に機能するようになった場合は、いつでも最適化を破棄して最初からやり直すことができ、それでも機能する製品が得られます!

つまり、まだジェネリックについて心配する必要はありません。4 つのリポジトリ (テーブルごとに 1 つ) を作成してから、ジェネリックがよりクリーンになるかどうかを分析して確認してください。

アップデートにコメントする

私は完全に考えすぎ/自分自身を混乱させていますか

それはそれのように聞こえます。複数の場所で同じ接続/コマンド コードを使用しないようにするためだけに、1 つのクラスですべてのタイプの CRUD 操作を処理しようとしないでください。各リポジトリ (この用語を大まかに使用しており、CRUD 操作を処理するクラスを意味します) には、独自の接続/コマンド コードが必要です。後で、グランジ作業を処理する基本クラスを作成できると判断した場合は、それで問題ありません。または、Entity Framework や NHibernate などの ORM レイヤーを使用して処理することもできます。または、混合物を使用することもできます。あなたがそれを機能させた後に最もよく機能するものは何でも。:)

于 2013-01-30T22:23:58.820 に答える