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#教程 目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16869.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis实现分布式锁

一、使用分布式锁的背景是什么 1、如果你公司的业务,各个应用都只部署了一台机器,那么完全用不着分布式锁,直接使用Java的锁即可 2、可是当你们的业务量大,多台机器并发情况下争夺一个资源的时候,就必须要保证业务的…

变化检测相关论文可读list

一些用得上的: 遥感变化检测常见数据集https://github.com/rsdler/Remote-Sensing-Change-Detection-Dataset/ 代码解读:代码解读 | 极简代码遥感语义分割,结合GDAL从零实现,以U-Net和建筑物提取为例 对本list的说明:…

docker 逃逸突破边界

免责声明 本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动,包括但不限于未经授权访问计算机系统、网络或数据。 作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何…

cv2.Sobel

1. Sobel 算子简介 Sobel 算子是一种 边缘检测算子,通过对图像做梯度计算,可以突出边缘。 Sobel X 方向卷积核: 用于计算 水平方向(x 方向) 的梯度。 2. 输入图像示例 假设我们有一个 55 的灰度图像,像素…

网络编程 day3

思维导图 以select函数模型为例 思维导图2 对应 epoll模型 应使用的函数 题目 使用epoll函数实现 两个客户端 通过服务器 实现聊天 思路 在原先代码基础上 实现 服务器 发向 客户端 使用客户端在服务器上的 套接字描述符 实现 客户端 接收 服务器…

Java 同步锁性能的最佳实践:从理论到实践的完整指南

目录 一、同步锁性能分析 (一)性能验证说明 1. 使用同步锁的代码示例 2. 不使用同步锁的代码示例 3. 结果与讨论 (二)案例初步优化分析说明 1. 使用AtomicInteger原子类尝试优化分析 2. 对AtomicInteger原子类进一步优化 …

Mac之JDK安装

Mac之JDK安装 一.安装 jdk 打开终端输入命令:java -version 查看是否已安装 JDK Oracle 官方下载地址 根据自己Mac 系统安装 查看 Mac 系统,打开中断命令,输入: uname -a Compressed Archive 是压缩文档,下载的是一个 .tar.gz 压缩包 D…

[MySQL]5-MySQL扩展(分片)

随着数据量和用户量增加,MySQL会有读写负载限制。以下是部分解决方案 目录 功能拆分 使用读池拓展读(较复杂) 排队机制 🌟分片拓展写 按业务或职责划分节点或集群 大数据集切分 分片键的选择 多个分片键 跨分片查询 资料…

芯盾时代数据安全产品体系,筑牢数据安全防线

芯盾时代数据安全治理(DSG)框架,以国家法律法规、行业监管标准、行业最佳实践为依据,从数据安全战略出发,以数据分类分级为支撑,构数据安全管理体系、数据安全技术体系、数据安全运营体系与数据安全监督评价…

腾讯大数据基于 StarRocks 的向量检索探索

作者:赵裕隆,腾讯大数据研发工程师 本文整理自腾讯大数据工程师在 StarRocks 年度峰会上的分享,深入探讨了向量检索技术的原理与应用。此功能已应用到腾讯内部多个场景,引入 StarRocks 后,业务不仅不需要维护多套数据库…

STM32 RTC 实时时钟说明

目录 背景 RTC(实时时钟)和后备寄存器 32.768HZ 如何产生1S定时 RTC配置程序 第一次上电RTC配置 第1步、启用备用寄存器外设时钟和PWR外设时钟 第2步、使能RTC和备份寄存器访问 第3步、备份寄存器初始化 第4步、开启LSE 第5步、等待LSE启动后稳定状态 第6步、配置LSE为…

android studio在gradle的build时kaptDebugKotlin这个task需要执行很久

只修改了一点java代码,kaptDebugKotlin这个任务却执行了3~5分钟。。。

机器学习(李宏毅)——self-Attention

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 二、大纲 何为self-Attention?原理剖析self-Attention VS CNN、RNN、GNN 三、何为self-Attenti…

【Java使用Geotools对shp文件进行读取,读取完成之后shp、dbf、shx文件总是被占用,无法删除,如何解决呢?】

Java使用Geotools对shp文件进行读取,读取完成之后shp、dbf、shx文件总是被占用,无法删除,如何解决呢? 问题描述原因分析与问题解决1.直接原因2.解决方案 问题描述 Java使用Geotools对shp文件进行读取,读取完成之后.sh…

lvs的DR模式

基于Linux的负载均衡集群软件 LVS 全称为Linux Virtual Server,是一款开源的四层(传输层)负载均衡软件 Nginx 支持四层和七层(应用层)负载均衡 HAProxy 和Nginx一样,也可同时支持四层和七层(应用层)负载均衡 基于Linux的高可用集群软件 Keepalived Keepalived是Linux…

基于进化式大语言模型的下一代漏洞挖掘范式:智能对抗与自适应攻防体系

摘要 本文提出了一种基于进化式大语言模型(Evolutionary LLM)的智能漏洞挖掘框架,突破了传统静态分析的局限,构建了具备对抗性思维的动态攻防体系。通过引入深度强化学习与多模态感知机制,实现了漏洞挖掘过程的自适应进化,在RCE、SQLi、XXE等关键漏洞类型的检测中达到97…

java项目之基于SSM会议管理系统的设计与实现源码(ssm+mysql)

项目简介 基于SSM会议管理系统的设计与实现实现了以下功能: 基于SSM会议管理系统的设计与实现的主要使用者分为:管理员登录后修改个人的密码。用户管理中,对公司内的用户进行管理,包括会议管理员和员工,管理部门信息…

Linux第106步_Linux内核RTC驱动实验

1、了解rtc_device结构体 1)、打开“include/linux/rtc.h” rtc_class_ops是需要用户根据所使用的RTC设备编写的,其结构体如下: struct rtc_class_ops { int (*ioctl)(struct device *, unsigned int, unsigned long);/*函数指针ioctl*/ int (*read_time)(struct device *,…

java项目之基于推荐算法的图书购物网站源码(ssm+mybatis+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于推荐算法的图书购物网站项目。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于推荐算法的…

【Antv G2 5.x】饼图添加点击事件,获取当前坐标数据

// 监听 tooltip:show 事件this.chart.on(tooltip:show, (event) => {this.currentShowTooltipName = event.data.items[0].name})// 监听绘图区plot的点击事件this.chart.on(interval:click, ev => {this.$emit(chartClick, this.currentShowTooltipName);})// 监听绘图…