创建一个与SQL数据库交互的类

时间:2012-11-16 04:03:20

标签: c# oop class methods

我熟悉编程中面向对象的主要概念,目前我正在自学如何设计课程。

我有一个非常简单的类calld公司。这是我到目前为止的代码

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查询和连接放在其中?或者我只是将它们的实例作为参数传递?我应该从该方法返回的类型是什么?

有人可以给我一些指导吗?

此外,如果您有关于此主题的任何优秀教程/指南的链接,请发布它们。

谢谢。

7 个答案:

答案 0 :(得分: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。

答案 1 :(得分:4)

http://martinfowler.com/eaaCatalog/index.html处查看“数据源架构模式”部分中的模式。 ActiveRecord模式可能是您需要开始的模式,尽管您最终可能最终会使用DataMapper / ORM路由。

在敏捷精神中,我最初会保持连接和事务管理非常简单。也许只是这个类中的私有函数。然后我会让每个方法在SQL或SP中定义它的查询并执行它并对结果做一些事情。这样可以将数据访问逻辑保存在适当的位置。

您可能希望将“getter”函数设置为shared / static,这样就不需要实例了。然后你可以写下这样的东西:

var companies = Company.GetCompanyDetails();

虽然超级简单,但这种方法可以让你继续前进,同时仍然可以扩展范围。一旦事情变得越来越复杂,这种方法将变得过于简单。此时,您需要扩展和重构,考虑更强大的连接/事务管理,对象创建和查询。

答案 2 :(得分:2)

首先,你的代码太长旧了。你的代码应该是这样的

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

创建此类时,意味着您创建了一个包含3个字段的对象Company;

Company.CompanyIdCompany.CompanyNameCompany.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"];
            }
        }
    } 

答案 3 :(得分:2)

首先,我建议您检查一下这个问题:Using an ORM or plain SQL?。如果您不打算执行异国情调和繁重的查询,ORM是您的首选方案

我更喜欢实体框架,但您可以选择其中任何一种。

然后,如果您想深入了解,请查看存储库和工作单元模式。关于在.net:Implementing the Repository and Unit of Work Patterns

中实现它们的文章很好

答案 4 :(得分: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中实现。

答案 5 :(得分:0)

在下面使用我们正在使用的类文件:

/// <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;
    }
}

答案 6 :(得分: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");