前几天说了下多线程的一些东西,今天突然看到数据库的一些问题,我觉得我个人也是比较迷糊的,所以估摸着大多数跟我差不多的猿们也是一样的,除非你马上说出来神马是ODBC,OLEDB,ADO,DAO我肯定服。
数据库的东西实在太多了,反正就是多的让你脑子糊掉的感觉,要是再加上一些技术命名就更昏了。。。
还是说说C#这边对数据库相关的吧。
最早的时候微软做了一个叫做ODBC(开放数据库互连,Open Database Connectivity)的东西。这是微软公司的开放数据服务结构。最开始的数据库访问程序很多都使用这种办法,比如MFC的程序
OLEDB是微软的战略性的通向不同的数据源的低级应用程序接口。这个东西是从ODBC发展起来的,属于一种底层的访问技术,因此OLEDB的API 可以是客户应用程序能从底层设置和控制数据库,完成一些高级数据库技术无法完成的功能。OLE DB不仅包括ODBC的SQL能力,还有面向其他非SQL的方法。
OLEDB的实质是一组读写数据的方法。OLEDB中的对象主要包括数据源对象、阶段对象、命令对象和行组对象。
后来在oledb上又发展出了ADO(ActiveX Data Objects)技术.需要注意ADO技术不是ADO.NET!!!
ADO是火了很长时间的!其实那个时候,先有了ASP,然后java觉得ASP很不错,于是就有了JSP,而微软发现java的虚拟机不错,就又学过来了,就有了.NET!(不得不说大家都是互相学习的,为毛有人觉得C#垃圾啊。后来PHP出来了asp就不行了。。。ado用的最多还是asp网站)
随着.NET的发展,好像什么东西都要加个.NET才能体现高端。。。于是就有了ADO.NET.需要注意的是,ADO.NET是与数据库连接操作的方法,简单的说就是一个类库,而ADO是一种面向对象的编程接口(可以理解是OLEDB的接口封装),所以他们两不是一个东西。
ADO.NET的主要组件有:
由于我长期使用免费的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的优点。属于数据库访问的高层接口。