文号
822151
阅读
8193
回复
3
收藏
1
C#创建和连接Access数据库
2016/07/02
IP:四川

Access数据库虽然以性能差劲著称,但是在微型应用中还是挺方便的。

首先确认你的工程是32位(默认的Any不行),这里应该显示为x86或Win32,如果不是需要先修改。这主要是因为创建数据库使用的COM组件ADOX不支持64位,连接数据库的Jet引擎也不支持64位(新版数据库引擎不自带,需要安装一个比较大的库,使用比较麻烦)。

0.png

然后需要添加ADOX这个COM组件:

1.png

创建数据库使用ADOX.Catalog的Create命令:

using ADOX;
static void CreateDB(string filePath)
{
    Catalog catalog = new Catalog();
    if (!File.Exists(filePath))
    {
        catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Jet OLEDB:Engine Type=5");
    }
    catalog = null;
    GC.Collect();
}

连接Access数据库通常使用OLEDB,连接字符串如下:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件名;Jet OLEDB:Engine Type=5"

全部代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using System.IO;
using ADOX;
using System.Data;
using System.Data.OleDb;
using System.Data.Common;

namespace ConsoleApplication1
{
    class Program
    {
        static string mdbfile = "sss.mdb";

        static void Main(string[] args)
        {
            try
            {
                CreateDB(mdbfile);
                using (DbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + mdbfile + ";Jet OLEDB:Engine Type=5"))
                {
                    conn.Open();
                    using (DbCommand cmd = conn.CreateCommand())
                    {
                        try
                        {
                            cmd.CommandText = "create table sss (id int, name varchar);";
                            cmd.ExecuteNonQuery();
                        }
                        catch (DbException ex)
                        {
                        }
                        cmd.CommandText = "insert into sss values(1, 'acmilan');";
                        cmd.ExecuteNonQuery();
                        cmd.CommandText = "insert into sss values(2, '中文字符');";
                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        static void CreateDB(string filePath)
        {
            Catalog catalog = new Catalog();
            if (!File.Exists(filePath))
            {
                catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Jet OLEDB:Engine Type=5");
            }
            catalog = null;
            GC.Collect();
        }
    }
}
[ 修改于10年5个月前 - 2016/07/02 11:54:45 ]
acmilan作者
10年5个月前修改于 10年5个月前IP:四川
822154
1楼

轻量级数据库建议使用SQLite(不支持Win98/Me/NT4,因为最低要求.NET 2.0 SP2)

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

新系统可以使用Microsoft SQL Server 2012/2014/2016 Express LocalDB

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

注意虽然SQL Server 2016 Express版本不再支持Win7,但是LocalDB版本仍然支持Win7。

引用
评论
acmilan作者
10年5个月前修改于 10年5个月前IP:四川
822173
2楼

微软的各种数据库连接技术介绍:

  • DAO -- 数据访问对象。Microsoft Jet引擎(Access/Excel 2003格式数据库)的封装
  • ODBC -- 开放数据库连接。连接数据库的标准技术,可以在没有其它方法时使用。注意MFC等框架的老版本可能不支持Unicode的ODBC连接
  • RDO -- 远程数据对象。是ODBC的封装,用于远程访问
  • OLEDB -- OLE数据库。一种底层数据库连接技术。
  • ADO -- ActiveX数据对象。支持DSN、ODBC、OLEDB三种方式。
  • XXXXXXX -- .NET数据对象。是一组.NET进行数据访问的通用接口和抽象类,位于System.Data和System.Data.Common命名空间内。

DAO、RDO已经淘汰了,OLEDB难以编程,建议选择ODBC、ADO、XXXXXXX这三种方式。

怎么选择数据库连接技术:

  • 使用C/C++,不支持COM:选择ODBC
  • 使用C/C++,支持COM:选择ADO
  • 使用VB/VBA/VBScript:选择ADO
  • 使用.NET,数据库支持XXXXXXX:选择XXXXXXX
  • 使用.NET,数据库支持OLEDB:选择XXXXXXX to OLEDB
  • 使用.NET,数据库不支持其它访问方式:选择XXXXXXX to ODBC
引用
评论
acmilan作者
10年5个月前IP:四川
822179
3楼
除了使用数据库之外,也可以使用XML、JSON、YAML等结构化数据语言来保存数据,但是它们并不是数据库(Database),它们是文档(Document)。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的