• C#使用Access数据库使用总结


    话说这Access数据库确实是有点年代了,前面在深圳的一家放射医疗公司,数据库用的Access,后面在我的建议下,换成了SQLite。用SQLite多舒服,不用装Runtime,还可以用EF。Access得装Runtime,也用不了EF。

    回到长沙后,找了一家工业仪器的公司,发现也是用的Access数据库

    结果模糊查询 的时候,发现不对劲,这里总结几点C#在使用Access数据库时可能会遇到的问题

    1、连接字符串

    Access 2007 (文件后缀为.accdb)

    没有密码的情况

    1 Provider = Microsoft.Ace.OleDb.12.0;Data Source={0};Persist Security Info=False;

    有密码的情况

    1 Provider = Microsoft.Ace.OleDb.12.0;Data Source={0};Jet OleDb:DataBase Password='{1}';

    说明:实际使用时,用string.Format()函数将{0}替换成数据库路径,{1}替换成密码即可

    实际如下:

    1 Provider = Microsoft.Ace.OleDb.12.0;Data Source=D:	est.accdb;Jet OleDb:DataBase Password='123';

    Access 2003 (文件后缀为.mdb)

    将Provider替换为Microsoft.Jet.OleDb.4.0即可,如下

    1 Provider=Microsoft.Jet.OleDb.4.0;Data Source=D:	est.accdb;Jet OleDb:DataBase Password='123';
    
    

    2、不使用OleDbParameter时,日期需要使用##包起来

    有时候可能查询的语句比较简单,就不想使用参数的形式的,直接去拼SQL语句,如果判断的条件是日期,就要用##将日期包起来,不然会报错,如下

    1 var sql = "Select * From Test Where  Date BETWEEN #2021/03/13# AND #2021/03/14#";

    使用了参数,就可以不用带#。如下

    1 var sql = "Select * From Test Where  Date BETWEEN #@StartDate# AND #@EndDate#";
    2 
    3             System.Data.OleDb.OleDbParameter[] parameters = new System.Data.OleDb.OleDbParameter[]
    4                 {
    5                     new System.Data.OleDb.OleDbParameter("@StartDate","2021/03/13"),
    6                     new System.Data.OleDb.OleDbParameter("@EndDate","2021/03/14")
    7                 };

    3、使用OleDbParameter时,日期需要传字符串

    上面已经使用过参数了,这里需要注意的时,不能直接传DateTime类型,而是需要传入字符串,不然会报错。这次就是在公司遇到这个问题,调试了好久,因为太久没用Access,不记得了。

    4、在Access里执行查询时,通配符使用* ,在C#中,使用%

    例如在Access中直接执行模糊查询语句,查询包含z的姓名

    1 Select * from Test Where Name Like '*z*';

    在C#中需要将*替换成%,如下:

    1 var sql = Select * from Test Where Name Like '%z%';

    5、使用Where false可以查询表结构

    1 var sql = "Select * from Test Where false";

    这操作我以前还不知道,试了下SQL Server是不支持这操作的。 

    6、查询语句包含单引号' 时,需要用两个单引号 ''

    如:

    1 Select * from xx where Des = 'what's'

    要写成

    Select * from xx where Des = 'what''s'

     7、判断表是否存在

    调用OleDbConnectionGetOleDbSchemaTable函数,如下:

    tableName就是要查询的表名

    1 OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=a.mdb");
    2 con.Open();
    3 var dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, tableName, "TABLE" });

    GetOleDbSchemaTable会返回一个数据源架构信息的DataTable,再判断DataTable的行数是否大于0即可判断指定的表是否存在

    1 if(dt.Rows.Count > 0)
    2 {
    3     Console.WriteLine("Exist")  
    4 }
    5 else
    6 {
    7       Console.WriteLine("Not exist")  
    8 }

    通过这种方式也可以查询某个表是否存在某一列

    tableName是要查询的表名,columnName是要查询的列名

    1 con.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, tableName, columnName });

    到新公司也没写啥项目,目前就遇到这几个问题吧,做个总结。

    life runs on code

    作者: zhaotianff

    转载请注明出处

  • 相关阅读:
    使用工具进行计算机取证
    SpringBoot整合Swagger2
    Filebeat安装部署
    Mac OS X上使用Wireshark抓包
    maven集成命令-U -B -P -e -X
    轻量级Mysql Sharding中间件——Shark
    Spring MVC的WebMvcConfigurerAdapter用法收集(零配置,无XML配置)
    Unity2D音游案例-节奏大师教程+源码+素材
    4款五星级的3D模型资源包
    CandyCrush 糖果传奇源码+素材+教程
  • 原文地址:https://www.cnblogs.com/zhaotianff/p/14531965.html
Copyright © 2020-2023  润新知