SQL Server倒车成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文件的急需。

实际上生上咱们去贯彻一个问题的当儿,总体是发一定难度之,但当我们怀念方法,通过分解问题来兑现之上,相对来说就比较简单的兑现了。

相关文章