ADO导出数据到Excel的怪问题

rmb369 2017-11-02 01:49:12
我使用过多种方法导出数据到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();
...全文
290 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧