zoukankan      html  css  js  c++  java
  • C#连接Access数据库(详解)

    做一个用VS2012的C#连接Access数据库的备忘, SQL数据库固然强大,有大微软的强力技术支持,LINQ的方便操作,但是如果写一个小程序对数据库方面没有什么大的要求的话,将来在数据库方面就可以选择使用access数据库,这样就能省去一定的开支.

    首先,我们建一个数据库,因为大家使用的office版本不同,有用2000的有用2003的还有用 2007或者2010的.我用的是2007,但是无论用哪个版本请把建的数据库建为.mdb结尾的2003版本的不要建 .accdb结尾的.

    建一个表,请先在设计视图里面设计列名,主键以及类型等 我们这里做一个简单的水果表,如图 你的数据库名为fruit.mdb,这个保存完后是一个数据库文件,里面可以包含各种表,里面的我们建了一个表也叫fruit请区分.建完表后请另存为 2002-2003格式的.mdb文件设置好保存路径.

    _________________________________________________还是那华丽的分割线_____________________________________________________

    表建完了,运行VS2012,我们做一个winform的小应用.

    拖入个DataGridView和一个Button做个界面

    代码

    using System.Data;
    using System.Data.OleDb;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace winform_access
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }private void button1_Click(object sender, EventArgs e)
            {
                OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\fruit.mdb"); //Jet OLEDB:Database Password=
                OleDbCommand cmd = conn.CreateCommand();
    
                cmd.CommandText = "select * from fruit";
                conn.Open();            
                OleDbDataReader dr = cmd.ExecuteReader();
                DataTable dt = new DataTable();
                if (dr.HasRows)
                {
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        dt.Columns.Add(dr.GetName(i));
                    }
                    dt.Rows.Clear();
                }
                while (dr.Read())
                {
                    DataRow row = dt.NewRow();
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        row[i] = dr[i];
                    }
                    dt.Rows.Add(row);
                }
                cmd.Dispose();
                conn.Close();
                dataGridView1.DataSource = dt;
            }
        }
    }

    这里面连接语句和SQL很像,就是把SqlConnection换成OleDbConnection,别忘了添加引用using System.Data.OleDb;

    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\fruit.mdb" 拼接字符串,

    如果怕有拼写错误也可以运行   视图--服务器资源管理器--右键数据连接--添加一个Access数据库源并找到文件路径,然后生成完后在属性里面复制字符串连接,如图

    测试链接 连接成功后复制粘贴到OledbConnection()里面.

    如果遇到转译不识别 请把处改为 \或者 ""前面加@ 如"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\fruit.mdb" 或者@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\fruit.mdb"

    _________________________________________________还是那华丽的分割线_____________________________________________________

    如果出现  未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。

    在菜单 “项目”的最下面 工程属性  菜单,选择“生成”选项卡,将目标平台由“Amy CPU”或者“*64”改成“*86”。

       点击 配置管理器  新建一个x86的

    运行

    _________________________________________________还是那华丽的分割线_____________________________________________________

    番外篇

    这里面的 if (dr.HasRows) while (dr.Read())

    如果用

        if (dr.Read())
                {
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        dt.Columns.Add(dr.GetName(i));
                    }
                    dt.Rows.Clear();
                }
                while (dr.Read())
                {
                    DataRow row = dt.NewRow();
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        row[i] = dr[i];
                    }
                    dt.Rows.Add(row);
                }

    数据少了第一条!,Read() 读到数据返回true但是从第二条开始读

    datareader.HasRows 只是检则库中是否有记录,如果有则返回true,还得再用read()读取.
    datareader.read()为从数据开头往后读,如果库中已读到结尾了(可能没有记录)则返回false,如果用在if中,则会自动读出一条,else里则不必再用read(),如果有while(含有read()条件),则自动从第二条开始往下读
    结论:单条可用read()检测,多条用到while时用HasRows检测...
    
    声明:SqlDataReader 提供一种从 SQL Server 数据库读取行的只进流的方式。无法继承此类。
    
    我在编写一个小程序时遇到一个小问题:
    
    使用SqlDataReader实例reader的HasRows判断数据流中是否存在数据,进而执行数据的输出操作,其中用到代码如下
    
    SqlDataReader reader = Command.ExecuteReader();
    while(reader.HasRows)
    {
    reader.Read();
    qx_Str = reader[0].ToString(); //出错位置
    }
    reader.Close();
    sqlcon.Close();
    
    运行后在红色位置报错:在没有任何数据时进行无效的读取尝试
    
    出现这种情况很明显是读取器运行到的位置无数据流,无法执行数据的输出
    
    这时确定判断是while处的判断条件有误,在MSDN文档中查询到:
    
    HasRows属性
    
    // HasRows 获取一个值,该值指示 System.Data.SqlClient.SqlDataReader 是否包含一行或多行。
    
    原来是出在HasRows的使用上,只要SqlDataReader存在数据流(数据流不为空)则返回的bool值为真,这样的话,这个循环总执行(难怪使用try ..catch 假死)。数据为空时,read[0]读取数据时,则会出现错误!
    
    那么如何避免出现该错误呢,仍然是用HasRows属性?
    
    可以想到只需利用if语句取消循环状态!!
    
    那么要用while怎么办呢?使用SqlDataReader实例的Read()方法,对!
    
    让我们认识一下Read()方法:
    
    // 摘要: 使 System.Data.SqlClient.SqlDataReader 前进到下一条记录。
    // 返回结果: 如果存在多个行,则为 true;否则为 false。
    
    则只需将reader.Read()替换reader.HasRows执行循环,为什么行呢?
    
    SqlDataReader的默认位置在[第一条记录前面]。因此,必须调用 Read 来开始访问任何数据。
    
    Read()为前进到下一条记录。当循环执行到Read()无数据时,则循环结束!!不过还要将循环里的Read()去掉,则每循环一次前进了两行数据。
            }

    FieldCount

    是读取有多少列字段,这里是返回的一个整数,读取到的列的个数.





  • 相关阅读:
    [笔记]一道C语言面试题:IPv4字符串转为UInt整数
    linux内核代码注释 赵炯 第三章引导启动程序
    bcd码
    2章 perl标量变量
    1章 perl入门
    perl第三章 列表和数组
    浮动 float
    文字与图像
    3.深入理解盒子模型
    4.盒子的浮动和定位
  • 原文地址:https://www.cnblogs.com/18553325o9o/p/4676617.html
Copyright © 2011-2022 走看看