转化成Access文件下载的实例

简介:
昨天有位朋友问起一个问题,客户相要一个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 Server可能就不太好用了。这里选择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文件的需求。
其实有时候我们去实现一个问题的时候,总体是有一定难度的,但当我们想办法,通过分解问题来实现的时候,相对来说就比较简单的实现了。















本文转自桂素伟51CTO博客,原文链接: http://blog.51cto.com/axzxs/158460 ,如需转载请自行联系原作者


相关文章
|
8天前
|
数据采集 人工智能 安全
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
298 164
|
3天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
310 155
|
11天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
851 6
|
5天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
241 113