从SQLserver中导出表数据到Access

每篇随便都得有个背景吧,这次做一个项目时,突然碰到这个样一个问题,需要将本地sqlserver中的数据导出到access后,再传输access数据库,所以就在想怎样实现这样的操作。后面经过在网上查找了一些资料结合以前的知识,搞了这样一个东西出来;

  1         /// <summary>
  2         /// 从sqlserver中导出数据到access
  3         /// state=0 Jzjl 导出菜品信息表
  4         /// state=1 lbxf_jz 导出收银信息表
  5         /// </summary>
  6         /// <param name="host"></param>
  7         /// <param name="name"></param>
  8         /// <param name="password"></param>
  9         /// <param name="root"></param>
 10         static void BackupA(string tablename, int state, string connection = "Data Source=.;Initial Catalog=mpcy;Integrated Security=True")
 11         {
 12             string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
 13             string file = "mpcy.model";
 14             string root = path + file;
 15
 16             Console.WriteLine("文件路径:" + root);
 17             //备份Access数据库
 18             if (state == 0) { tablename = "Jzjl"; chkandcrt(root); } else { tablename = "lbxf_jz"; }
 19
 20             root = BakPath + "\\mpcy.dat";
 21             string accesssqlconn = @"Provider=Microsoft.ACE.OLEDB.12.0;Jet OLEDB:DataBase Password=xhjxjf168;Data Source=" + root + ";";
 22             //SqlHelper.ConnectionString = string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", "127.0.0.1", "mpcyTemp", "sa", "12345");
 23             //connection = string.Format("Data Source=.;Initial Catalog={0};Integrated Security=True", "mpcyTemp");
 24             SqlHelper.ConnectionString = connection;
 25             //从sqlserver中读出数据到datatable
 26             OleDbConnection conn = new OleDbConnection(accesssqlconn);
 27             OleDbCommand cmd = conn.CreateCommand();
 28             try
 29             {
 30                 DataTable user = SqlHelper.ExecuteTable(CommandType.Text, string.Format("select * from {0}", tablename), null);
 31                 int i = 0;
 32                 if (user.Rows.Count > 0)
 33                 {
 34                     using (conn)
 35                     {
 36                         using (cmd)
 37                         {
 38                             conn.Open();
 39
 40                             //每次导入前,先清空数据库表
 41                             string sql = string.Format("delete * from {0}", tablename); cmd.CommandText = sql; cmd.ExecuteNonQuery();
 42
 43                             OleDbDataAdapter adp = new OleDbDataAdapter(); adp.SelectCommand = new OleDbCommand(string.Format("select * from {0}", tablename), conn); OleDbCommandBuilder cb = new OleDbCommandBuilder(adp); DataSet data = new DataSet();
 44                             //加载access中的数据表,并通过追加的方式放入dataset中
 45                             adp.Fill(data);
 46                             for (int j = 0; j < user.Rows.Count; j++)
 47                             {
 48                                 //for (int l = 0; l < user.Columns.Count; l++)
 49                                 //{
 50                                 //    if (l > user.Columns.Count - 1)
 51                                 //        break;
 52                                 DataRow dr = data.Tables[0].NewRow();
 53                                 for (int k = 0; k < dr.Table.Columns.Count; k++)
 54                                 {
 55                                     Type typ = user.Rows[j][k].GetType();
 56                                     if (typ == typeof(double) || typ == typeof(int) || typ == typeof(decimal) || typ == typeof(float))
 57                                     { if (string.IsNullOrEmpty(user.Rows[j][k].ToString())) { dr[k] = "0"; } else { dr[k] = user.Rows[j][k].ToString(); } }
 58                                     else
 59                                     { if (string.IsNullOrEmpty(user.Rows[j][k].ToString())) { dr[k] = " "; } else { dr[k] = user.Rows[j][k].ToString(); } }
 60                                 }
 61                                 //dr["UserID"] = user.Rows[j][l].ToString();
 62                                 //dr["UserName"] = user.Rows[j][l + 1].ToString();
 63                                 //网dataset中添加数据
 64                                 data.Tables[0].Rows.Add(dr);
 65                                 //}
 66                             }
 67                             data.Tables[0].TableName = tablename;
 68                             i = adp.Update(data.Tables[0]);     //通过update方法Insert或update数据
 69                             Console.WriteLine(i.ToString());
 70                         }
 71                     }
 72                 }
 73             }
 74             //判断异常类型
 75             catch (SqlException er)
 76             {
 77                 ErrorTime++;
 78                 if (ErrorTime > 3)
 79                 { FileLog.Logger.Write(er); FileLog.Logger.Write("错误次数太多,退出程序!"); Console.WriteLine("错误次数太多,退出程序!"); }
 80                 else
 81                 {
 82                     if (ErrorTime % 2 == 0)
 83                     {
 84                         FileLog.Logger.Write("尝试使用MSSQL身份验证登陆数据库!"); FileLog.Logger.Write(er); Console.WriteLine("SQLSERVER打开失败,尝试使用MSSQL方式登录数据库。");
 85                         string sqlcon = string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", ConfigHelper.DBHost, "mpcy", ConfigHelper.DBName, ConfigHelper.DBPwd);
 86                         //string sqlcon = string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", "127.0.0.1", "mpcyTemp", "sa", "12345");
 87                         BackupA("", state, sqlcon);
 88                     }
 89                     else
 90                     { FileLog.Logger.Write("尝试使用WINDOWS身份验证登陆数据库!"); FileLog.Logger.Write(er); Console.WriteLine("SQLSERVER打开失败,尝试使用WINDOWS方式登录数据库。"); BackupA("", state); }
 91                 }
 92             }
 93             catch (Exception e)
 94             {
 95                 FileLog.Logger.Write("数据导出失败!"); FileLog.Logger.Write(e); Console.WriteLine("数据导出失败!");
 96                 //throw (new Exception("数据导出失败,请联系IT部!"));
 97             }
 98             finally
 99             {
100                 conn.Close();
101             }
102             if (state == 0)
103             {
104                 string sqlcon = string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", ConfigHelper.DBHost, "mpcyTemp", ConfigHelper.DBName, ConfigHelper.DBPwd);
105                 //string sqlcon = string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", "127.0.0.1", "mpcyTemp", "sa", "12345");
106                 BackupA("", 1, sqlcon);
107             }
108         }
109
110         /// <summary>
111         /// 检查并备份
112         /// </summary>
113         /// <param name="check"></param>
114         /// <param name="root"></param>
115         static void chkandcrt(string root)
116         {
117             try { if (!Directory.Exists(BakPath)) { Directory.CreateDirectory(BakPath); } if (!File.Exists(BakPath + "\\mpcy.dat")) { File.Copy(root, BakPath + "\\mpcy.dat"); } }
118             catch (Exception e)
119             { FileLog.Logger.Write(e); FileLog.Logger.Write("文件检查失败!"); Console.WriteLine("文件信息检查失败!"); }
120         }

代码不多,核心代码就这几句:

OleDbDataAdapter adp = new OleDbDataAdapter(); adp.SelectCommand = new OleDbCommand(string.Format("select * from {0}", tablename), conn); OleDbCommandBuilder cb = new OleDbCommandBuilder(adp); DataSet data = new DataSet();
 44                             //加载access中的数据表,并通过追加的方式放入dataset中
 45                             adp.Fill(data);
 46                             for (int j = 0; j < user.Rows.Count; j++)
 47                             {
 48                                 //for (int l = 0; l < user.Columns.Count; l++)
 49                                 //{
 50                                 //    if (l > user.Columns.Count - 1)
 51                                 //        break;
 52                                 DataRow dr = data.Tables[0].NewRow();
 53                                 for (int k = 0; k < dr.Table.Columns.Count; k++)
 54                                 {
 55                                     Type typ = user.Rows[j][k].GetType();
 56                                     if (typ == typeof(double) || typ == typeof(int) || typ == typeof(decimal) || typ == typeof(float))
 57                                     { if (string.IsNullOrEmpty(user.Rows[j][k].ToString())) { dr[k] = "0"; } else { dr[k] = user.Rows[j][k].ToString(); } }
 58                                     else
 59                                     { if (string.IsNullOrEmpty(user.Rows[j][k].ToString())) { dr[k] = " "; } else { dr[k] = user.Rows[j][k].ToString(); } }
 60                                 }
 61                                 //dr["UserID"] = user.Rows[j][l].ToString();
 62                                 //dr["UserName"] = user.Rows[j][l + 1].ToString();
 63                                 //网dataset中添加数据
 64                                 data.Tables[0].Rows.Add(dr);
 65                                 //}
 66                             }
 67                             data.Tables[0].TableName = tablename;
 68                             i = adp.Update(data.Tables[0]);     //通过update方法Insert或update数据
 69                             Console.WriteLine(i.ToString());

这中间是这样的:先通过一个DataAdapter读取了Access数据库的结构,然后再通过从Sqlserver中读取到数据的DataTable将数据导入到这个被DataAdapter填充了结构的DataSet的表中。最后,通过这个DataAdapter来更新整个表,当然,表的结构要一致!!

另外,这里有一个OleDbCommandBuilder,根据网上解释:自动生成用于协调对 DataSet的更改与关联数据库的单表命令。也就是说,在我们这个例子中,我们的表结构是没有改变,但是后面新添加了数据,于是这个OleDbCommandBuilder就会自动将表单命令生成为Insert语句,于是就执行了插入命令,但是如果在我们初始化的DataSet中本来就存在数据,然后我们进行了对原始数据的改变,后面就会将命令变成Update。

这样,就将Sqlserver中的数据填充到了Access数据库中了。

参考:http://bbs.bccn.net/thread-292655-1-1.html

http://blog.csdn.net/a3676212/article/details/2776027

http://www.cnblogs.com/rhythmK/archive/2010/07/19/1780874.html

时间: 2024-10-20 02:46:38

从SQLserver中导出表数据到Access的相关文章

SQL大圣之路笔记——把Excel中的数据通过Access导入到DataBase中

把Excel中的数据通过Access导入到DataBase中 1.打开Access ,点击“EXTERNAL DATA",选择上传”excel",选中需要导入的excel,点击ok. 2.选择excel中需要上传数据的sheet,点击”next",再点击“next”,选择列明,更改 Data Type (Short Text类型导入后会成为nvarchar);点击“next”,再点击“next” ,设定导入DB之后的表名,点击“finish”. 3.右击表名,点击“Expor

在sqlServer中把数据导出为insert脚本

有时候为了把数据导出为insert脚本,不得不用一些小工具,或者通过自己写存储过程来完成这一操作.其实SqlServer本身就有这种功能.以下是详细步骤:

SqlServer中插入数据后如何得到主键ID

使用@@IDENTITY 例如:insert into student(name,age) values('fanqi',23) select @@identity 使用 OUTPUT inserted 例如:INSERT INTO UserInfo(Username,LogName,[Password],resTime) OUTPUT inserted.UserID VALUES ('12345','56789','112233',GETDATE()) 原文地址:https://www.cnb

Excel中的数据导入到SqlServer数据库中

从SqlServer2008才开始支持导出表结构的和表中的数据,而SqlServer2008以前的数据库只支持导出表结构,有些时候我们可能需要把2008以前的数据库中的数据导出来,这个时候我们可以使用折中的方法,先把数据库导出到Excel中,再把Excel中的数据导入到数据库中(如果两台数据库服务器之间可以互通的话,可以直接建立远程链接进行数据传输,不用如此麻烦), 将SqlServer中的数据导出到Excel中比较简单,这里不再贴图,下面是把Excel中的数据导入到SqlServer中步骤:

elasticsearch river 从数据库中导入数据

Elasticsearch中使用reiver-jdbc导入数据 2014-05-13 15:10 本站整理 浏览(3384) Elasticsearch中使用reiver-jdbc导入数据,有需要的朋友可以参考下. Elastisearch中提供了river模块来从其他数据源中获取数据,该项功能以插件的形式存在,目前已有的river插件包括: river pluginsedit 1. Supported by Elasticsearch CouchDB River Plugin RabbitMQ

[转]在SqlServer 中解析JSON数据

在Sqlserver中可以直接处理Xml格式的数据,但因为项目需要所以要保存JSON格式的数据到Sqlserver中在博客:Consuming JSON Strings in SQL Server中该作者通过自定义类型的方法实现了对JSON的处理,而且Sqlserver可以查询处理后的数据因此可以在项目中放心的使用 来个例子 Select * from parseJSON('{ "联系人": { "姓名": "huang", "网名&q

SQLSERVER中返回修改后的数据

在公司看到同事写了个SQL2005的新特性的文章,觉得很实用,在这里和大家分享下. 这种技术主要是用到了inserted和deleted虚拟表,这两张表相信大家都很熟悉.以前我们主要是在触发器中使用. 我们先来复习下这两个表: Inserted和Deleted这两个表是逻辑表,并且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此,不允许用户直接对其修改.这两个表的结构与被该触发器作用的表在相同的表结构.这两个表是动态驻留在内存中的,当触发器工作完成,它们也被删除. 接下来,看看我们

微软BI 之SSIS 系列 - 在 SSIS 中导入 ACCESS 数据库中的数据

开篇介绍 来自 天善学院 一个学员的问题,如何在 SSIS 中导入 ACCESS 数据表中的数据. 在 SSIS 中导入 ACCESS 数据库数据 ACCESS 实际上是一个轻量级的桌面数据库,直接使用文件形式存储.在国内大量使用 ACCESS 作为 BI 数据源并不多,但是在国外特别是美国使用的还比较多,因为他们的 IT 基础起步比较早.在我的第一个美国的医疗保险项目中,就遇到过大量的 ACCESS 数据源,前后总共有 500 多个 ACCESS 表.而现在从国外一些朋友反馈的情况仍然还有在使

C#_批量插入数据到Sqlserver中的四种方式

先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database CarSYS;    go    use CarSYS;