手头有一个项目,以前的数据库是access,使用ADO读取表里的数据,编译执行结果正确;
把连接字符串改为sql server的后,同样的表(从access导出到sql server)读取数据后程序执行的结果却不对,读表列用的是序号,比如GetCollect(1l),查了一天的错,还是没弄清楚原因,不知道哪位有这方面的经验?
如有解答稍靠谱的,马上给满分~
把连接字符串改为sql server的后,同样的表(从access导出到sql server)读取数据后程序执行的结果却不对,读表列用的是序号,比如GetCollect(1l),查了一天的错,还是没弄清楚原因,不知道哪位有这方面的经验?
如有解答稍靠谱的,马上给满分~
解决方案 »
- 用HOOK API进行透明加密,哪位能给提供点思路?谢谢!
- CControlBar的粘贴和复制
- SPI LSP的问题,为什么LSP没有卸载,重启电脑后就上不去网了?
- 请问怎样读取,写入,删除 INI 指定字符串后的某行!
- 这刻,我哭了
- 炎炎夏日 高手们进来喝杯茶 顺便问一个超菜的问题 并顺便送点分!!!!
- 谁用过visual chm 请帮忙啊!(特急)
- 加高分,老问题:有一字符串“abc我aa们dd1你是2jl43y我...”,如何将其拆解成定长为5的几个子字符串?
- 去留
- mediaplayer打开视频后异常中断
- 如何在VS2008的Win32 application项目中添加并使用自定义的Icon
- 如何使一个CDialog窗口弹出后一直处于界面的最前方
我是用 select 读记录集,然后GetCollect中用feild字段名。
------------------------------------------------------------void CCalculateThread::ReadServer()
{
try
{
_bstr_t waterkey;
_bstr_t steelGrade;
double WaterTable[15][31]; _bstr_t sql("SELECT * FROM GRADECODE WHERE [grade code] = '");
sql += _bstr_t(m_strSteelGrade_SteelPage);
sql += "'"; _CommandPtr cmd = CreateCommand(sql);
_RecordsetPtr rs = cmd->Execute(NULL, NULL, adCmdText); steelGrade = rs->GetCollect(1l); rs->Close(); sql = ("SELECT * FROM GRADE WHERE NAME = '");
sql += steelGrade;
sql += "'";
cmd = CreateCommand(sql);
rs = cmd->Execute(NULL, NULL, adCmdText); if (rs->GetRecordCount() > 0)
{
Ts = float(rs->GetCollect(4l));
Tl = float(rs->GetCollect(5l));
rhos = float(rs->GetCollect(6l));
rhosl = float(rs->GetCollect(7l));
rhol = float(rs->GetCollect(8l));
Lbds = float(rs->GetCollect(9l));
Lbdsl = float(rs->GetCollect(10l));
Lbdl = float(rs->GetCollect(11l));
cps = float(rs->GetCollect(12l));
cpsl = float(rs->GetCollect(13l));
cpl = float(rs->GetCollect(14l));
hl = float(rs->GetCollect(15l));
waterkey = rs->GetCollect(34l);
}
rs->Close();
sql = ("SELECT WaterTable.WaterTableKey, LoopName.LoopNumber, SpeedIndex.SpeedIndex, WaterTable.CastingSpeed, WaterTable.Waterflow \
FROM (WaterTable INNER JOIN LoopName ON WaterTable.Loop = LoopName.LoopName) INNER JOIN SpeedIndex ON WaterTable.CastingSpeed = SpeedIndex.Speed \
WHERE (((WaterTable.WaterTableKey)= @key)) \
ORDER BY LoopName.LoopNumber, SpeedIndex.SpeedIndex");
cmd = CreateCommand(sql);
cmd->Parameters->Append(cmd->CreateParameter("key", adBSTR, adParamInput, 0, waterkey));
rs = cmd->Execute(NULL, NULL, adCmdText);
for (int i = 0; rs->adoEOF != VARIANT_TRUE; rs->MoveNext(), i++)
{
WaterTableWs[long(rs->GetCollect(1l))][long(rs->GetCollect(2l))+1] =
rs->GetCollect(4l);
}
rs->Close();
sql = ("SELECT * FROM SPEEDINDEX ORDER BY SPEED");
cmd = CreateCommand(sql);
rs = cmd->Execute(NULL, NULL, adCmdText);
for (i = 1; rs->adoEOF != VARIANT_TRUE; rs->MoveNext(), i++)
{
WaterTableVs[i] = rs->GetCollect(0l);
}
sql = ("SELECT * FROM AIM_TEMPERATURE WHERE GRADENAME = '");
sql += steelGrade;
sql += "' ORDER BY LENGTH";
cmd = CreateCommand(sql);
rs = cmd->Execute(NULL, NULL, adCmdText);
for (i = -1; rs->adoEOF != VARIANT_TRUE; rs->MoveNext(), i++)
{
CtrlAimYs[i+1] = rs->GetCollect(2l);
CtrlAimTs[i+1] = double(rs->GetCollect(3l)) + ABSTEMP;
ZoneAlphas[i+1] = rs->GetCollect(4l);
}
rs->Close();
} catch (_com_error & e)
{
MessageBox(e.Description(), "数据访问错误");
}
int j;
if (MinFlowID == 1)
{
for (j = 1;j <= ZONEN;j++)
{
NozzZoneFlows[1][j] = WaterTableWs[j][1];
}
}
}
ADO在读Sql Server与Access有什么不同吗(除却SQL语法)?
好像没查到这方面的资料,俺上面的代码用的sql语句应该是两者通用的。
这两种方式应该都是一样的效果,改完读数依然错误,改回access的连接字符串马上又是正确的,纳闷。附上面代码的CreateCommand函数,在头文件中定义的:inline
_CommandPtr CreateCommand(_bstr_t & sql)
{
_CommandPtr cmd;
cmd.CreateInstance(__uuidof(Command)); cmd->PutActiveConnection(conn.GetInterfacePtr());
cmd->PutCommandText(sql); return cmd;
}连接字符串也是头文件中定义的:inline
void OpenConnection()
{
AfxEnableControlContainer();
if(!AfxOleInit())//初始化COM库
{
AfxMessageBox("OLE初始化出错!");
} //连接数据库
HRESULT hr; //CString CONNSTRING = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=SCO_DHIDCW3;Data Source=THINKPAD\\sqlserver2005";
CString CONNSTRING = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\SCO_DHIDCW3.mdb;Persist Security Info=False");
hr = conn.CreateInstance(__uuidof(Connection));
if(SUCCEEDED(hr))
{
conn->ConnectionTimeout = 8; conn->PutCursorLocation(adUseClient);//设置游标
try
{
conn->Open(_bstr_t(CONNSTRING), "", "", -1);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败!");
conn.Release();
} }
}
SQL Server没有。
已经搞定了,真不容易啊~~~是差不多,但差一点点也不行啊~~
答案:上面我贴的代码里面把"@key"换成"?"就好了。
稍后我也打算归纳一下ADO读写sql server和access的异同。to mayudong1,确实不必用断点,后来俺在感觉有问题的地方加上try..catch块就查出异常了,再根据异常查点资料,总算定位到错误所在位置了。
根本上还是ole db在处理sql server脚本和access脚本的差异导致的,access脚本的变量直接用@变量名,但sql server必须用通配符"?"来处理变量,这个问题在sql server 2005/2008的SSRS里也存在,只是没想到ole db里面也是这么处理的,狂汗一个~大家的答复对俺的调试用处不大,不过还是谢谢大家的热情答复,就平均给分吧~