C# 数据库概念相关 访问MySQL的方法

前几天说了下多线程的一些东西,今天突然看到数据库的一些问题,我觉得我个人也是比较迷糊的,所以估摸着大多数跟我差不多的猿们也是一样的,除非你马上说出来神马是ODBC,OLEDB,ADO,DAO我肯定服。
数据库的东西实在太多了,反正就是多的让你脑子糊掉的感觉,要是再加上一些技术命名就更昏了。。。
还是说说C#这边对数据库相关的吧。

1.ODBC

最早的时候微软做了一个叫做ODBC(开放数据库互连,Open Database Connectivity)的东西。这是微软公司的开放数据服务结构。最开始的数据库访问程序很多都使用这种办法,比如MFC的程序

2.OLEDB

OLEDB是微软的战略性的通向不同的数据源的低级应用程序接口。这个东西是从ODBC发展起来的,属于一种底层的访问技术,因此OLEDB的API 可以是客户应用程序能从底层设置和控制数据库,完成一些高级数据库技术无法完成的功能。OLE DB不仅包括ODBC的SQL能力,还有面向其他非SQL的方法。
OLEDB的实质是一组读写数据的方法。OLEDB中的对象主要包括数据源对象、阶段对象、命令对象和行组对象。

3.ADO

后来在oledb上又发展出了ADO(ActiveX Data Objects)技术.需要注意ADO技术不是ADO.NET!!!
ADO是火了很长时间的!其实那个时候,先有了ASP,然后java觉得ASP很不错,于是就有了JSP,而微软发现java的虚拟机不错,就又学过来了,就有了.NET!(不得不说大家都是互相学习的,为毛有人觉得C#垃圾啊。后来PHP出来了asp就不行了。。。ado用的最多还是asp网站)

4. ADO.NET:

随着.NET的发展,好像什么东西都要加个.NET才能体现高端。。。于是就有了ADO.NET.需要注意的是,ADO.NET是与数据库连接操作的方法,简单的说就是一个类库,而ADO是一种面向对象的编程接口(可以理解是OLEDB的接口封装),所以他们两不是一个东西。
ADO.NET的主要组件有:

  • Connection对象:与数据源建立连接,连接sql server7.0 或更新版本数据库用SqlConnection,连接OLEDB数据源使用- OledbConnection.
  • Command 对象:对数据源执行SQL命令并返回结果,SQL Server7.0或更新版本用SqlCommand,OLE DB数据源使用OledbCommand.
  • DataReader对象: 读取数据源的数据,只能将数据源的数据从头到尾依次读出,Sql server7.0或以上版本使用SqlDataReader,Oledb数据源使用OledbReader
  • DataAdapter对象:对数据源执行操作并返回结果,在DataSet与数据源之间建立通信,将数据源中的数据写入DataSet ,或根据DataSet中的数据必定数据源。
  • DataSet:对象服务器内存中的数据库
  • DataView对象: 用于显示DataSet中的数据

由于我长期使用免费的MySQL,这里就对MySQL的使用写个代码啦。
MySQL可以用MySQL Connector for .NET。该组件是MySQL为ADO.NET访问MySQL数据库设计的.NET专用访问组件。完成该组件后,需要在项目中引用这个组件,命名空间是 MySql.Data.
下面封装一个MySQL的连接访问类:

    /// 
    /// DBConnection是数据库连接类
    /// 
    public class DbConnection
    {
        //下面是设置数据库的连接字符串
        string dblink = "";
        private MySqlConnection conn = new MySqlConnection();

        /// 
        /// 构造函数,初始化sqlConn.ConnectionString的值
        /// 
        public DbConnection()
        {
            dblink = DbConfig.GetDbConfig() + ";Connection Timeout=3;Charset=utf8";
            //dblink = "server=localhost;Uid=root;Pwd=xiaowen;Database=radiomonitor";
            conn.ConnectionString = dblink;
        }
        /// 
        /// 重载DbConnection,传入不同的参数
        /// 
        public DbConnection(string strServer, string strDatabase, string strUid, string strPwd)
        {
            dblink = string.Format("server={0};database={1};uid={2};pwd={3};Connection Timeout=3;Charset=utf8", strServer, strDatabase, strUid, strPwd);
            conn.ConnectionString = dblink;
        }
        /// 
        /// 重载DbConnection,传入不同的参数
        /// 
        public DbConnection(string strServer, string strDatabase, string strUid, string strPwd,string timeout)
        {
            dblink = string.Format("server={0};database={1};uid={2};pwd={3};Connection Timeout={4};Charset=utf8", strServer, strDatabase, strUid, strPwd,timeout);
            conn.ConnectionString = dblink;
        }
        /// 
        /// 返回连接对象
        /// 
        public MySqlConnection Conn
        {
            get
            {
                return conn;
            }
        }
        /// 
        /// 测试连接是否打开
        /// 
        public bool IsOpen()
        {
            try
            {
                conn.Open();
                return true;
            }
            catch (System.Exception ex)
            {               
                return false;
            }
        }

        /// 
        /// 获取数据库服务器的IP,数据库的名称、用户名、密码
        /// 从文件DbConfig.xml中获取数据库连接字段
        /// 
        /// 返回数据库连接字符串
        public static string GetDbConfig()
        {
            string strServer, strDatabase, strUid, strPassword;

            XmlDocument xd = new XmlDocument();
            string path = System.Windows.Forms.Application.StartupPath + "\\DbConfig.xml";
            xd.Load(path);

            XmlNode nodeServer = xd.SelectSingleNode("/configuration/sqllink[@key='sqlLink']/server");
            strServer = nodeServer.InnerText;

            XmlNode nodeDatabase = xd.SelectSingleNode("/configuration/sqllink[@key='sqlLink']/database");
            strDatabase = nodeDatabase.InnerText;

            XmlNode nodeUid = xd.SelectSingleNode("/configuration/sqllink[@key='sqlLink']/uid");
            strUid = nodeUid.InnerText;

            XmlNode nodePassword = xd.SelectSingleNode("/configuration/sqllink[@key='sqlLink']/password");
            strPassword = nodePassword.InnerText;

            return
                "server=" +
                strServer +
                ";database=" +
                strDatabase +
                ";uid=" +
                strUid +
                ";pwd=" +
                strPassword;
        }
    }

    /// 
    /// 测试类
    /// 
    public class DbTest
    {  
        public static bool  Test(string strServer, string strDatabase, string strUid, string strPwd,string timeout)
        {
            try
            {
                string dblink = "";
                MySqlConnection conn = new MySqlConnection();
                dblink = string.Format("server={0};database={1};uid={2};pwd={3};Connection Timeout={4};Charset=utf8", strServer, strDatabase, strUid, strPwd, timeout);
                conn.ConnectionString = dblink; 
                conn.Open(); 
                if (conn.State==System.Data.ConnectionState.Open)
                {
                    conn.Close();
                    return true;
                }
                return false;
            }
            catch (System.Exception ex)
            {               
                return false;
            }
        }      
    }

下面是对数据库的一些操作的类(别问我为什么要和上面的类分开,单独类来做,请复习面向对象的思想!):
比如用户操作类(只是简单的列出来,请忽略代码逻辑,很久之前的一个项目中用过的代码,也别看代码有没有错了啦,都说好久了 O(∩_∩)O)

    /// 
    /// UserOperate是用户操作类,包括用户登录,增删改查用户资料
    /// 
    public class UserOperate
    {
         /// 
        /// UserLogin用户登录
        /// Author: SumcRonnie, Data: 2012.6.8
        /// 
        /// 用户名
        /// 密码
        /// 用户角色
        /// true/false
        public static bool UserLogin(string strName, string strPwd)
        {
            //使用Password类进行加密
            string strsql = string.Format("SELECT USER_ID,REAL_NAME,ROLE_ID FROM WIR_USER_INFO WHERE USER_NAME='{0}' AND PASSWORD='{1}'", strName, Password.Encrypt(strPwd));

            DbConnection db = new DbConnection();
            try
            {
                db.Conn.Open();
                DataSet ds = MySqlHelper.ExecuteDataset(db.Conn, strsql);
                if (ds!=null&&ds.Tables.Count!=0&&ds.Tables[0].Rows.Count!=0)
                {
                    int userid = Convert.ToInt32(ds.Tables[0].Rows[0]["USER_ID"].ToString());
                    string realname = ds.Tables[0].Rows[0]["REAL_NAME"].ToString();
                    string hostip = GetHostIp();
                    string nowtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    if (hostip != string.Empty)
                    {
                        if (IsExistedOnline(userid) == true)
                        {
                            //更新在线用户表中的记录
                            UpdateOnlineInfo(userid, hostip, 12);
                        }
                        else
                        {
                            //将用户添加到在线用户表中
                            AddOnlineInfo(userid, hostip, 12);
                        }
                        //添加登录日志
                        AddSystemLog(realname, hostip);
                        //将该用户****未停止的任务停止
                        TaskOperate.UpdateTaskStatus(userid);
                    }
                    db.Conn.Close();
                    return true;
                }
                else
                {
                    db.Conn.Close();
                    return false;
                }
            }
            catch (MySqlException ex)
            {
                if (db.Conn.State == ConnectionState.Open)
                {
                    db.Conn.Close();
                }
                StackFrame sf = new StackFrame(true);
                string codeInfo = sf.GetFileName().ToString() + ":" + sf.GetMethod().ToString() + ":" + sf.GetFileLineNumber().ToString();
                LogHelper.Error(codeInfo + "\tEX:" + ex.Message);
                return false;
            }
        }
    }

这里之所以会用单次连接的方式,是因为在使用过程中发现MySQL数据库的连接数有比较大的问题,为了减少压力,采用了用一次连一次的方式而不是长连接。

好吧,作为技术渣渣就不说太多了,数据库这边的东西实在太多,奈何我只是了解一点最渣渣的东西,让各位看客见笑了,有错误还望指正哟 O(∩_∩)O哈哈~

最后再贴一个大神的问答帖子中的一个回答:

ODBC 是一种底层的访问技术,因此,ODBC API 可以是客户应用程序能从底层设置和控制数据库,完成一些高级数据库技术无法完成的功能;但不足之处由于ODBC只能用于关系型数据库,使得利用ODBC很难访问对象数据库及其他非关系数据库。

DAO 提供了一种通过程序代码创建和操纵数据库的机制。最大特点是对MICROSOFT JET数据库的操作很方便,而且是操作JET数据库时性能最好的技术接口之一。并且它并不只能用于访问
这种数据库,事实上,通过DAO技术可以访问从文本文件到大型后台数据库等多种数据格式。

ADO 是基于OLE DB的访问接口,它是面向对象的OLE DB技术,继承了OLE DB的优点。属于数据库访问的高层接口。


访问接口 易用性 运行性能 可扩展性 突出特点 能否访问非关系数据源 技术层次

ODBC 差 较高 差 可进行底层控制 否 底层

MFC ODBC 好 一般 通用标准,应用广泛 否 高层

MFC DAO 好 较高 一般 访问JET性能最好 能 高层

OLE DB 较难 高 好 可访问非关系DB 能 底层

ADO 最好 高 好 可访问非关系,有多种编程接口 能 高层


你可能感兴趣的:(桌面应用)