Discuz教程网

分享别人编写的C#操作Access数据库 并对Access数据类型与C#进行了对照

[复制链接]
authicon 空空 发表于 2010-11-24 09:25:53 | 显示全部楼层 |阅读模式
本文作者:左安坤
我们在编写软件时,有的项目根本就不用像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后度过了美好的童年时代,并且被改编成了红透整个日本的动画片,她的影响力,至今无人能及。
-----------------



上一篇:使用免费sqlmap工具抵御SQL注入攻击
下一篇:用C#满足了一个现实的需求
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-3 05:29

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表