前几天说了下多线程的一些东西,今天突然看到数据库的一些问题,我觉得我个人也是比较迷糊的,所以估摸着大多数跟我差不多的猿们也是一样的,除非你马上说出来神马是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的连接访问类:
/// <summary>
/// DBConnection是数据库连接类
/// </summary>
public class DbConnection
{
//下面是设置数据库的连接字符串
string dblink = "";
private MySqlConnection conn = new MySqlConnection();
/// <summary>
/// 构造函数,初始化sqlConn.ConnectionString的值
/// </summary>
public DbConnection()
{
dblink = DbConfig.GetDbConfig() + ";Connection Timeout=3;Charset=utf8";
//dblink = "server=localhost;Uid=root;Pwd=xiaowen;Database=radiomonitor";
conn.ConnectionString = dblink;
}
/// <summary>
/// 重载DbConnection,传入不同的参数
/// </summary>
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;
}
/// <summary>
/// 重载DbConnection,传入不同的参数
/// </summary>
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;
}
/// <summary>
/// 返回连接对象
/// </summary>
public MySqlConnection Conn
{
get
{
return conn;
}
}
/// <summary>
/// 测试连接是否打开
/// </summary>
public bool IsOpen()
{
try
{
conn.Open();
return true;
}
catch (System.Exception ex)
{
return false;
}
}
/// <summary>
/// 获取数据库服务器的IP,数据库的名称、用户名、密码
/// 从文件DbConfig.xml中获取数据库连接字段
/// </summary>
/// <returns>返回数据库连接字符串</returns>
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;
}
}
/// <summary>
/// 测试类
/// </summary>
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)
/// <summary>
/// UserOperate是用户操作类,包括用户登录,增删改查用户资料
/// </summary>
public class UserOperate
{
/// <summary>
/// UserLogin用户登录
/// Author: SumcRonnie, Data: 2012.6.8
/// </summary>
/// <param name="strName">用户名</param>
/// <param name="strPwd">密码</param>
/// <param name="RoleID">用户角色</param>
/// <returns>true/false</returns>
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的优点。属于数据库访问的高层接口。