手头有一个项目,以前的数据库是access,使用ADO读取表里的数据,编译执行结果正确;
把连接字符串改为sql server的后,同样的表(从access导出到sql server)读取数据后程序执行的结果却不对,读表列用的是序号,比如GetCollect(1l),查了一天的错,还是没弄清楚原因,不知道哪位有这方面的经验?
如有解答稍靠谱的,马上给满分~

解决方案 »

  1.   

    你应该把从sql server读数据的代码贴上,并注释代码说明你的目的。
    我是用  select 读记录集,然后GetCollect中用feild字段名。
      

  2.   

    嗯上代码(读数的部分):只是从sql server表中取数,赋给变量,在access下是没有任何问题的。
    ------------------------------------------------------------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];
    }
        }
    }
      

  3.   

    补充问题:
    ADO在读Sql Server与Access有什么不同吗(除却SQL语法)?
    好像没查到这方面的资料,俺上面的代码用的sql语句应该是两者通用的。
      

  4.   

    GetCollect(1l)改成GetCollect((long)1)或者GetCollect((short)1)试试
      

  5.   


    这两种方式应该都是一样的效果,改完读数依然错误,改回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();
    }  }
    }
      

  6.   

    查下sqlserver和access表中相同字段的类型有什么区别,感觉会是数据类型的问题
      

  7.   

    Access一般有一个默认的自动编号列。
    SQL Server没有。
      

  8.   

    应该不是列名导致的,这个我已经测试过了,俺也觉得有可能是数据类型导致的,但我在sql server中的表都是直接从access导出的,按说类型不应该有问题才对,所以才觉得迷茫
      

  9.   

    把从sqlserver中读出来的数据和从access中读出来的数据比较一下,看看哪个字段的数据不一样,再去分析原因
      

  10.   

    SQL Server和Access差别不大,只是SQL Server功能更强大一些既然都是用的ADO连接的方式,除了连接语句不一样外,其他的都差不多的
      

  11.   


    已经搞定了,真不容易啊~~~是差不多,但差一点点也不行啊~~
    答案:上面我贴的代码里面把"@key"换成"?"就好了。
    稍后我也打算归纳一下ADO读写sql server和access的异同。to mayudong1,确实不必用断点,后来俺在感觉有问题的地方加上try..catch块就查出异常了,再根据异常查点资料,总算定位到错误所在位置了。
    根本上还是ole db在处理sql server脚本和access脚本的差异导致的,access脚本的变量直接用@变量名,但sql server必须用通配符"?"来处理变量,这个问题在sql server 2005/2008的SSRS里也存在,只是没想到ole db里面也是这么处理的,狂汗一个~大家的答复对俺的调试用处不大,不过还是谢谢大家的热情答复,就平均给分吧~