1

SQL図(画像を参照)に基づいて2つのC#クラスの連絡先と顧客を作成します。正しく実行されているかどうかを確認したいのですが、アドバイスが必要ですか?データベース図とクラスの顧客と連絡先をダウン

ここに画像の説明を入力してください

Customer Class


 public class Customer
    {
        public int CustomerID { get; set; }
        public string Title { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Postion { get; set; }
        public Char Gender { get; set; }
        public DateTime BecomeCustomer { get; set; }     
        public DateTime ModifiedDate { get; set; }



        public Customer() { }


        public static bool AddNewCustomer_Contact(Customer cust,Contacts cont)
        {
            try
            {
                // get a configured DbCommand object
                DbCommand comm = GenericDataAccess.CreateCommand();


                //Set the store Proc name 
                comm.CommandText = "AddNewCustomer_Contact";

                //create new parameter @Title 
                DbParameter param = comm.CreateParameter();
                param = comm.CreateParameter();
                param.ParameterName = "@Title";
                param.Value = cust.Title;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @FirstName
                param = comm.CreateParameter();
                param.ParameterName = "@FirstName ";
                param.Value = cust.FirstName;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @LastName
                param = comm.CreateParameter();
                param.ParameterName = "@LastName";
                param.Value = cust.LastName;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @Postion 
                param = comm.CreateParameter();
                param.ParameterName = "@Postion ";
                param.Value = cust.Postion;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @BecomeCustomer
                param = comm.CreateParameter();
                param.ParameterName = "@BecomeCustomer";
                param.Value = DateTime.Now;
                param.DbType = DbType.DateTime;
                comm.Parameters.Add(param);

                //create new parameter @Gender 
                param = comm.CreateParameter();
                param.ParameterName = "@Gender";
                param.Value = cust.Gender;
                param.DbType = DbType.String;
                comm.Parameters.Add(param);

                //create new parameter @ModifiedDate  
                param = comm.CreateParameter();
                param.ParameterName = "@ModifiedDate";
                param.Value = DateTime.Now;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @LabelContactTypeID
                param = comm.CreateParameter();
                param.ParameterName = "@LabelContactTypeID";
                param.Value = cont.LabelContactTypeID;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @ContactDetails
                param = comm.CreateParameter();
                param.ParameterName = "@ContactDetails";
                param.Value = cont.ContactDetail;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @Status
                param = comm.CreateParameter();
                param.ParameterName = "@Status";
                param.Value = cont.Status;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @Notes
                param = comm.CreateParameter();
                param.ParameterName = "@Notes";
                param.Value = cont.Notes;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);


                return (GenericDataAccess.ExecuteNonQuery(comm) != -1);

            }
            catch
            {
                return false;
            }
        }
    }
Contact Class

public class Contacts
{
    public int ContactsID { get; set; }
    public int CustomerID { get;set; }
    public string ContactDetail { get; set; }
    public bool Status { get; set; }
    public int LabelContactTypeID { get; set; }
    public string Notes { get; set; }


}
4

3 に答える 3

1

問題ないように見えますが、実際にはモデルを操作していないため、データ アクセス レイヤーを別の静的クラスに配置します。クラスは、モデル自体でそのデータと対話するデータとメソッドにカプセル化する必要があります。

また、AddWithValue() を調べてください: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

より使いやすくなる場合があります。

于 2012-10-18T03:08:11.183 に答える
1

アーキテクチャに関するほとんどの質問 / 「正しく行っていますか?」「場合による」に要約します。

これにアプローチできるいくつかの方法。「高パフォーマンス」ではなく、オブジェクトをデータベース テーブルに直接マップするシナリオでは、Entity Framework のような ORM を使用してもまったく問題ありません。

ドメイン レイヤーをデータ ストアの論理設計から切り離したい場合は、リポジトリ パターンなどを調べて、DTO / ストレート ADO.NET を使用する必要があります。しかし、それはより多くのコードであり、全体的により多くの労力を必要とします。

あなたがここで示した小さなものから、それは単純で高性能ではないアプリのように見えるので、うまく機能する最も単純なもの、この場合はエンティティフレームワークまたは別の ORM に到達します。

ado .net を使用し、コードをクリーンにするために古いデータ転送オブジェクトを計画する場合は、データベース アクセス コードをデータ転送オブジェクトとは別のクラスに入れることをお勧めします (DTO、この場合、Customer は DTO、プロパティ バッグの場合)。 )

于 2012-10-18T03:10:49.870 に答える
0

クラスを設計するときの最初のステップは、必要なクラスとその属性/責任を特定することです。私が理解していることから、あなたが表現したい唯一の高レベルクラスは顧客です。Customer が上位クラスであるということは、Customer の一部の属性を他のオブジェクト (名前、連絡先など) で構成できることを意味します。

さらに、Id などの一部のフィールドは、データベースの外では重要ではありません (この場合の Id は、Customer テーブルの主キーであると想定しています)。クラス モデルをデータベース設計 (正規化されたもの) に基づいて作成することにこだわっている場合は、クラス モデルに進む前に、設計を「非正規化」することをお勧めします。正規化によって提供される最適化は、リレーションシップ モデルの範囲内でのみ行われ、通常はメモリ内表現であるクラスには拡張されません。

さらに、@Yatrix で提案されているように、実際のデータ モデルからデータ アクセス レイヤーを抽象化することをお勧めします。

ここにいくつかの提案があります、

public class Customer
{
    // public int CustomerID { get; set; } // Database specific primary key
    public string Title { get; set; } 
    public string FirstName { get; set; } // Is the setter required to be publicly exposed? 
                                          // Or can it be private to the class?
    public string LastName { get; set; }  // FirstName and LastName can be part of a nested class 
                                          // Name, so that the access is more natural... 
                                          // Customer.Name.FirstName 
    public string Postion { get; set; }
    public Char Gender { get; set; } // Can be an enumeration
    public DateTime BecomeCustomer { get; set; }     
    public DateTime ModifiedDate { get; set; }
    public IList<Contact> Contacts { get; private set; } // The getter can be private and you can 
                                                         // expose only some methods like 
                                                         // Customer.GetContactOfType(type)


    public bool AddContact(Contact contact)
    {
         // ...
    }

    public bool RemoveContact(Contact contact)
    {
         // ...
    }       
}

public class Contact
{
    public string ContactDetail { get; set; } // Can be named as Detail or something more specific
    public bool Status { get; set; } // Can be enumeration
    public ContactType Type { get; set; } // ContactType is an enumeration
    public string Notes { get; set; }
}
于 2012-10-18T03:29:10.867 に答える