大家都知道,在asp.net下如果需要導入excel表格中的數據時,我們都是先把excel文件上傳到服務器,然後讀取數據並寫入數據庫中。這個似乎很簡單,但是在讀取excel文件中的數據時。
public static DataTable GetExcelTable(string Path,string sheet)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
DataTable dt = new DataTable();
try
{
using (OleDbConnection conn = new OleDbConnection(string.Format(strConn, Path)))
{
conn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter("select * from [" + sheet + "$]", conn);
DataSet ds = new DataSet();
myCommand.Fill(ds, "table1");
dt = ds.Tables[0];
}
return dt;
}
catch (Exception e)
{
throw e;
}
}
看似簡單的代碼,有時候卻容易出問題。具體一點說,就是在64位的操作系統上,因爲微軟的驅動都是32位程序,64位好像沒有了。
系統往往提示:The 'Microsoft.ACE.OLEDB.14.0' provider is not registered on the local machine 導入數據庫錯誤
如果是IIS7解決起來就簡單,應用程序池中有個高級設置, 啓用32位程序即可。
而IIS6卻沒有這個,只能通過命令行,執行以下語句。
cscript.exe %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1這個其實就是讓系統能運行32位程序;然後就是把IIS重新啓動一下,同樣是命令行,運行 IISRESET
這個時候再IIS6的管理頁面,你就發現,擴展服務多去一個32bit服務,允許即可
再執行一下IISRESET,然後訪問頁面,重新執行導入就可以了
還有注意一點就是asp.net程序發佈編譯的時候,platform target 選X86