- 浏览: 2060090 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (1409)
- asp/asp.net学习 (241)
- oracle (10)
- delphi (295)
- java (27)
- pb (1)
- 每日点滴 (49)
- 学习方法 (40)
- 思想方面 (104)
- C语言 (5)
- C++ (1)
- 代码重构经验 (5)
- 软件工程 (3)
- 数据库 (99)
- 英语学习 (3)
- mysql (1)
- 该关注的网站或者网页 (42)
- 总结 (7)
- 要去做的事情 (33)
- 算法 (1)
- 网络方面 (29)
- 随感 (96)
- 操作系统 (36)
- UML (12)
- 常用工具的使用 (55)
- 脚本 (7)
- 汇编 (62)
- 数据结构 (2)
- 财务 (38)
- 语文作文 (16)
- 法律 (1)
- 股票 (88)
最新评论
-
devwang_com:
可以,学习了~~
列出文件夹下所有文件夹的树形结构--Dos命令 tree的使用 -
hvang1988:
不管用啊 frxrprt1.PreviewForm.Pare ...
fastReport预览时嵌入到别的窗体 -
00915132:
我也有这个疑问,非常 感 谢
left join加上where条件的困惑 --SQL优化 -
zhuyoulong:
学习了,高效读书
软件架构师要读的书 -
nTalgar:
非常感谢分享!
Application.ProcessMessages用法:
摘自:http://lovercoca.blog.163.com/blog/static/7098670220105825450787/
public void Create( string mdbPath )
{
if( File.Exists(mdbPath) ) //检查数据库是否已存在
{
throw new Exception( "目标数据库已存在,无法创建 ");
}
// 可以加上密码,这样创建后的数据库必须输入密码后才能打开
mdbPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + mdbPath;
// 创建一个CatalogClass对象的实例,
ADOX.CatalogClass cat = new ADOX.CatalogClass();
// 使用CatalogClass对象的Create方法创建ACCESS数据库
cat.Create(mdbPath);
}
///压缩修复ACCESS数据库,mdbPath为数据库绝对路径
public void Compact( string mdbPath )
{
if( !File.Exists(mdbPath) ) //检查数据库是否已存在
{
throw new Exception( "目标数据库不存在,无法压缩 ");
}
//声明临时数据库的名称
string temp = DateTime.Now.Year.ToString();
temp += DateTime.Now.Month.ToString();
temp += DateTime.Now.Day.ToString();
temp += DateTime.Now.Hour.ToString();
temp += DateTime.Now.Minute.ToString();
temp += DateTime.Now.Second.ToString() + ".bak ";
temp = mdbPath.Substring(0, mdbPath.LastIndexOf( "\\ ")+1) + temp;
//定义临时数据库的连接字符串
string temp2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + temp;
//定义目标数据库的连接字符串
string mdbPath2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + mdbPath;
//创建一个JetEngineClass对象的实例
JRO.JetEngineClass jt = new JRO.JetEngineClass();
//使用JetEngineClass对象的CompactDatabase方法压缩修复数据库
jt.CompactDatabase( mdbPath2, temp2 );
//拷贝临时数据库到目标数据库(覆盖)
File.Copy( temp, mdbPath, true );
//最后删除临时数据库
File.Delete( temp );
}
/// 备份数据库,mdb1,源数据库绝对路径; mdb2: 目标数据库绝对路径
public void Backup( string mdb1, string mdb2 )
{
if( !File.Exists(mdb1) )
{
throw new Exception( "源数据库不存在 ");
}
try
{
File.Copy( mdb1, mdb2, true );
}
catch( IOException ixp )
{
throw new Exception(ixp.ToString());
}
}
///恢复数据库,mdb1为备份数据库绝对路径,mdb2为当前数据库绝对路径
public void Recover( string mdb1, string mdb2 )
{
if( !File.Exists(mdb1) )
{
throw new Exception( "备份数据库不存在 ");
}
try
{
File.Copy( mdb1, mdb2, true );
}
catch( IOException ixp )
{
throw new Exception(ixp.ToString());
}
}
============================================================================================================
使用ADOX创建Access数据库和表
using System;
using ADOX;
namespace WebPortal
{
/// <summary>
/// CreateAccessDB 的摘要说明。
/// 对于不同版本的ADO,需要添加不同的引用
/// 请添加引用Microsoft ADO Ext. 2.7 for DDL and Security
/// 请添加引用Microsoft ADO Ext. 2.8 for DDL and Security
/// </summary>
public class CreateAccessDB : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
//为了方便测试,数据库名字采用比较随机的名字,以防止添加不成功时还需要重新启动IIS来删除数据库。
string dbName = "D:\\NewMDB"+DateTime.Now.Millisecond.ToString()+".mdb";
ADOX.CatalogClass cat = new ADOX.CatalogClass();
cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName +";");
Response.Write("数据库:" + dbName + "已经创建成功!");
ADOX.TableClass tbl = new ADOX.TableClass();
tbl.ParentCatalog = cat;
tbl.Name="MyTable";
//增加一个自动增长的字段
ADOX.ColumnClass col = new ADOX.ColumnClass();
col.ParentCatalog = cat;
col.Type=ADOX.DataTypeEnum.adInteger; // 必须先设置字段类型
col.Name = "id";
col.Properties["Jet OLEDB:Allow Zero Length"].Value= false;
col.Properties["AutoIncrement"].Value= true;
tbl.Columns.Append (col,ADOX.DataTypeEnum.adInteger,0);
//增加一个文本字段
ADOX.ColumnClass col2 = new ADOX.ColumnClass();
col2.ParentCatalog = cat;
col2.Name = "Description";
col2.Properties["Jet OLEDB:Allow Zero Length"].Value= false;
tbl.Columns.Append (col2,ADOX.DataTypeEnum.adVarChar,25);
//设置主键
tbl.Keys.Append("PrimaryKey",ADOX.KeyTypeEnum.adKeyPrimary,"id","","");
cat.Tables.Append (tbl);
Response.Write("<br>数据库表:" + tbl.Name + "已经创建成功!");
tbl=null;
cat = null;
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
============================================================================================================
昨天有位朋友问起一个问题,客户相要一个Access格式的数据,现在的情况是程序已经实现了导出Excel,问题转化成了Excel怎么样转成Access,这点实现起来相对来说比较容易,office本身就有这个功能,但问题是,从web页面导出的Excel不能很兼容的导成Access,这是一点,还有一个方面是让客户去做这个转化工作不是太好,为了提高用户体验,最好是用代码实现了。
能不能一下子转成Access出来呢?这是我一下想的的问题,如果有的话,客户就省很多力气了,但找了一些相关资料,没有找到把GridView直接导成Access的,也就是客户端比较难实现。想到这里,客户端难实现,服务端应该好实现吧,先把我数据库中的数据转化成一个access的文件,然后客户再下载下来,这个相对来说比较容易实现。
主要思路:在服务端,把一种数据中的数据,生成access文件,下载给客户商。
分步实现:
第一:创建Access文件
第二:复制数据库格式,在Access文件中创建新表
第三:复制数据到Access文件中
第四:实现下载
创建Access文件
原本创建Access文件的语法比较简单
首先引入命名空间using ADOX; 该命名空间位于Interop.ADOX.dll文件中,ADOX.CatalogClass cat = new ADOX.CatalogClass();
cat.Create(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Data.mdb;");
这样,就能在指定的D盘下创建一个Data.mdb的Access文件。文件是创建好了,但引来了后续的一些问题,因为我们在实现下载时,要用到Response.WriteFile(文件),此时的Response.WriteFile()要求是独立享有这个文件操作权限,但前期创建时的进程一直释放不掉(如果谁有好的方法可以告我如何释放),这里还得考虑多人操作,有可能同时有多要在创建Access文件或释放这个文件。这样就会出现运行时错误,提示该文件被其他进程独占。
为了解决这个问题,同时还涉及到防止进程的释放带来的其他问题,这里我捌了一下弯来实现,先创建一个Data.mdb存放在网站的App_Data文件夹下,后期所有客户端要下导出Access表,都在这里拷贝一份,然后对新文件进行操作。另外再新建一个DownLoad文件夹用来存用户下载的Access文件。
代码如下:
//拷贝Access数据表,不移动string newfile=DateTime .Now.ToString ("MMddhhmmss")+".mdb";
File.Copy(Server.MapPath("~") + @"\App_Data\data.mdb", Server.MapPath("~") + @"\App_Data\" + newfile);复制数据库格式,在Access文件中创建新表在这里,我是从SQL Server中生表生成Access的表,当然,可以用相关的工具完成些功能,但如果对方的数据库不是SQL Se
rver可能就不太好用了。这里选择SQL Server只是一种演示数据库。
我们知道,创建一张表有几个要素,表名,字段名,字段类型,字段大小,这里,我们得先从SQL Server中查出该表的这些要素,然后创建Access表,如果是其他数据库,就要相应的转化一下对应的数据类型格式。
代码实现如下:
在web.config中创建两个连接字符串
<add name="AccessConStr" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\data.mdb;Persist Security Info=True;" providerName="System.Data.OleDb"/>
<add name="SqlConStr" connectionString="server=.;database=cum_data;uid=sa;pwd=sa;" providerName="System.Data.SqlClient"/>
这两个字符,一个用来连接SQL Server数据库一个用来连接我们创建的Access数据库。
接来查看导库的代码:
string SqlConstr = ConfigurationManager.ConnectionStrings["SqlConStr"].ConnectionString;
string sql = "select column_name,data_type,character_maximum_length from information_schema.columns where table_name='kh'";
SqlConnection con = new SqlConnection(SqlConstr);
SqlCommand cmd = new SqlCommand(sql, con);
string AccSql = "";//用来组合生成Access表的SQL语句
try
{
con.Open();
SqlDataReader DR = cmd.ExecuteReader();
while (DR.Read())
{
if (DR.GetValue(2).ToString() == "")
{
AccSql += DR.GetValue(0).ToString() + " " + DR.GetValue(1).ToString() + ",";
}
else
{
AccSql += DR.GetValue(0).ToString() + " " + DR.GetValue(1).ToString() + "(" + DR.GetValue(2).ToString() + "),";
}
}
}
catch
{ }
finally
{
con.Close();
}
AccSql = AccSql.Substring(0, AccSql.Length - 1);
string AccConstr = ConfigurationManager.ConnectionStrings["AccessConStr"].ConnectionString.Replace ("data.mdb",newfile );
OleDbConnection CON = new OleDbConnection(AccConstr);
OleDbCommand CMD = new OleDbCommand();
CMD.Connection = CON;
try
{
CON.Open();
CMD.CommandText = "create table kh(" + AccSql + ")";
CMD.ExecuteNonQuery();
}
catch
{ }
finally
{
CON.Close();
}
在上述代码中,SQL语句是比较关键的,“select column_name,data_type,character_maximum_length from information_schema.columns where table_name='kh'”,本SQL查询语句是从把原表的字段名,字段类型,字段大小查询出来,当然,不同的数据库,这个语句不近相同。
复制数据到Access文件中到现在,我们已创建好了数据表格式,接下来,就是要把数据导到Access中。
代码如下:
SqlDataAdapter DA = new SqlDataAdapter("select * from kh", SqlConstr);
DataTable DT = new DataTable();
DA.Fill(DT);
foreach (DataRow DRR in DT.Rows)
{
DRR.SetAdded();
}
OleDbDataAdapter ODA = new OleDbDataAdapter("select * from kh", AccConstr);
OleDbCommandBuilder cmb = new OleDbCommandBuilder(ODA);
ODA.Update(DT);
这里用到了Adapter的一个方法,Update,可以把DataTable中RowState为Add的数据提交会数据库,这样做起来相对要省力些。
在里,要把有数据的Access文件,移动到DownLoad文件夹下File.Move(Server.MapPath("~") + @"\App_Data\"+newfile , Server.MapPath("~") + @"\DownLoad\" + newfile);
实现下载
Response.Clear();
Response.ClearHeaders();
Response.Charset = "utf-8";
Response.Buffer = false ;
this.EnableViewState = false;
Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + newfile);
Response.WriteFile(Server.MapPath("~") + @"\DownLoad\" + newfile ,true );
Response.Flush();
Response.Close();
Response.End();
下载代码是通用的代码,这里不作说明。
整个解决方案就是把文件操作,数据操作,文件下载有机的结合在一起,实现这个用户下载Access文件的需求。
其实有时候我们去实现一个问题的时候,总体是有一定难度的,但当我们想办法,通过分解问题来实现的时候,相对来说就比较简单的实现了。
发表评论
-
关于 字符串中的单引号, 在sql存储过程中的传输总结; 逗号分隔的多个变量提取方法.
2011-10-14 17:49 3395摘自:http://blog.csdn.net/nutia ... -
抓取网站内容 asp.net
2011-10-11 13:28 1042HttpWebRequest myReq ... -
两个DATASET合并成一个新的DATASET
2011-09-28 18:17 2516摘自:http://topic.csdn.net/t/2 ... -
VS设置使用哪个浏览器来调试网页
2011-08-30 16:57 1190摘自:http://zhidao.baidu.com/ques ... -
可使用js获取TREE的CheckBox
2011-08-20 12:32 1086摘自:http://www.uipower.com/bb ... -
正则表达式 验证邮箱
2011-06-02 18:14 2641正则表达式 摘自:http://www.alixixi.com ... -
未能加载程序集 App_Web_vdcnimdz”错误
2011-04-25 17:38 1591问题描述: 自己的一个WebGPS程序,只是拷到了别的 ... -
.net跳到指定错误页面兵显示详细的错误信息
2011-04-14 16:48 1253.net跳到指定错误页面兵显示详细的错误信息 摘自:h ... -
注册*.ocx控件
2011-04-14 11:23 941注册*.ocx控件 问题描述:本地的网站的bin目录下有了个 ... -
C# 读取文本文件的时候出现汉字乱码
2011-04-12 16:01 2434问题描述:C# 使用ReadAllText方法读取文本文件的时 ... -
VS 2008中如何显示代码的行号
2011-04-09 09:51 1239摘自:http://zhidao.baidu.com/ques ... -
VS.NET2008可以使用书签的功能
2011-04-08 17:19 1387摘自:http://blog.csdn.net/lmh_851 ... -
两个类库要添加引用才能使用
2011-04-02 13:57 1156两个类库要添加引用才能使用 ---------------- ... -
缓存 <%@ OutputCache Duration="6000" VaryByParam="none" %>
2011-04-02 10:53 1169在页首添加: <%@ OutputCache Durat ... -
FrameSet的加载顺序
2011-04-02 09:56 3896FrameSet的加载顺序是: (1) mainFrame ... -
Response.AddHeader “P3P”,”CP=CAO PSA OUR”
2011-04-01 18:01 2533摘自:http://my.donews.com/alor ... -
Hashtable 的使用
2011-03-31 09:36 8092011-3-31 Hashtable 的使用: ... -
google地图使用(二)
2011-03-30 10:30 13242011-3-291. 今天客户反映,说GOOGLE地图上的拖 ... -
GOOGLE地图
2011-03-29 18:31 8262011-3-291. 今天客户反映,说GOOGLE地图上的拖 ... -
此组中没有可用的控件 工具箱 vs2008
2011-03-29 09:20 2119问题描述: 此组中没有可用的控件 工具箱 vs2008 ...
相关推荐
在Windows 7环境下,发布一个包含ASP.NET、SQL Server和Access数据库的网站,需要通过IIS(Internet Information Services)进行部署。以下是详细步骤: 1. **IIS安装**: - 打开控制面板,选择“程序”>“程序和...
在这个系统中,我们关注的是基于ASP.NET 2.0平台,并使用Access数据库进行数据存储的设计与实现。下面将详细介绍这个系统的相关知识点。 首先,ASP.NET 2.0是微软公司开发的一个强大的Web应用程序框架,它构建在...
备份Access数据库通常涉及复制.MDB或.ACCDB文件到安全的位置。为了实现自动化,可以编写C#或VB.NET代码,利用System.IO命名空间中的File类方法来执行文件复制。同时,考虑到数据库可能正在被使用,需要确保在备份...
在 Asp.net 中,我们可以使用 SQLDMO.dll 组件来实现 SQL Server 数据库的备份。SQLDMO.dll 组件提供了一个名为 BackupClass 的类,该类包含了多种备份方法,例如 Backup 方法、Restore 方法等。 在示例代码中,...
通过这个项目,开发者可以学习到如何在ASP.NET环境中使用Access数据库来构建一个完整的网站系统,包括前端设计、后端开发、数据库管理和网站运维等方面的知识。对于初学者来说,这是一个很好的实践平台,因为它结合...
例如,你可以创建一个存储过程来执行备份,并在ASP.NET中调用这个存储过程,或者直接在C#代码中编写SQL语句进行备份。 接下来,数据库的分离和附加也是数据库管理的重要环节。分离数据库可以解除服务器对特定数据库...
在本项目中,"ASP.NET+ACCESS静态页面生成后台管理系统"是一个使用ASP.NET技术和Microsoft Access数据库构建的系统,主要目标是实现后台管理功能,并能自动生成静态页面,以提高网站的访问速度和降低服务器负载。...
5. 第15节:可能涉及数据迁移的概念和准备,如备份Access数据库。 6. 第16节:讨论如何将Access数据导入到SQL Server,可能使用SQL Server Management Studio或其他工具。 7. 第17节和第18节:可能涵盖调整数据库...
在这个项目中,开发者可能使用VS2005来编写、调试和部署ASP.NET代码,同时利用其内置的数据库设计工具来管理Access数据库。 4. **Web开发流程**:旅游网站的开发通常涉及以下步骤:需求分析、设计(UI/UX)、前端...
【标题】:“asp.net+access 通讯录”指的是一个基于ASP.NET技术和Access数据库构建的联系人管理系统。在本文中,我们将深入探讨如何利用这两种技术来创建一个简单的通讯录应用。 【描述】:“asp.net+access ...
在ASP中操作Access数据库,主要涉及到以下几个关键知识点: 1. **连接数据库**:首先需要建立ASP与Access数据库之间的连接。这通常通过ADO(ActiveX Data Objects)中的Connection对象来完成。创建Connection对象并...
在ASP.NET中,我们可以使用ADO.NET(.NET Framework的数据访问组件)来连接和操作Access数据库。 在"CHAP04"可能包含的内容中,我们将学习如何: 1. **创建数据库连接**:使用SqlConnection类建立ASP.NET应用程序...
【标签】进一步细化了这个项目的特性,其中“asp.net bbs”表明是基于ASP.NET技术的论坛系统,“bbs_asp.net”可能是该项目的特定子模块或实现方式,而“bbs_c#_数据库”则明确指出使用C#语言和数据库进行开发。...
图书库存管理系统是一个用于管理图书馆内部图书资源的软件应用,它基于ASP.NET技术和Access数据库系统进行构建。这个系统的核心目标是实现图书的入库、出库、借阅、归还以及查询等操作的自动化,提高图书馆的工作...
ASP.NET学生选课系统,毕业设计(源码+论文+开题+开题报告+答辩PPT);’ 大学时做的学生选课系统,大学生基本用就可以了; 实现了网上选课系统,通过该系统,学校不同角色的用户可以通过网路完成选课系统功能:...
在ASP.NET中连接Access数据库,我们通常会使用ADO.NET(ActiveX Data Objects .NET)框架,通过System.Data.OleDb命名空间中的类来实现数据的CRUD操作(创建、读取、更新和删除)。 在这个留言板应用中,可能包含...
【标题】:“asp.net+access 企业管理咨询网站”所涉及的知识点主要集中在使用ASP.NET技术和Access数据库构建的企业级网站开发上。ASP.NET是Microsoft .NET框架的一部分,它为Web应用程序开发提供了强大的支持,而...
【标题】:“互动媒体学习社区(ASP.NET 2.0+Access实现)”是指一个基于ASP.NET 2.0技术并使用Access数据库构建的在线学习平台。这个项目旨在提供一个互动的学习环境,使用户能够交流知识,分享资源,并进行协作...
在Asp.net中,可以使用TransactionScope类来开启一个事务,并在SqlCommand对象上设置CommandBehavior枚举值为SequentialAccess,以支持事务操作。 7. **安全性与性能优化** - **参数化查询**:防止SQL注入攻击,...