欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 19.3 连接数据库

19.3 连接数据库

2025/2/13 0:32:24 来源:https://blog.csdn.net/UruseiBest/article/details/145437939  浏览:    关键词:19.3 连接数据库

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

​​​​​​​需要北风数据库的请留言自己的信箱。

连接数据库使用OleDbConnection(数据连接)类,它表示到数据源的连接。它的某些方法或属性可能不可用,这取决于本机OLE DB提供程序所支持的功能。

OleDbConnection常用属性

  1. ConnectionString:用于打开数据库的字符串。
  2. ConnectionTimeout:获取连接超时时间(以秒为单位)。
  3. Database:获取当前数据库或连接打开后要使用的数据库的名称。
  4. DataSource:获取数据源的服务器名或文件名。
  5. Provider:获取在连接字符串的“Provider=”子句中指定的OLEDB提供程序的名称。
  6. ServerVersion:获取一个包含客户端所连接到的服务器的版本的字符串。
  7. State:获取连接的当前状态。这是一个ConnectionState枚举,常用以下成员:
  1. Open:连接处于打开状态。
  2. Closed:连接处于关闭状态。
  3. Connecting:连接对象正在与数据源连接。

OleDbConnection常用方法:

  1. Open:使用ConnectionString所指定的属性设置打开数据库连接。
  2. OpenAsync:Open的异步版本。
  3. Close:关闭到数据源的连接。
  4. ChangeDatabase:为打开的OleDbConnection更改当前数据库。
  5. CreateCommand:创建并返回一个与该OleDbConnection关联的OleDbCommand对象。
  6. GetOleDbSchemaTable:应用了指定的限制之后,按照GUID的指示从数据源返回架构信息。
  7. GetSchema:返回OleDbConnection的数据源的架构信息。
  8. ResetState:更新 OleDbConnection 对象的 State 属性。

OleDbConnection常用事件:

  1. StateChange:当连接状态更改时发生。

19.3.1 连接字符串

连接Mdb数据库使用的ConnectionString提供了建立初始连接所必需的数据源名称和其他参数。通常情况下,ConnectionString由多个键值对组成,每个键值对之间用;(英文分号)隔开。

开发32位程序时,ConnectionString的写法:

  1. Provider = Microsoft.Jet.OLEDB.4.0;data source=数据库路径;

如果开发32位程序时,使用的mdb数据库设置了密码:

  1. Provider = Microsoft.Jet.OLEDB.4.0;data source=数据库路径;jet oledb:database password=密码;

开发64位程序时,ConnectionString的写法:

  1. Provider=Microsoft.ACE.OLEDB.12.0;data source=数据库路径;

如果开发64位程序时,使用的mdb数据库设置了密码:

  1. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=数据库路径;jet oledb:database password=密码;

注意:关于如何切换32位程序和64位程序开发,请参看第13.3节。

如果需要安装Microsoft Access 2016 数据库引擎可再发行程序包,可以从这里下载:

https://www.microsoft.com/zh-cn/download/details.aspx?id=54920

点击下载,会弹出64位安装包和32位安装包,请根据实际需要选择下载。

【例 19.1【项目:code19-001】连接与关闭数据库。

        OleDbConnection conn;

        private void button1_Click(object sender, EventArgs e)

        {

            conn = new OleDbConnection();

            //32位,无密码

            conn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;data source=C:\\lessons\\Northwind.mdb;";

            //32位,有密码

            //conn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;data source=C:\\lessons\\Northwind.mdb;jet oledb:database password=123456;";

            //64位,无密码

            //conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\\lessons\\Northwind1.mdb;";

            //64位,有密码

            //conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\lessons\\Northwind.mdb;jet oledb:database password=123456;";

            conn.Open();

            label1.Text = getConnState(conn.State);

        }

        private void button2_Click(object sender, EventArgs e)

        {

            conn.Close();

            label1.Text = getConnState(conn.State);

        }

        private string getConnState(ConnectionState state)

        {

            switch(state)

            {

                case ConnectionState.Open:

                    return "打开数据库";

                case ConnectionState.Closed:

                    return "已经关闭数据库";

                case ConnectionState.Connecting:

                    return "正在连接数据库";

            default:

                    return "其它状态";

            }           

        }

运行结果如下图所示:

图19-19 打开数据库

19.3.2 状态改变事件

OleDbConnection的连接状态改变时会触发StateChange事件。利用该事件提供的参数e,可以获得原连接状态和现连接状态。

【例 19.2【项目:code19-002】连接与关闭数据库。

        OleDbConnection conn;

        private void Form1_Load(object sender, EventArgs e)

        {

            conn = new OleDbConnection();

            conn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;data source=C:\\lessons\\Northwind.mdb;";

            conn.StateChange += connStateChange;

        }

        private void btnOpen_Click(object sender, EventArgs e)

        {

            conn.Open();

        }

        private void btnInfo_Click(object sender, EventArgs e)

        {

            TextBox1.Text += "DataSource:" + conn.DataSource + "\r\n";

            TextBox1.Text += "ServerVersion:" + conn.ServerVersion + "\r\n";

            TextBox1.Text += "Provider:" + conn.Provider + "\r\n";

        }

        private void connStateChange(object sender, StateChangeEventArgs e)

        {

            TextBox1.Text += "数据库由 " + getConnState(e.OriginalState) + " 变更为:" + getConnState(e.CurrentState) + "\r\n";

        }       

        private void btnClose_Click(object sender, EventArgs e)

        {

            conn.Close();

        }

        private string getConnState(ConnectionState state)

        {

            switch (state)

            {

                case ConnectionState.Open:

                    return "打开数据库";

                case ConnectionState.Closed:

                    return "已经关闭数据库";

                case ConnectionState.Connecting:

                    return "正在连接数据库";

                default:

                    return "其它状态";

            }

        }

运行结果如下图所示:

图19-20 获得连接信息

19.3.3 数据库的架构表

通过OleDbConnection类的GetOleDbSchemaTable方法可以获得数据库架构,GetOleDbSchemaTable具体语法:

public DataTable GetOleDbSchemaTable( Guid schema, Object[] restrictions )

参数说明:

  1. schema:指定需要返回的架构表类型。这是一个OleDbSchemaGuid类,提供了多个静态成员指示架构表类型,常用的成员有:
    1. Columns:返回在目录中定义的表(包括视图)的列。
    2. Tables:返回在目录中定义的表(包括视图)。
    3. Table_Constraints:返回在目录中定义的由给定用户拥有的表约束。
  2. restrictions:限制值的 Object 数组。 这些值按照限制列的顺序来应用。 即,第一个限制值应用于第一个限制列,第二个限制值应用于第二个限制列,依此类推。

返回值:

  1. 所请求的架构信息,这是一个DataTabl类型,在后面章节会做讲解。

【例 19.3【项目:code19-003】返回数据库中的表。

        OleDbConnection conn;

        private void Form1_Load(object sender, EventArgs e)

        {

            conn = new OleDbConnection();

            conn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;data source=C:\\lessons\\Northwind.mdb;";

        }

        private void button1_Click(object sender, EventArgs e)

        {

            conn.Open();

            DataTable dt;

            dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

          

            //将dataGridView1的数据源设置为dt,自动显示dt中的内容

            dataGridView1.DataSource = dt;

            conn.Close();

        }

运行结果如下图所示:

图19-21 获得数据库中的表和视图信息

以上代码获得了数据库中的自定义表、系统表、视图,如果只需要获得自定义表,可以设置GetOleDbSchemaTable的第二个参数来进行过滤,修改后的代码:

dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE"});

运行结果如下图所示:

图19-22 获得数据库中的自定义表信息

【例 19.4【项目:code19-004】获得数据库中的所有架构信息。

        OleDbConnection conn;

        private void Form1_Load(object sender, EventArgs e)

        {

            conn = new OleDbConnection();

            conn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;data source=C:\\lessons\\Northwind.mdb;";

            Type OleDbSchemaGuidType = typeof(OleDbSchemaGuid);

            foreach(System.Reflection.MemberInfo OleDbSchemaGuidType_Member in OleDbSchemaGuidType.GetMembers())

            {

                if( OleDbSchemaGuidType_Member.MemberType == System.Reflection.MemberTypes.Field )

                    comboBox1.Items.Add(OleDbSchemaGuidType_Member.Name);

            }

            comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;

            conn.Open();

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

        {

            DataTable dt;

            try

            {

                Type OleDbSchemaGuidType = typeof(OleDbSchemaGuid);

                dt = conn.GetOleDbSchemaTable((Guid)OleDbSchemaGuidType.InvokeMember(comboBox1.Text, System.Reflection.BindingFlags.GetField, null, null, null), null);

                DataGridView1.DataSource = dt;

            }

            catch( Exception ex)

            {

                MessageBox.Show("发生错误:" + ex.Message);

            }

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)

        {

            conn.Close();

        }

运行结果如下图所示:

图19-23 获得数据库Columns的架构信息

注意:并不是所有的架构信息都支持mdb数据库,所以必须在代码中设置Try……Catch语句,防止错误发生导致程序崩溃。

19.3.4 连接Excel

Excel文件也可以视为一个数据库,里面的Sheet表相当于一个数据表。

操作Excel文件,还是使用System.Data.OleDb 命名空间的OleDbConnection类。

OleDbConnection连接字符串和安装的Office版本有较大关系。

笔者分别在两台安装32位和64 Office2010的电脑上实测的情况:

安装的不论是32位还是64Office2010,都请使用以下连接字符串:

Provider = Microsoft.ACE.OLEDB.12.0;data source=Excel文件;Extended Properties='Excel 12.0 XML;HDR=YES;

但是开发时应注意:如果安装的是32Office2010,那么开发的程序只能编译为32位;如果安装的是64Office2010开发的程序可以编译为32位或64位:

如果是安装的2003版的Office,请使用以下连接字符串:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source= Excel文件;Extended Properties=‘Excel 8.0; HDR=YES;'

其中HDR表示第一行是否是标题行。如果第一行是标题行(即字段名称),那么应设置为YES;如果第一行是数据,则请设置为NO。

注意:有的教程说后缀.xlsx文件用第一种连接字符串,xls文件用第二种连接字符串,这是不正确的。

19.3.5 连接MsSql

操作MsSql数据库,应使用System.Data.SqlClient命名空间的SqlConnection类

常见的连接字符串:

1、使用当前的Windows账户进行验证:

Data Source=xxx.xxx.xxx.xxx\实例名;Initial Catalog=NorthWind;Integrated Security=True;

Data Source=(local) \实例名;Initial Catalog=NorthWind;Integrated Security=True;

Data Source=服务器名称\实例名;Initial Catalog=NorthWind;Integrated Security=True;

其中,Data Source可以替换为Server或者Address或者Addr或者Network Address。

Integrated Security设置为True,表示使用当前的Windows账户进行验证,否则应该使用MsSql的用户账户验证。

2、使用MsSql的用户账户验证:

Data Source= xxx.xxx.xxx.xxx\实例名;Initial Catalog=NorthWind;User ID=sa;Password=sa123456;

通常不建议将用户名和密码写在连接字符串内,可以在程序连接数据库时由用户输入账户名和密码,再将账户名和密码传给连接字符串。

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com