日期:2014-05-16  浏览次数:20931 次

VC ADO中用command访问ACCESS出现问题,求教
VC中用ADO中command访问ACCESS中问题,SQL   SERVER中程序正常.
程序中用到了command,在取command参数个数时,发现问题如下

//   创建命令对象
_CommandPtr   pCommand;
pCommand.CreateInstance(__uuidof(Command));
pCommand-> ActiveConnection   =   *pItem-> pConnection;
                                 
pCommand-> CommandText   =   _bstr_t( "DELETE   FROM   T_DBIndex   WHERE     DBTableName1   =   ?   AND   IndexID1   =   ?   AND   StartTime1   =   ? ");

int   nParamCount   =   0;
nParamCount   =   pCommand-> Parameters-> Count;
for(int   i   =   0;   i   <   nParamCount;   i++)
{
        _ParameterPtr   pParam   =   NULL;
        pParam   =   pCommand-> Parameters-> GetItem((long)i);
        _bstr_t   strParamName   =   pParam-> Name;

}

用上面这段代码访问SQL   SERVER正常取出来的nParamCount   =   3(?个数),   strParamName   循环中取得的分别是Param1,Param2,Param3.
而换到访问ACCESS中时发现nParamCount   =   6,
strParamName   循环中取得的分别是DBTableName1   ,?,IndexID1   ,?,   StartTime1   ,   ?这6个
怀疑是这句在ACCESS中用有问题pCommand-> CommandText   =   _bstr_t( "DELETE   FROM   T_DBIndex   WHERE     DBTableName1   =   ?   AND   IndexID1   =   ?   AND   StartTime1   =   ? ");

不知道在ACCESS中需要改成什么样子?另外,发现在ACCESS中如果上面的参数后面不加1还有可能被当成关键字,比如说这个IndexID,如果没有1的话,nParamCount   =   5,strParamName   循环中取得的分别是DBTableName1   ,?,?,   StartTime1   ,   ?这5个.

哪位达人知道的,说下啊,我查出来原因,不知道怎么解决

------解决方案--------------------
如果表名或字段名与系统保留字重复,需要加[]

如:

select [date] from 表名


------解决方案--------------------
示例:
Dim QQW As New ADODB.Command
QQW.ActiveConnection = CurrentProject.Connection
QQW.CommandType = adCmdText
QQW.CommandText = "SELECT * FROM B1 WHERE CID=? "
QQW.Parameters.Append QQW.CreateParameter( "CS1 ", adChar, adParamInput, 6, "2 ")
For Each RTY In QQW.Parameters
MsgBox RTY.Value & RTY.Name
Next
MsgBox QQW.Parameters.Count
MsgBox QQW.CommandText
Set DFR = QQW.Execute
Do While Not DFR.EOF
MsgBox DFR(0) & DFR(1)
DFR.MoveNext
Loop
------解决方案--------------------
不论哪种语言,代码原理应该类似。

关于你的VC下如何实现,还是去VC开发版去问吧!
------解决方案--------------------
我也是学VB的,在VB下access的参数化查询和SQL server是不一样的,必须用用PARAMETERS指定参数,相信VC下同样吧

比如:你的语句这样试试:
pCommand-> CommandText = _bstr_t( "PARAMETERS @1 text,@2 int,@3 text;DELETE FROM T_DBIndex WHERE DBTableName1 = @1 AND IndexID1 = @2 AND StartTime1 = @3 ");

而且赋值的时候参数顺序不能颠倒

------解决方案--------------------
楼上的不会是VB写的吧
用的VBA

VC的问题请到相应的语言版块去问吧
------解决方案--------------------
好像问题还没解决阿,大家可以先写个很小的程序运行试下,用UDL连ACCESS和SQL SERVER试下,先把问题搞清楚了
------------------------
大家很清楚你的问题,你的问题就是:同样的语句和方法,连接SQL server可以正确执行,连接ACCESS就不能正确执行。
这本来就是正常的事情,一是本身它们就是二种类型的数据库,二是这二种数据库的SQL语法不一样,SQL SERVER是T-SQL,ACCESS是J-SQL。所以解决问题要针对不同的数据库,采用不同的方法。你自己首先要清楚这些!