在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/p/1962354.html