本文作者:左安坤
我们在编写软件时,有的项目根本就不用像Sql server,Oracle大型的数据库进行配合,有些小项目小得都不愿意用数据库,可是不用数据库总觉得不太方便,用xml或文本文件总感觉怪怪的,而且操作起来还是觉得操作数据库比较顺手,所以桌面级数据库Access站了出来.....(嗯,其实它并没站出来,是人们把它拉出来的^_^)
既然站出来了,就得使用它,用传统的方式“连接”--“添加,查询,修改,删除”足矣,可是有段时间对于web应用来说有点困扰,Sql注入使得许多小站被灌了许多莫明的数据进来,甚至还篡改了管理员的帐号和密码。于是有人提出用OleDbParameter来进行往数据库中添加,但这又引出来了另一个问题,C#的数据类型是:int,string,long,double,float,decimal,DataTime等等,而Access数据库里面的数据类型是:文本,数字,备注,日期,货币,在用C#往Access通过OleDbParameter往里加入数据时,这个数据类型应该怎么对照就成了一个难题,纵遍互联网上没找到相应的表,虽然有一些,但不全,本作者就对这一问题进行了一个简单的示例程序,仅以Access2003为例,(Access2007只听说过,还没用过哪)
在根目录建立一个数据库,库名为:TestAccess.mdb
表为:books
字段:
bk_id(自动编号),bk_name(文本),bk_nums(数字),bk_money(货币),bk_content(备注),bk_date(日期)
数据库建好了,就可以用C#连接数据库,并对数据库进行操作了.
private string connstr = "provider=microsoft.jet.oledb.4.0;data source=TestAccess.mdb"; //连接字串
private OleDbConnection conn; //连接对象
private void button1_Click(object sender, EventArgs e) //添加按钮的事件
{
try
{
conn = new OleDbConnection(connstr); //实例化一个连接对象
conn.Open(); //打开数据库
string sql = "insert into books(bk_name,bk_nums,bk_money,bk_content,bk_date) Values(@bookName,@bkNumbers,@bkMoney,@bkContent,@bkDate)"; //插入语句
OleDbCommand rs = new OleDbCommand(sql, conn);
OleDbParameter[] oa = new OleDbParameter[]{new OleDbParameter("@bookName", OleDbType.VarChar, 50, "bk_name"),
new OleDbParameter("@bkNumbers", OleDbType.Integer, 0, "bk_nums"),
new OleDbParameter("@bkMoney", OleDbType.Currency, 0, "bk_money"),
new OleDbParameter("@bkContent", OleDbType.LongVarWChar, 0, "bk_content"),
new OleDbParameter("@bkDate", OleDbType.DBTimeStamp, 0, "bk_date")};
rs.Parameters.AddRange(oa);
rs.Parameters["@bookName"].Value = textBox1.Text; //Access数据库中对应:文本类型
rs.Parameters["@bkNumbers"].Value = int.Parse(textBox2.Text); //数字类型
rs.Parameters["@bkMoney"].Value = decimal.Parse(textBox3.Text); //货币类型 对应 decimal
rs.Parameters["@bkContent"].Value = richTextBox2.Text; //备注类型
rs.Parameters["@bkDate"].Value = Convert.ToDateTime(textBox4.Text); //对应日期类型
rs.UpdatedRowSource = UpdateRowSource.None;
rs.ExecuteNonQuery();
MessageBox.Show("添加成功","好消息:");
richTextBox1.Text = String.Empty;
Show_data();//显示数据库中的记录
}
catch (Exception ex)
{
MessageBox.Show(ex.Message,"坏消息:");
}
finally
{
if (conn != null)
conn.Close();
}
}
private void Show_data() //显示数据库中的数据
{
try
{
conn = new OleDbConnection(connstr);
conn.Open();
string sql = "select * from books";
OleDbCommand rs = new OleDbCommand(sql, conn);
OleDbDataReader mrs = rs.ExecuteReader();
string data = "";
while (mrs.Read())
{
data += String.Format("编号:{0},名称:{1},数量:{2},售价:{3},上架日期:{5}\n-----------------\n简介:\n{4}\n-----------------\n", mrs[0], mrs[1], mrs[2], mrs[3],mrs[4],mrs[5]);
}
mrs.Close();
richTextBox1.Text = data;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message,"坏消息:");
}
finally
{
if (conn != null)
conn.Close();
}
}
-----------------------------------------------------------------------
以上代码经过本人反复试验多次,测试C#对照Access数据库的数据类型没问题,可以放心大胆无畏的使用,哦了,本篇日志到此为止。供需要的朋友一起分享。知识无国界,无边界……
本来想开发一个“图书管理系统”耍耍来着,结果遇到了上述问题,于是图书管理系统很不幸的在搞到一半时‘夭折’了,于是痛下决定查阅了许多文摘,又亲身试验了数次,终将数据类型不对应问题搞定,“图书管理系统”又可以接着进行开发了。
附:测试时的结果
编号:1,名称:七龙珠,数量:150,售价:23.68,上架日期:2010-6-11 16:06:00
-----------------
简介:
这是一部非常好看的漫画,它陪着许多80后度过了美好的童年时代,并且被改编成了红透整个日本的动画片,她的影响力,至今无人能及。
-----------------
|