<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="BtnUpload" runat="server" Text="上傳" OnClick="BtnUpload_Click" />
protected void BtnUpload_Click(object sender, EventArgs e) {
if (FileUpload1.HasFile) {
string path = @"E:\Temp\" + FileUpload1.FileName;
FileUpload1.SaveAs(path); // 實際部署請加例外處理
// 後續導入邏輯...
}
}
HDR=YES)。Teenie$,尾碼 $ 必備)。INSERT INTO EmployeesCheck
SELECT * FROM OPENROWSET(
'MICROSOFT.JET.OLEDB.4.0',
'Excel 8.0;HDR=YES;DATABASE=E:\\Temp\\' + FileUpload1.FileName,
'Teenie$'
);
EmployeesCheck:目標表。Teenie$:Excel 工作表名 + $。SQL Server 2005+ 預設關閉,需執行:
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
protected void BtnImport_Click(object sender, EventArgs e) {
if (!FileUpload1.HasFile) return;
string filePath = Server.MapPath("~/Uploads/") + FileUpload1.FileName;
FileUpload1.SaveAs(filePath);
string connStr = ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr)) {
string sql = $@"
INSERT INTO EmployeesCheck
SELECT * FROM OPENROWSET(
'MICROSOFT.JET.OLEDB.4.0',
'Excel 8.0;HDR=YES;DATABASE={filePath}',
'Teenie$'
)";
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
cmd.ExecuteNonQuery();
}
// 導入後可刪除暫存檔
}
| 限制 | 說明 |
|---|---|
| 工作表名固定 | 使用者必須將資料放在名為 Teenie 的工作表 |
| 需伺服器安裝 ACE/OLEDB 驅動 | 64 位元環境需安裝 Microsoft Access Database Engine 2010+ |
| 不支援 .xlsx (舊驅動) | 改用 Microsoft.ACE.OLEDB.12.0 + Excel 12.0 |
| 權限問題 | SQL Server 服務帳號需讀取檔案目錄權限 |
EPPlus、NPOI、ClosedXML 等純 .NET 程式庫讀取 Excel,再批次 SqlBulkCopy 寫入,脫離 OLEDB 依賴,支援 .xlsx、動態對應欄位、資料驗證。