我使用過多種方法匯出資料到Excel,匯出程序大致相同。都是先構造一條帶引數的INSERT陳述句,然后逐個設定引數,接著填入資料執行。再接著填入下一條記錄的資料執行,如此往復插入多條記錄。此外本人反對拼接SQL陳述句的那種方式。
試過的方法有多種:
(1)VC中呼叫ODBC函式,這個沒有方法(3)中的問題。
(2)C# WinForm中呼叫ADO.NET的OleDbXXX類,同樣沒有方法(3)中的問題。
(3)VC中呼叫ADO的類,插入的第一條記錄不會有問題,從第二條記錄開始,第一個欄位應該是字串的,結果打開Excel作業簿后發現該欄位變成了數值1。
代碼如下:
_variant_t vtMissing(DISP_E_PARAMNOTFOUND, VT_ERROR);
//CConnection、CCommand0、CParameters、CParameter是用添加“TypeLib中的MFC類”匯入msado15.dll自動生成的類。
CConnection cn;
CCommand0 cmd;//由于VC中已存在一個叫CCommand的類,為防止沖突,VS2010自動改名了。
CParameters pars;
CParameter par1;
CParameter par2;
CParameter par3;
CParameter par4;
CString str;
BOOL isOpened=FALSE;
//str=……//Excel 連接字串,2003格式和2007格式之間只要切換連接字串即可,后面的代碼相同
//2003格式"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" [xls檔案路徑] \";Extended Properties='Excel 8.0;HDR=Yes;IMEX=0'"
//2007格式"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\" [xlsx檔案路徑] \";Extended Properties='Excel 12.0;HDR=Yes;IMEX=0'"
if(!cn.CreateDispatch(L"ADODB.Connection",NULL))
{
return;
}
if(!cmd.CreateDispatch(L"ADODB.Command",NULL))
{
cn.ReleaseDispatch();
return;
}
par1.CreateDispatch(L"ADODB.Parameter",NULL);
par2.CreateDispatch(L"ADODB.Parameter",NULL);
par3.CreateDispatch(L"ADODB.Parameter",NULL);
par4.CreateDispatch(L"ADODB.Parameter",NULL);
TRY
{
cn.Open(str,L"",L"",adConnectUnspecified);
isOpened=TRUE;
cmd.put_ActiveConnection(_variant_t(cn));
cmd.put_CommandText(L"insert into [Sheet1$] ([姓名],[班級],[語文],[數學]) values (@p1,@p2,@p3,@p4);");
cmd.put_CommandTimeout(30);
cmd.put_CommandType(adCmdText);
cmd.put_NamedParameters(VARIANT_TRUE);
pars.AttachDispatch(cmd.get_Parameters(),TRUE);
par1.put_Name(L"@p1");
par1.put_Type(adVarWChar);
par1.put_Direction(adParamInput);
par1.put_Size(15);
pars.Append(par1);
par2.put_Name(L"@p2");
par2.put_Type(adVarWChar);
par2.put_Direction(adParamInput);
par2.put_Size(15);
pars.Append(par2);
par3.put_Name(L"@p3");
par3.put_Type(adInteger);
par3.put_Direction(adParamInput);
par3.put_Size(4);
pars.Append(par3);
par4.put_Name(L"@p4");
par4.put_Type(adInteger);
par4.put_Direction(adParamInput);
par4.put_Size(4);
pars.Append(par4);
cn.BeginTrans();
//第一條記錄完全正常
par1.put_Value(_variant_t(L"張三"));
par2.put_Value(_variant_t(L"高一(1)班"));
par3.put_Value(_variant_t((long)80));
par4.put_Value(_variant_t((long)78));
cmd.Execute(&vtMissing,&vtMissing,adCmdText|adExecuteNoRecords);
//第二條記錄開始出問題了
par1.put_Value(_variant_t(L"李四"));//打開Excel作業簿發現該欄位竟然變成數值1了!
par2.put_Value(_variant_t(L"高一(2)班"));//然而第2個欄位開始及以后的欄位正常。
par3.put_Value(_variant_t((long)71));
par4.put_Value(_variant_t((long)85));
cmd.Execute(&vtMissing,&vtMissing,adCmdText|adExecuteNoRecords);
cn.CommitTrans();
}
CATCH(CException ,pEx)
{
pEx->ReportError(MB_OK|MB_ICONSTOP);
}
END_CATCH
if(isOpened)
{
cn.Close();
isOpened=FALSE;
}
par4.ReleaseDispatch();
par3.ReleaseDispatch();
par2.ReleaseDispatch();
par1.ReleaseDispatch();
pars.ReleaseDispatch();
cmd.ReleaseDispatch();
cn.ReleaseDispatch();
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/82955.html
標籤:數據庫
