-
C#连接Access
如果是个人用的小程序的话。一般都推荐用Sqlite和Access
使用SQlite数据库需要安装SQLite驱动,详情:SQLite之C#连接SQLite
同样要使用Access数据库一必须安装Access驱动程序。驱动下载:http://pan.baidu.com/s/1moWje
官网下载:http://www.microsoft.com/zh-cn/download/details.aspx?id=13255
可以在收索你需要的版本。
微软ADO.NET数据提供程序
数据提供程序 | 命名空间 | 程序集 |
OLE DB | System.Data.OleDb | System.Data.dll |
Microsoft SQL Server | System.Data.SqlClient | System.Data.dll |
Microsoft.SQL Server Mobile | System.Data.SqlServerCe | System.Data.SqlServerCe.dll |
ODBC | System.Data.Odbc | System.Data.dll |
没有特定的数据提供程序直接映射到Jet引擎(比如微软的Access数据库),如果要和Acces数据文件交互,可以使用OLE DB数据提供程序或者ODBC数据提供程序。
由定义在System.Data.OleDb命名空间下的类组成的OLE DB 数据提供程序能让你访问所有支持基于传统COM的OLD DB协议的数据库,使用这个数据库提供程序,能非常简单地改变连接字符串中的“provider”,并能和各种OLE DB数据库进行通信。
如果你安装了微软的office。那么也安装了Access数据库,现在我们来一步一步完成对Access数据库的访问
打开Access数据库,选择创建数据库。选择保存路径和取名,单击创建即可
然后的界面就很熟悉了
单击 "单击以添加" 可以选择数据类型
选择类型后。比如这里选择文本类型。就可以输入字段名称
这里你会看到前面有一个默认的列ID。默认是主键。自增的。你可以选择当前列。在属性中看到,当然。你也可以改变当前字段的数据类型
为了简化操作,我这里只创建3个字段用于测试
字段名称 | 字段类型 | 字段说明 |
name | string | 姓名 |
age | int | 年龄 |
crateDate | DateTime | 添加时间(默认值是当天) |
创建时间createDate需要设置默认值,选择createDate列,在属性部分。单击默认值。输入Now(),确定即可。还可以设置表达式格式。可以自己去看
创建完成后。ctrl+s保存。输入表名称user,确定
现在创建一个控制台程序。来连接Access
添加引用:System.Data.dll,
添加命名空间:using System.Data.OleDb;
为了方便。把数据库拷贝到项目的Debug目录下面,编写测试代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data.OleDb; //引入命名空间 需要添加引用 System.Data.dll 6 7 namespace ConsoleApplication2 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //连接Access字符串 14 string conStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=userInfo.accdb;Persist Security Info=False"; 15 16 //插入数据 17 string name = "张三"; 18 int age = 18; 19 20 string sql = "insert into user(name,age)values(@name,@age)"; 21 OleDbParameter[] para = { 22 new OleDbParameter("@name",OleDbType.VarChar), 23 new OleDbParameter("@age",OleDbType.Integer), 24 /* 25 * 我不知道这样写有什么区别,除了更简单还有什么好处 26 new OleDbParameter("@age",age) 27 */ 28 }; 29 para[0].Value = name; 30 para[1].Value = age; 31 32 int rows = 0; 33 34 using (OleDbConnection connect = new OleDbConnection(conStr)) 35 { 36 using (OleDbCommand cmd = new OleDbCommand(sql, connect)) 37 { 38 if (para != null && para.Length > 0) cmd.Parameters.AddRange(para); 39 40 if (connect.State == System.Data.ConnectionState.Closed) connect.Open(); 41 42 rows = cmd.ExecuteNonQuery(); 43 } 44 } 45 46 if (rows > 0) Console.WriteLine("插入成功"); 47 Console.ReadLine(); 48 } 49 } 50 }
运行后提示错误:
仔细看sql语句是不是没有错误的语法。再仔细想想呢?对,user是关键字,需要加用[]包裹。像这样:[user]
string sql = "insert into [user](name,age)values(@name,@age)";
修改后在运行,人品爆发的成功了
是不是迫不及待的想看看Access数据库中是否真的插入成功呢?
打开数据库界面。F5刷新试试
当然,你可以可以编写sql查询
右键:
跟着一步一步下来是不是也没有想象中的那么难呢?其实什么都不难。只要你肯努力:)
来看看链接字符串:
//连接Access字符串
string conStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=userInfo.accdb;Persist Security Info=False";
这里的Microsoft.ACE.OLEDB.12.0,是连接Excel对象的接口引擎,与之对应的是:microsoft.jet.oledb.4.0
那么问题来了:
Microsoft.jet.oledb.4.0和Microsoft.ACE.OLEDB.12.0引擎有什么区别呢?
共同点:都是做为连接Excel对象的接口引擎
不同点:
对于不同的Excel版本,有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎)。
Jet 引擎,可以访问 Office 97-2003,但不能访问 Office 2007。
ACE 引擎是随 Office 2007 一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问 Office 97-2003。
另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。
所以,在使用不同版本的office时,要注意使用合适的引擎。
我这里用的Access 2007,所以用的是ACE引擎
Data Source=userInfo.accdb。这里访问的是相对路径。因为数据库放在了Debug下面,但我来自火星。我就偏偏不喜欢把数据库放到Debug下面。
我想在项目中单独创建一个目录来存放数据库。那怎么办呢?好吧。程序员是伟大的。那你可以改路径,在项目下面创建一个db文件夹。把数据集拷贝到里面,结构图
从图可以看出来,从Debug目录到db目录要退两次,那么不就是 “..\..\” 。对吗?
那立马改改看看效果:
string conStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\..\db\userInfo.accdb;Persist Security Info=False";
对与否。你自己去测试下。哈哈。
记住:sql server中是可以拼接多条sql语句。然后一次性执行的。对吧,但Access是不行的。如果要执行多条sql语句。必须循环遍历。执行一条在执行下一条,直到海枯石烂。
为了更好的维护。当然是首选把连接字符串配置到app.config中
看看我已经配好了的
1 <?xml version="1.0"?> 2 <configuration> 3 <configSections> 4 </configSections> 5 <connectionStrings> 6 <add name="GoodManage.Properties.Settings.GMConnectionString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\GM.accdb" providerName="System.Data.OleDb" /> 7 </connectionStrings> 8 <appSettings> 9 <add key="accessCon" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\..\db\GM.accdb;Persist Security Info=False" /> 10 <add key="SQLConnString" value="provider=microsoft.jet.oledb.4.0;data source=" /> 11 <add key="dbPath" value="..\..\db\GM.accdb" /> 12 <add key="ClientSettingsProvider.ServiceUri" value="" /> 13 </appSettings> 14 <startup> 15 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> 16 </startup> 17 <system.web> 18 <membership defaultProvider="ClientAuthenticationMembershipProvider"> 19 <providers> 20 <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" /> 21 </providers> 22 </membership> 23 <roleManager defaultProvider="ClientRoleProvider" enabled="true"> 24 <providers> 25 <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" /> 26 </providers> 27 </roleManager> 28 </system.web> 29 </configuration>
最后提供一个SQLHelper.cs 类
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data.SqlClient; 6 using System.Data; 7 using System.Configuration; 8 using System.Data.OleDb; 9 using System.Web; 10 namespace DAL 11 { 12 public class SQLHelper 13 { 14 //连接字符串 15 16 static string connStr = ConfigurationManager.AppSettings["accessCon"]; 17 18 19 /// <summary> 20 /// 返回受影响的行数 21 /// </summary> 22 /// <param name="comText"></param> 23 /// <param name="param"></param> 24 /// <returns></returns> 25 public static int ExecuteNonQuery(string comText, params OleDbParameter[] param) 26 { 27 using (OleDbConnection conn = new OleDbConnection(connStr)) 28 { 29 using (OleDbCommand cmd = new OleDbCommand(comText, conn)) 30 { 31 if (param != null && param.Length != 0) 32 { 33 cmd.Parameters.AddRange(param); 34 } 35 if (conn.State == ConnectionState.Closed) 36 { 37 conn.Open(); 38 } 39 return cmd.ExecuteNonQuery(); 40 } 41 } 42 } 43 /// <summary> 44 /// 返回数据对象 45 /// </summary> 46 /// <param name="comText"></param> 47 /// <param name="param"></param> 48 /// <returns></returns> 49 public static object ExecuteScalar(string comText, params OleDbParameter[] param) 50 { 51 using (OleDbConnection conn = new OleDbConnection(connStr)) 52 { 53 using (OleDbCommand cmd = new OleDbCommand(comText, conn)) 54 { 55 if (param != null && param.Length != 0) 56 { 57 cmd.Parameters.AddRange(param); 58 } 59 if (conn.State == ConnectionState.Closed) 60 { 61 conn.Open(); 62 } 63 return cmd.ExecuteScalar(); 64 } 65 } 66 } 67 /// <summary> 68 /// 返回table 69 /// </summary> 70 /// <param name="cmdText"></param> 71 /// <param name="param"></param> 72 /// <returns></returns> 73 public static DataTable Adapter(string cmdText, params OleDbParameter[] param) 74 { 75 DataTable dt = new DataTable(); 76 //OleDbConnection con = new OleDbConnection(); 77 using (OleDbDataAdapter oda = new OleDbDataAdapter(cmdText, connStr)) 78 { 79 if (param != null && param.Length != 0) 80 { 81 oda.SelectCommand.Parameters.AddRange(param); 82 } 83 if (new OleDbConnection().State == ConnectionState.Closed) 84 { 85 new OleDbConnection(connStr).Open(); 86 } 87 oda.Fill(dt); 88 } 89 return dt; 90 91 /* 92 using (SqlDataAdapter sda = new SqlDataAdapter(cmdText, connStr)) 93 { 94 if (param != null && param.Length != 0) 95 { 96 sda.SelectCommand.Parameters.AddRange(param); 97 } 98 sda.Fill(dt); 99 } 100 return dt; 101 * */ 102 } 103 /// <summary> 104 /// 向前读取记录 105 /// </summary> 106 /// <param name="cmdText"></param> 107 /// <param name="param"></param> 108 /// <returns></returns> 109 public static OleDbDataReader ExectueReader(string cmdText, params OleDbParameter[] param) 110 { 111 OleDbConnection conn = new OleDbConnection(connStr); 112 using (OleDbCommand cmd = new OleDbCommand(cmdText, conn)) 113 { 114 if (param != null && param.Length != 0) 115 { 116 cmd.Parameters.AddRange(param); 117 } 118 if (conn.State == ConnectionState.Closed) 119 { 120 conn.Open(); 121 } 122 return cmd.ExecuteReader(CommandBehavior.CloseConnection); 123 } 124 } 125 /// <summary> 126 /// 读取存储过程 127 /// </summary> 128 /// <param name="cmdText"></param> 129 /// <param name="type"></param> 130 /// <param name="param"></param> 131 /// <returns></returns> 132 public static DataTable GetPro(string cmdText, CommandType type, params OleDbParameter[] param) 133 { 134 DataTable dt = new DataTable(); 135 using (OleDbDataAdapter sda = new OleDbDataAdapter(cmdText, connStr)) 136 { 137 new OleDbCommand().CommandType = CommandType.StoredProcedure; 138 if (param != null && param.Length != 0) 139 { 140 sda.SelectCommand.Parameters.AddRange(param); 141 } 142 sda.Fill(dt); 143 } 144 return dt; 145 } 146 } 147 }