• 在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
    ..
  • 相关阅读:
    get和post
    java学习day34-Cookie技术
    java学习day33-Maven-相关
    在Linux设置完共享文件夹后无法显示Windows里的文件
    Tomcat-把tomcat的端口号从8080修改为80
    是否忘记向源中添加“#include“StdAfx.h””
    php-fpm配置文件详解
    Web安全常见漏洞修复建议
    blog个性化设置
    使用 notepad++ 编辑器在行首、行尾添加字符
  • 原文地址:https://www.cnblogs.com/lanyueer/p/1962354.html
Copyright © 2020-2023  润新知