在MVC下把access的数据添加到sqlserver中去

最近在实现一个功能,

功能描述:

1.用一个上传控件上传一个access数据库保存到指定的文件夹upload下;

我用的html控件,公司不准用服务器控件,所以我用的都是html控件。

注意:之前我做的时候上传都不成功,我就奇怪了,昨天做的都没错啊,怎么今天在这个项目里就老点了上传按钮也不成功呢,后来发现时因为上传的话有个默认的最大值,好像是4M,而我们上传数据库的话很可能是大于那个值的,所以要给表单添加个属性enctype="multipart/form-data"。 在Action处的参数。注意第二个参数"FileUp",这个对象名必须和上传的html file控件的name一样,否则不能接受。

< form action = " <%=Url.Action( " Create " , " Access " ) %> " method = " post " enctype = " multipart/form-data " >
< input id = " FileUp " name = " FileUp " type = " file " />
public ActionResult Create(FormCollection form, HttpPostedFileBase FileUp)

获取文件路径代码:

这段代码是把上传的东东保存进文件夹里的。 

#region 保存文件
/// <summary>
/// 保存文件
/// </summary>
/// <param name="file"></param>
/// <param name="attach"></param>
/// <param name="type"> 1.附件。2.图片。 </param>
public static string TrySaveFile(HttpPostedFileBase attach, string type)
{

string path = string .Empty;
if (attach != null )
{

string saveFolder = System.Web.HttpContext.Current.Server.MapPath( " /upload " );
string savePath, fileName;
fileName
= Path.GetFileName(attach.FileName);
if (fileName != "" )
{
string fileType = fileName.Substring(fileName.LastIndexOf( " . " ));
string newName = type + Guid.NewGuid().ToString( " N " ) + fileType;
savePath
= saveFolder + " \\ " + newName;
// 检查是否在服务器上已经存在用户上传的同名文件
if (System.IO.File.Exists(savePath))
{
System.IO.File.Delete(savePath);
}
attach.SaveAs(savePath);
string filePath = saveFolder.Substring(saveFolder.LastIndexOf( " \\ " ) + 1 ) + " / " + newName;
path
= filePath;
}
}
return path;

}
#endregion

 

2.读取access里面的数据,把这些数据都添加到sqlserver中去。

本来以为做五六个钟头的,结果从上午8点多做到晚上8点多。可谓效率低下,所以写篇总结文。

先说上传access数据库并实现成功访问,就弄了一上午,主要原因就是之前都是报错说在指定的目录下找不到文件。

经调试后发现原因是路径里多了个不必要的目录,奇怪,明明是动态获得的,但是却多了个目录,还好,上网一搜,在添加相对目录前加了个~/(代表在跟目录下),这才行了。

再就是得到所有access里面的数据。之前我傻傻的,

在网上找了个查找access某表的sql语句。查询出来的其实应该就是一个表的数据,这时大概就是三点多了。然后瞎闹腾,遍历是有数据的,但是怎么把它循环出来又在那里卡住了。我想,要把数据添加到sqlserver中去,那得根据数据在sqlserver中创建每个表,每个表的列,数据吧,我怎么知道该列的数据类型是什么呢?在这里就一直卡着,头脑和浆糊一样了。。觉得到这里自己根本就做不出来了。

到了吃晚饭前老大看我到这个时候都还没做出来就自己做了下,刷刷刷,一下就做出来了,我都觉得自己可以走人了,老大说我是思路不清晰。。。。

他的代码加我的代码。

//参数path是动态获取用户上传的access数据库的地址。

1 #region
2 /// <summary>
3 /// 读取access数据库
4 /// </summary>
5 /// <param name="attach"></param>
6   public static void ReadDataBase( string path)
7 {
8 // 连接access数据库的字符串
9   string connString = " Provider=Microsoft.Jet.OLEDB.4.0; " + " Data Source= " + System.Web.HttpContext.Current.Server.MapPath( " ~/ " + path);
10 // 连接数据库的链接对象
11   OleDbConnection acconn = new OleDbConnection(connString);
12 acconn.Open();
13 // ClassOledb co = new ClassOledb(connString);
14 // conn.Open();
15 // co.mycon().Open();
16 // SqlDataAdapter myAdapter = new SqlDataAdapter();
17 DataTable dt = acconn.GetSchema( " Tables " ); // 获取ACCESS数据库中所有的表\查询\宏\窗体\模块
18
19 int n = dt.Columns.Count; //
20 string [] strTable = new string [n];
21 int m = dt.Columns.IndexOf( " TABLE_NAME " );
22 // -----开始
23
24 for ( int i = 0 ; i < n; i ++ )
25 {
26
27 DataRow dtrow = dt.Rows[i];
28 string tableName = dtrow.ItemArray.GetValue(m).ToString();
29 // 创建一个同名的表
30 StringBuilder sqlCreateT = new StringBuilder();
31 // sqlCreateT.Append("create table download(mID int,mTitle varchar(50),mFileName varchar(50))");
32 OleDbCommand cmd = new OleDbCommand( " select * from " + tableName, acconn);
33 cmd.CommandType = CommandType.Text;
34 OleDbDataAdapter da = new OleDbDataAdapter(cmd);
35 DataTable ds = new DataTable();
36 da.Fill(ds);
37 for ( int j = 0 ; j < ds.Rows.Count; j ++ )
38 {
39 conn.Open();
40 if (conn.State != ConnectionState.Open)
41 {
42 }
43 StringBuilder sb = new StringBuilder();
44 for ( int c = 0 ; c < ds.Columns.Count; c ++ )
45 {
46 if (c == ds.Columns.Count - 1 )
47 {
48 sb.Append(ds.Columns[c].ColumnName.ToString());
49 }
50 else
51 {
52 sb.Append(ds.Columns[c].ColumnName.ToString());
53 sb.Append( " , " );
54 }
55 }
56 string [] columnName = sb.ToString().Split( ' , ' );
57
58 StringBuilder values = new StringBuilder();
59 for ( int c = 0 ; c < ds.Columns.Count; c ++ )
60 {
61 if (c == ds.Columns.Count - 1 )
62 {
63 values.Append( " ' " + ds.Rows[j][c].ToString() + " ' " );
64 }
65 else
66 {
67 values.Append( " ' " + ds.Rows[j][c].ToString() + " ' " );
68 values.Append( " , " );
69 }
70 }
71
72 string sql = " insert into " + tableName + " ( " + sb.ToString() + " ) values( " + values.ToString() + " ) " ;
73 ExecuteCommand(sql);
74 }
75 /// 注释
76 #region
77
78
79 // tableName = dt.Rows[i].ItemArray[2].ToString();
80 // string sql = "SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source=@" + System.Web.HttpContext.Current.Server.MapPath("~/" + path) + "..." + tableName;
81
82
83 // string sqlQuery = "SELECT * FROM " + tableName;
84 // DataTable dtt = new DataTable();
85 // dtt =GetDataSet(sqlQuery);
86 // if(dtt== null)
87 // {
88 // string sql = "SELECT * INTO " + tableName + " FROM OPENDATASOURCE ( 'Microsoft.Jet.OLEDB.4.0', 'Data Source=" + path + "')... " + tableName;
89 // ExecuteCommand(sql);
90 // }
91 #endregion
92 conn.Close();
93 }
94 acconn.Close();
95
96
97
98
99
100 // dataset = co.chaxun(sql);
101
102 // for (int i = 0; i < dataset.Tables.Count; i++)
103 // {
104 // string tb1 = dataset.Tables[i].TableName;
105 // SqlCommand myCommand = new SqlCommand("select * from " + dataset.Tables[i].TableName);
106 // myAdapter.SelectCommand = myCommand;
107 // SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);
108 // try
109
110 // { myAdapter.Update(dataset, dataset.Tables[i].TableName); }
111
112 // catch { }
113 // }
114 return ;
115 }
116
117 #endregion

转载于:https://www.cnblogs.com/lanyueer/archive/2011/02/23/1962354.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文介绍C#访问操作Access数据库的基础知识,并提供一个相关的例程。 1.通过ADO.NET的OleDb相关类来操作Access 主要知识点如下: using System.Data.OleDb; using System.Data; 连接字符串:String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=product.mdb"; 建立连接:OleDbConnection connection = new OleDbConnection(connectionString); 使用OleDbCommand类来执行Sql语句: OleDbCommand cmd = new OleDbCommand(sql, connection); connection.Open(); cmd.ExecuteNonQuery(); 2.取得Access自增标识字段在插入数据后的id值 cmd.CommandText = @"select @@identity"; int value = Int32.Parse(cmd.ExecuteScalar().ToString()); return value; 3.执行事务 需要用到OleDbTransaction,关键语句如下: OleDbConnection connection = new OleDbConnection(connectionString); OleDbCommand cmd = new OleDbCommand(); OleDbTransaction transaction = null; cmd.Connection = connection; connection.Open(); transaction = connection.BeginTransaction(); cmd.Transaction = transaction; cmd.CommandText=sql1; cmd.ExecuteNonQuery(); cmd.CommandText=sql2; cmd.ExecuteNonQuery(); transaction.Commit(); 4.执行查询,返回DataSet OleDbConnection connection = new OleDbConnection(connectionString); DataSet ds = new DataSet(); connection.Open(); OleDbDataAdapter da = new OleDbDataAdapter(sql, connection); da.Fill(ds,"ds"); 5.分页查询 分页查询使用OleDbDataReader来读取数据,并将结果写到一个DataSet中返回。 以上内容封装为三个可重用的类:AccessDBUtil,AccessPageUtil,Page 代码这里下载AccessDBUtilDemo.rar (191.37 KB , 下载:999次) 本例程是一个c#的winform程序,但是数据访问类可以在Web环境下使用。 本例程演示了: 1.Access数据库的插入,更新,修改,查询; 2.带参数的sql语句的使用,而不是拼SQL; 3.使用DataReader的分页查询,而不是用嵌套的SQL语句来分页; 4.用事务同时执行多个SQL语句; 5.在插入数据的同时返回最新的ID值; 6.整型,实型,字符串,日期型,布尔型五种数据类型的操作; 7.使用正则表达式来验证整数和实数; 8.listview用来显示数据的一些基本用法。 本示例不包括: 1.高效的分页查询,仅仅是提供了一种分页的方法,但我认为DataReader应该比嵌套的SQL语句快(未测试)。 2.完善的分页封装,只提供了分页的简单包装。 3.嵌套的事务处理,提供了同时执行多个sql语句的事务处理,但不支持嵌套事务。 4.listview的使用,只是利用winform控件来演示数据访问,因此不能作为winform编程的良好示例,例如添加数据时界面并没有很好地更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值