首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

ASP.NET 實現 Excel 批量導入 SQL Server:OleDb 讀取 + 參數化寫入 + 遠程部署避坑

     編輯:關於SqlServer

核心類:ExcelToMSSql

public class ExcelToMSSql {
  public static int count = 0;
  public static string error = "";

  // 入口:傳入 Excel 路徑
  public static void DataTranf(string execlpath) {
    DataTable dtExcel = ExcelToDataTable(execlpath, "Sheet1");
    for (int i = 0; i < dtExcel.Rows.Count; i++) {
      InsertToDB(
        dtExcel.Rows[i][0].ToString().Trim(),  // userno
        dtExcel.Rows[i][1].ToString().Trim(),  // username
        dtExcel.Rows[i][2].ToString().Trim(),  // sex
        FormsAuthentication.HashPasswordForStoringInConfigFile(
          dtExcel.Rows[i][3].ToString().Trim(), "MD5"), // pwd 加密
        dtExcel.Rows[i][4].ToString().Trim(),  // classname
        dtExcel.Rows[i][5].ToString().Trim()   // address
      );
    }
  }

  // OleDb 讀取 Excel → DataTable
  public static DataTable ExcelToDataTable(string strExcelFileName, string strSheetName) {
    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                     "Data Source=" + strExcelFileName + ";" +
                     "Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";
    string strExcel = string.Format("SELECT * FROM [{0}$]", strSheetName);
    DataSet ds = new DataSet();
    using (OleDbConnection conn = new OleDbConnection(strConn)) {
      conn.Open();
      OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, conn);
      adapter.Fill(ds, strSheetName);
    }
    return ds.Tables[strSheetName];
  }

  // 參數化寫入 SQL Server(防注入)
  public static void InsertToDB(string studno, string studname, string studsex,
                                string studpwd, string studclass, string middleschool) {
    string connstr = ConfigurationManager.AppSettings["constr"];
    using (SqlConnection conn = new SqlConnection(connstr)) {
      conn.Open();
      string sql = @"INSERT INTO student (userno, username, sex, pwd, classname, address)
                     VALUES (@userno, @username, @sex, @pwd, @classname, @address)";
      using (SqlCommand cmd = new SqlCommand(sql, conn)) {
        cmd.Parameters.AddWithValue("@userno", studno);
        cmd.Parameters.AddWithValue("@username", studname);
        cmd.Parameters.AddWithValue("@sex", studsex);
        cmd.Parameters.AddWithValue("@pwd", studpwd);
        cmd.Parameters.AddWithValue("@classname", studclass);
        cmd.Parameters.AddWithValue("@address", middleschool);
        try {
          cmd.ExecuteNonQuery();
          count++;
        } catch (Exception e) {
          error += e.Message + "<br />";
        }
      }
    }
  }
}

關鍵配置說明

參數含義建議值
ProviderOLE DB 驅動Microsoft.Jet.OLEDB.4.0(.xls) / Microsoft.ACE.OLEDB.12.0(.xlsx)
Extended PropertiesExcel 版本與讀取模式Excel 8.0;HDR=YES;IMEX=1
HDR=YES第一行作為列名標準表頭用 YES,無表頭用 NO
IMEX=1導入模式(只讀)混合類型列強制按文本讀取,避免數字列讀空

遠程部署避坑指南

現象:本機運行正常,部署到 IIS 服務器報錯「無法初始化數據源」或「找不到安裝可用的 ISAM」。

原因:

  • 服務器未安裝 Access Database Engine(或版本不匹配 32/64 位)
  • IIS 應用程序池「啟用 32 位應用程序」設置與驅動位數不一致
  • 文件路徑權限:IIS 工作進程身份(通常為 ApplicationPoolIdentity 或 NetworkService)需對 Excel 文件有讀寫權限

最佳實踐:

  1. 前端上傳 Excel 到服務器指定目錄(如 /App_Data/Uploads/)
  2. 後端讀取該目錄下文件,導入完成後可選刪除
  3. 服務器安裝 Microsoft Access Database Engine 2010 Redistributable(x64 或 x86 與應用程序池一致)
  4. 連接字串改用 ACE 驅動:Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'

擴展:導入其他數據庫

僅需修改連接字串與 SqlCommand 為對應 ADO.NET 對象(MySqlCommand、OracleCommand 等),邏輯完全復用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved