4

私はプログラミングにおけるオブジェクト指向の主要な概念に精通しており、現在、クラスの設計方法を自分で学んでいます。

私にはCompanyという非常に単純なクラスがあります。これが私がこれまでに持っているコードです

using System;

namespace Addressbook
{
    public class Company
    {
        private string _companyId;
        private string _companyName;
        private string _companyType;
        private string[] _companyDetails;

        public Company()
        {

        }


        public string CompanyId
        {
            set
            {
                this._companyId = value;
            }
        }

        public string CompanyName
        {
            set
            {
                this._companyName = value;
            }
        }

        public string CompanyType
        {
            set
            {
                this._companyType = value;
            }
        }


        public string[] GetCompanyDetails()
        {

            return null;
        }

    }
}

私が今やろうとしているのは、それにいくつかのメソッドを実装することです、そしてそれは私が一種の道に迷っているところです。

私が考えている最初のメソッドはGetCompanyDetails()、SQLデータベースからデータを収集して表示するというものです。おそらくDataGridViewか何かで。

私の問題は、このメソッドをどのように書くべきか理解できないことです。すべてのSQLクエリと接続をその中に入れますか?または、それらのインスタンスをパラメーターとして渡すだけですか?メソッドから返す必要があるタイプは何ですか?

誰かが私にこれに関するいくつかのガイドラインを教えてもらえますか?

また、この主題に関する優れたチュートリアル/ガイドへのリンクがある場合は、それらも投稿してください。

ありがとうございました。

4

7 に答える 7

5

テーブル内のレコードを表すクラスを作成します

public class Company
{       
    public string CompanyId { get; set; }
    public string CompanyName{ get; set; }
    public string CompanyType{ get; set; }       
}

Dapperで入手してマッピングします:

public IEnumerable<Company> GetCompanies()
{
   using (var connection = new SqlConnection(connectionString))
   {
       connection.Open();
       return connection.Query<Company>("SELECT * FROM Companies");
   }
}

ADO.NETを扱いたくない場合は、Linq 2 Sql、Entity Framework、NHibernateなどの重量のあるORMを調べてください。

于 2012-11-16T09:38:06.787 に答える
4

http://martinfowler.com/eaaCatalog/index.htmlの「データソースアーキテクチャパターン」セクションのパターンをご覧ください。とにかくDataMapper/ORMルートに行くことになるかもしれませんが、ActiveRecordパターンはあなたが始めるために必要なものかもしれません。

アジャイルの精神で、私は接続とトランザクション管理を最初は非常に単純に保ちます。たぶん、このクラス内の単なるプライベート関数です。次に、各メソッドにSQLまたはSPでクエリを定義させ、それを実行して結果を処理します。これにより、データアクセスロジックが適切な場所にまとめられます。

「getter」関数を共有/静的にして、インスタンスを実行する必要がないようにすることができます。次に、次のように書くことができます。

var companies = Company.GetCompanyDetails();

非常に単純ですが、このアプローチにより、スコープを拡張しながら作業を進めることができます。物事がより複雑になり始めると、このアプローチは単純すぎることがわかります。この時点で、より堅牢な接続/トランザクション管理、オブジェクトの作成、およびクエリを考慮して、拡張およびリファクタリングする必要があります。

于 2012-11-16T09:29:25.800 に答える
3

まず、あなたのコードはとても長くて古いスタイルでした。コードは次のようになります

public class Company
{       
        public string CompanyId { get; set; }
        public string CompanyName{ get; set; }
        public string CompanyType{ get; set; }       
}

このクラスを作成すると、Company3つのフィールドを持つオブジェクトを作成することになります。

Company.CompanyId、、Company.CompanyName_Company.CompanyType

したがって、今やらなければならないのは、SQLサーバーに接続し、クエリを実行してデータベースからデータを取得し、オブジェクト会社に入力することだけです。

例 :

class myConnection
    {
        public static SqlConnection GetConnection()
        {
            var company = new Company();
            string str = "Data Source=localhost/serer Ip;Initial Catalog = YourDatabaseName;uid =sa;pwd = YourPassword";

            SqlConnection con = new SqlConnection(str);          
            SqlCommand cmd = new SqlCommand("SELECT * FROM Company WHERE CompanyID = 1", conn);
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                Company.CompanyId = reader["CompanyID"];
                Company.CompanyName = reader["Name"];
                Company.CompanyType = reader["Type"];
            }
        }
    } 
于 2012-11-16T04:30:33.963 に答える
2

まず、この質問を確認することをお勧めします:ORMまたはプレーンSQLを使用していますか?。エキゾチックで重いクエリを実行しない場合は、ORMが適しています。

私はEntityFrameworkを好みますが、それらのいずれかを選択するのはあなた次第です。

次に、さらに詳しく知りたい場合は、リポジトリと作業単位のパターンを確認してください。それらを.netに実装することについての素晴らしい記事があります:リポジトリと作業単位パターンの実装

于 2012-11-16T05:17:21.267 に答える
0
String conString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
OracleConnection con = new OracleConnection(conString);
string cmdStr = @" SELECT * FROM TABLE WHERE ROW = :param";
OracleCommand cmd = new OracleCommand(cmdStr, con);
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.SelectCommand = cmd;
cmd.Parameters.Add("param", "yourValueHere");

DataSet ds = new DataSet("dataSet");
da.Fill(ds, "dataAdapter");
return ds;

データベースクラスを実装する良い方法です。また、メソッドにタグを付けることを忘れないでください

[DataObjectMethod(DataObjectMethodType.Select, true)]

WPFに実装可能にしたい場合。

于 2017-04-27T02:57:43.680 に答える
0

私の自作ADOオブジェクトマッパー:簡単なクラスを作成し、

public class Company
{       
    public string CompanyId { get; set; }
    public string CompanyName{ get; set; }
    public string CompanyType{ get; set; }       
}

オブジェクトマッピングには、次のメソッドを使用します。

public List<T> GetData<T>(string SQL, CommandType commandType, string ConnectionString) 
{
    var objProps = Activator.CreateInstance<T>().GetType().GetProperties();
    var returnList = new List<T>();
    using (SqlConnection con = new SqlConnection(ConnectionString)) {
        using (SqlCommand cmd = new SqlCommand(SQL, con)) {
            cmd.CommandType = commandType;
            cmd.CommandTimeout = 30000;
            try
            {                  
                con.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                var columns = reader.GetSchemaTable().Rows.Cast<DataRow>().Select(row => row["ColumnName"].ToString().ToLower()).ToList();
                while (reader.Read())
                {
                    var thisRow = Activator.CreateInstance<T>();
                    foreach (var prop in objProps)
                    {                         
                        if (columns.Contains(prop.Name.ToLower()))
                        {
                            prop.SetValue(thisRow, reader[prop.Name]);
                        }
                    }
                    returnList.Add(thisRow);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally {
                if (con.State != ConnectionState.Closed)
                {
                    con.Close();
                }
            }
        }
    }
    return returnList;
}

次のようなメソッドを呼び出します。

var companyInfo = GetData<Company>("ProcName", CommandType.StoredProcedure, "con-str");
于 2020-05-12T19:07:18.053 に答える
-1

以下でクラスファイルとして使用しています。

/// <summary>
/// Open the Connection when creating the Object
/// </summary>
class DataAccess
{
    public SqlConnection sqlConn ;
    public int gConnTimeOut = 0 ;

    public DataAccess()
    {
        string strConn = "";            

        Classes.GlobVaribles objConStr = Classes.GlobVaribles.GetInstance();
        strConn = objConStr.gConString;
        gConnTimeOut = objConStr.gQueryTimeOut;

        if (strConn == "")
        {
            XmlAccess XmlFile = new XmlAccess();
            strConn = XmlFile.Xml_Read("gConStr");
            gConnTimeOut = int.Parse(XmlFile.Xml_Read("gQueryTimeOut"));

            objConStr.gConString = strConn;
            objConStr.gQueryTimeOut = gConnTimeOut;
        }

        sqlConn =  new SqlConnection(strConn);            
        sqlConn.Open();
    }

    /// </summary>
    /// Can use to select one value from SELECT statment
    /// </summary>
    public string SQLER(string strSQL)
    {
        if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }

        strSQL = SQLFormat(strSQL);
        SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn);

        string strResult = sqlCmd.ExecuteScalar().ToString();
        sqlCmd.Dispose();

        return strResult;

    }

    /// </summary>
    /// Return Data Set        
    /// </summary>
    public DataSet SQLDT(string strSQL)
    {
        //conn.Close();

        //if (conn.State.ToString() == "Closed") { conn.Open(); }
        if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }
        SqlCommand comm = new SqlCommand();
        comm.CommandTimeout = gConnTimeOut;
        SqlDataAdapter adapt = new SqlDataAdapter();
        comm.CommandText = strSQL;
        comm.Connection = sqlConn;
        adapt.SelectCommand = comm;

        DataSet dtset = new DataSet();
        adapt.Fill(dtset);
        return dtset;

    }

   /// <summary>
    /// Can use for Execute SQL commands (Insert/Delete/Update)
    /// </summary>
    public int SQLCX(string strSQL)
    {
        try
        {
            if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }

            strSQL = SQLFormat(strSQL);
            SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn);
            sqlCmd.CommandTimeout = gConnTimeOut;
            int intResult = sqlCmd.ExecuteNonQuery();
            sqlCmd.Dispose();

            return intResult;
        }
        catch (Exception objError)
        {
            MessageBox.Show("System Error - " + objError.Message.ToString(),"Application Error",MessageBoxButtons.OK,MessageBoxIcon.Error );
            return -1;
        }

    }

    /// <summary>
    /// Returns a SQL DataReader
    /// </summary>       
    public SqlDataReader DataReader(string strSQL)
    {
        if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }
        strSQL = SQLFormat(strSQL);
        SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn);
        SqlDataReader dataRed = null;

        dataRed = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection);
        sqlCmd.Dispose();
        return dataRed;
    }

    /// <summary>
    /// Retrun the No of Records
    /// </summary>
    public int GetNumOfRec(string strSQL)
    {
        /// Use for get No of Records in SELECT command
        try
        {
            int intResult = -1;
            if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }

            strSQL = SQLFormat(strSQL);
            SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn);
            intResult = (int)sqlCmd.ExecuteScalar();
            sqlCmd.Dispose();

            return intResult;
        }
        catch (Exception objError)
        {
            MessageBox.Show("System Error - " + objError.Message.ToString(), "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return -1;
        }
    }

    /// </summary>
    /// Fill Listview 
    /// </summary>
    public void ListViewFill(string strSQL, System.Windows.Forms.ListView lstView)
    {
        if (sqlConn.State.ToString() != "Open") { sqlConn.Open(); }
        SqlDataAdapter adapter = new SqlDataAdapter(strSQL, sqlConn);            
        DataSet ds = new DataSet("glorders");
        adapter.SelectCommand.CommandTimeout = gConnTimeOut;
        adapter.Fill(ds, "glorders");

        DataTable dt = ds.Tables[0];
        int colCount = dt.Columns.Count;

       lstView.Items.Clear();
       Color shaded = Color.FromArgb(240, 240, 240);
       int j = 0;

        foreach (DataRow row in dt.Rows)
        {
            string[] subitems = new string[colCount];

            object[] o = row.ItemArray;


            for (int i = 0; i < colCount; i++)
            {
                subitems[i] = o[i].ToString();                      
            }

            ListViewItem item = new ListViewItem(subitems);
            lstView.Items.Add(item);

            if (j++ % 2 == 1)
            {
                item.BackColor = shaded;
                item.UseItemStyleForSubItems = true;
            }
        }

        dt.Dispose();
        ds.Dispose();
        adapter.Dispose();
    }

    /// </summary>
    /// Fill ComboBox
    /// </summary>
    public void ComboFill(string strSQL, System.Windows.Forms.ComboBox dbCombo)
    {
        SqlDataReader dbReader = null;
        dbReader = DataReader(strSQL);
        dbCombo.Items.Clear();
        while (dbReader.Read()) { dbCombo.Items.Add(dbReader[0].ToString().Trim()); }
        dbReader.Dispose();
    }

    private string SQLFormat(string strSQL)
    {
        strSQL = strSQL.Replace("\r", " ");
        strSQL = strSQL.Replace("\n", " ");
        strSQL = strSQL.Replace("\t", " ");
        strSQL = strSQL.Replace("  ", " ");
        return strSQL;
    }
}
于 2017-11-02T11:17:07.030 に答える