Access数据库C#读写验证

1、数据库简介

      Access数据库是一个相当古老的文件型数据库,主打一个简单+方便,没有复杂的安装过程,没有庞大的后端管理,整个数据库就是一个文件。可以像普通文件一样复制和修改,可以同时读写。

    在小型系统中,还是有较多的存量系统在使用Access数据库,相对简单的文件存储,还是有很大的进步。Access是关系型数据库,数据是结构化存储,数据的关系和格式,相对文件严谨很多。

2、数据库定义

     定义数据库表Measurement,定义几个字段。

2、写入代码片段

using System.Data.OleDb;

OleDbConnection odcConnection=null;
string fileName = "D:\\Tools\\Pascal.mdb";
//*********连接本地ACCESS数据库************************
String sAccessConnection = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + fileName;
odcConnection = new OleDbConnection(sAccessConnection);
odcConnection.Open(); //打开连接

Random ranValue = new Random();
int wdCount = 0;
int wdErrCount = 0;
private void WriteAccessData()
{
	int FieldCount = 0;
	Stopwatch sw = new Stopwatch();
	sw.Start();
	try
	{
		OleDbCommand odCommand = odcConnection.CreateCommand(); //建立SQL查询

		//3、输入查询语句
		string dtStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

		double f = ranValue.NextDouble()*1000;
		string sqlCmd = $"INSERT INTO Measurement (站点名称,日期时间,Data_1,Data_2,Data_3,Data_4,Data_5) VALUES ('站点1','{dtStr}','{f}','{f}','{f}','{f}','{f}')";
		odCommand.CommandText = sqlCmd;
		odCommand.ExecuteNonQuery();  //建立读取
	  
		//*********连接本地ACCESS数据库************************
		Console.WriteLine($"Write Count:{++wdCount},FieldCount:{FieldCount},Elapsed(s):{sw.Elapsed.TotalSeconds}");
	}catch (Exception ex)
	{
		wdErrCount++;
		Console.WriteLine($"write err:{ex.Message}");
	}
}

通过定时写入观察,在数据量持续增加,数据文件到达100MB+后,数据的写入性能没有明显变化。

3、数据读取

OleDbConnection odcConnection = null;
private void GetAccessData()
{
   string rcStatus = "";
   int FieldCount = 0;
   Stopwatch sw = new Stopwatch();
   sw.Start();
   try
   {
	   readCount++;
	   //*********连接本地ACCESS数据库************************
	   String sAccessConnection = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = "+ fileName;
	   if (odcConnection==null)
	   {
			 odcConnection = new OleDbConnection(sAccessConnection);
			 odcConnection.Open(); //2、打开连接
	   }
	   {
		   string sqlCmd = "SELECT TOP 1 * FROM Measurement ORDER BY 日期时间 DESC";
	   
		   //查询数据,仅读取第一条记录
		   using (OleDbCommand odCommand = odcConnection.CreateCommand())
		   {
			   odCommand.CommandText = sqlCmd;
			   infoRunMsg = sqlCmd;
			   using (DbDataReader odrReader = odCommand.ExecuteReader())
			   {
				   while (odrReader.Read()) //查询并显示数据
				   {
					   FieldCount = odrReader.FieldCount;
					   for (int i = 0; i < odrReader.FieldCount; i++)
					   {
						   var f = odrReader.GetName(i);
						   var v = odrReader.GetValue(i);
						   //Console.WriteLine($"{f}:{v}");
					   }
					   break;
				   }

			   }
		   }
	   }
	   //*********连接本地ACCESS数据库************************
	   rcStatus = "Ok";
	   Console.WriteLine($"Read Count:{readCount},Err:{readErrCount},FieldCount:{FieldCount},Elapsed(s):{sw.Elapsed.TotalSeconds}");
   }catch (Exception ex)
   {
	   odcConnection?.Close();
	   odcConnection = null;
	   readErrCount++;
	   rcStatus = ex.Message;
	   Console.WriteLine("Read Err:"+ex.Message);
   }
}

   读取数据时,随着数据量的增加,性能有明显的下降,这点与其他数据库有点类似。

4、读取数据的优化

      读取数据的优化方面,Access和普通的数据库有点类似,可以尝试常规的方法来改进读取性能。

4.1 加上时间过滤条件优化        

        我们数据定义中有时间参数,加入时间过滤条件筛选SQL不需要的数据时,可以明显改善性能。比如将上面的SQL改为:

“SELECT TOP 1 * FROM Measurement where 日期时间>\"2024-01-01 12:00:00\" ORDER BY 日期时间 DESC”,性能提升明显。

4.2 使用具体列名称替代"*"

      继续优化,使用具体列名称替代SELECT *,新的SQL如下:

"SELECT TOP 1 站点名称,日期时间,Data_1,Data_2,Data_3,Data_4,Data_5 FROM Measurement where 日期时间>\"2024-01-01 12:00:00\" ORDER BY 日期时间 DESC",也有比较明显的改善。

本文介绍C#访问操作Access数据库的基础知识,并提供一个相关的例程。 1.通过ADO.NET的OleDb相关类来操作Access 主要知识点如下: using System.Data.OleDb; using System.Data; 连接字符串:String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=product.mdb"; 建立连接:OleDbConnection connection = new OleDbConnection(connectionString); 使用OleDbCommand类来执行Sql语句: OleDbCommand cmd = new OleDbCommand(sql, connection); connection.Open(); cmd.ExecuteNonQuery(); 2.取得Access自增标识字段在插入数据后的id值 cmd.CommandText = @"select @@identity"; int value = Int32.Parse(cmd.ExecuteScalar().ToString()); return value; 3.执行事务 需要用到OleDbTransaction,关键语句如下: OleDbConnection connection = new OleDbConnection(connectionString); OleDbCommand cmd = new OleDbCommand(); OleDbTransaction transaction = null; cmd.Connection = connection; connection.Open(); transaction = connection.BeginTransaction(); cmd.Transaction = transaction; cmd.CommandText=sql1; cmd.ExecuteNonQuery(); cmd.CommandText=sql2; cmd.ExecuteNonQuery(); transaction.Commit(); 4.执行查询,返回DataSet OleDbConnection connection = new OleDbConnection(connectionString); DataSet ds = new DataSet(); connection.Open(); OleDbDataAdapter da = new OleDbDataAdapter(sql, connection); da.Fill(ds,"ds"); 5.分页查询 分页查询使用OleDbDataReader来取数据,并将结果写到一个DataSet中返回。 以上内容封装为三个可重用的类:AccessDBUtil,AccessPageUtil,Page 代码这里下载AccessDBUtilDemo.rar (191.37 KB , 下载:999次) 本例程是一个c#的winform程序,但是数据访问类可以在Web环境下使用。 本例程演示了: 1.Access数据库的插入,更新,修改,查询; 2.带参数的sql语句的使用,而不是拼SQL; 3.使用DataReader的分页查询,而不是用嵌套的SQL语句来分页; 4.用事务同时执行多个SQL语句; 5.在插入数据的同时返回最新的ID值; 6.整型,实型,字符串,日期型,布尔型五种数据类型的操作; 7.使用正则表达式来验证整数和实数; 8.listview用来显示数据的一些基本用法。 本示例不包括: 1.高效的分页查询,仅仅是提供了一种分页的方法,但我认为DataReader应该比嵌套的SQL语句快(未测试)。 2.完善的分页封装,只提供了分页的简单包装。 3.嵌套的事务处理,提供了同时执行多个sql语句的事务处理,但不支持嵌套事务。 4.listview的使用,只是利用winform控件来演示数据访问,因此不能作为winform编程的良好示例,例如添加数据时界面并没有很好地更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值