我爱builder

C++Builder 程序员博客

环境:frameA镶嵌在formA上,formB是另一个form
frameA上有一个DBGrid
formB上用了adoquery进行数据库存储

问题是

DBGrid怎么连接到adoquery进行数据库显示?是不是要额外加一个adoquery来负责DBGrid的显示?还有,不用DataSource行吗?觉得这个中间人麻烦,所以不想用他。

没有中间人介绍,无法直接恋爱!

引用 2 楼 i_love_pc 的回复:
没有中间人介绍,无法直接恋爱!

意思说必须通过DataSource?这个东西是干么事的啊?

作媒的

BCB中是这样说的
Use TDataSource to

provide a conduit between a dataset and data-aware controls on a form that enable display, navigation, and editing of the data underlying the dataset.
link two datasets in a master/detail relationship.

All datasets must be associated with a data source component if their data is to be displayed and manipulated in data-aware controls. Similarly, each data-aware control needs to be associated with a data source component in order for the control to receive and manipulate data.

Data source components also link datasets in master-detail relationships.

数据感知控件…必须有…

通过这个,你的DBGIRD才知道这一列写什么数据

C/C++ code
/* 数据源呀,不然DBGrid从哪搞数据,当然你可以直接从Query中读取数据到某个 Grid中显示,那样你可以用它的胞弟控件TStringGrid,但是这样就需要你去 写数据读取代码,刷新代码,还有编辑,更新等代码。而如果你用DBGrid来帮 你,那么可以省去你很多的代码! */

  • Filed under: C++ Builder
  • [color=#0000FF]曾将DBGird连接ADOQuery ,DBGird闪得难受,不知还有什么方法?[/color]

    DBGird连接ADOTable , ADOQuery修改数据,
    怎么让DBGird实时显示修改后的数据?

    DBGird一直连接ADOTable , ADOQuery就可以了嘛,修改后数据POST(),自动显示上了啊!

  • Filed under: C++ Builder
  • 用户服务器上装的是oracle 11g,但没有客户端,
    我在网上查了下,用ado连接oracle大概有两种方法,一种直接连客户端,但无论是ole db provider for oracle还是oracle provider for ole db,都需要有客户端,在网上也没有找到有11g的客户端;
    另一种是建立odbc数据源,然后连数据源,建立odbc数据源可以了,测试连接也通过了,但用ado连接那个数据源的时候,提示未发现数据源名称并且未指定默认驱动器,adoquery的connectionstring是Provider=MSDASQL.1;Persist Security Info=False;User ID=ccc;Data Source=aaa,aaa是建立的数据源的dsn,这是怎么回事呢?如何解决?

    我是这样的
    1.装oracle客户端,用oracle驱动
    2.用微软对oracle支持的驱动 Microsoft Ole DB Provider for oracle
    (装了MDAC就有了)

    1.装oracle客户端,用oracle驱动
    2.用微软对oracle支持的驱动 Microsoft Ole DB Provider for oracle
    (装了MDAC就有了)
    —–只能这样了。个人建议安装客户端好些

    UP

    ORACLE 自带的 OLEDB 客户端是很大很笨重的, 简直是牛魔王

    个人建议安装客户端好些

    引用 3 楼 hmh780210 的回复:
    1.装oracle客户端,用oracle驱动
    2.用微软对oracle支持的驱动 Microsoft Ole DB Provider for oracle
    (装了MDAC就有了)
    —–只能这样了。个人建议安装客户端好些

    网上有个精简客户端下载的.如果你在客户端不需要特别的处理,那个精简客户端足够满足你了.

    Oracle 无论如何都自带客户端的,安装时你可以注意看一下,实际上就是几个DLL,创建可以透过ODBC连接Oracle的驱动,也可以用ADO直接连接Oracle驱动,建议后者。

    用Microsoft OleDB Provider For Oracle !

    来晚了点..一般安装驱动是可以的..

  • Filed under: C++ Builder
  • 因为我要在极短的时间间隔里面,例如500毫秒或者是100毫秒不断的刷新或者是提取数据库记录,ADOQuery能否设置同步或者异步的工作形式

    ADOQuery 本来就是同步的 Borland已经封装好的

    引用 2 楼 fangsp 的回复:
    ADOQuery 本来就是同步的 Borland已经封装好的

    真的吗?好象不是吧… … :)

  • Filed under: C++ Builder
  •       str="select ppa=:ppa from yuechan where ";
          str=str+"farm";
          str=str+"=:queryitem";
          query->Close();
          query->SQL->Clear();
          query->SQL->Add(str);
          query->Parameters->ParamByName("queryitem")->Value=FastCode->Text;
          query->Prepared=true;
          query->Open();
          str1=query->FieldByName("ppa")->AsString;
          这样可以将一条记录保存到str1中

          但是,如果query后得到的是多条记录,那我该怎样将他们保存起来呢?
          比如,query后得到的了三条记录:
          xiaozhang
        xiaowang
        xiaoli
        该怎么保存呢?
          是用dataset么?
          哪位高手指点一下呀,我快郁闷死了,明天就要交了
          另外能详细点说么,我是新手,用的不太熟练

    ADOQuery->FieldByName("Name")->Value就可以取出ADOQuery的某个字段值,当然你还须使用循环一条一条的选。

    或者用select 选到的结果 into另一张空表~ 就保存啦~

    补充一下:
    (select into from)要求目标表(destTbl)不存在,因为在插入时会自动创建。

    谢了,还有个问题我访问的数据表是vfp的表,这时我在select语句中加入参数:ppa(str="select ppa=:ppa from yuechan where "; )就会报错,去掉参数就没问题了,有人说这是因为在bcb中访问vfp必须用vfp的语法才行,请问这种情况怎么将参数传出来呀

    还有,三楼的方法,我试了一下 为什么不能产生新表呀:
    select bm into dbf d:\\sebm from ksjq where
    还有我希望将结果放到一个sql表中,应该怎么写呀

    产生的新表在SQLserver数据库里面~~

    最好还是像2楼说的,用本地变量保存起来就可以了

    但是,问题我访问的数据表是vfp的表,这时我在select语句中加入参数:ppa(str="select ppa=:ppa from yuechan where "; )就会报错,去掉参数就没问题了,有人说这是因为在bcb中访问vfp必须用vfp的语法才行,请问这种情况怎么将参数传出来呀

    回7楼,具体名令怎么写呀比如想将表保存到名为aa的sql表中

    select 内容 into aa

    BCB格式应该这样:
    SELECT  *  INTO  '2222.DB'  FROM  '1111.DB' 
      WHERE    条件

    insert into 222 select * from 111 where 条件

    问题解决了,谢谢大家了,:p

    q贴出来看看 怎么解决滴~~

  • Filed under: C++ Builder
  • 小妹第一次使用CB连接SQL Server 2000数据库,编写了如下代码后,每次运行到第二句,就会报“access violation at address……”这样的错误,实在想不出是哪里出现了错误,请各位高手帮忙解决。
        CDQuery="select * from pointtable";
        DataMod->CDADOQuery->Close();
        DataMod->CDADOQuery->SQL->Clear();
        DataMod->CDADOQuery->SQL->Add(CDQuery);
        DataMod->CDADOQuery->Open();
        DataMod->CDADOQuery->Active=true;

    AnsiString  SQLStr1;
        SQLStr1="select * from pointtable";
        DataMod->CDADOQuery->Close();
        DataMod->CDADOQuery->SQL->Clear();
        DataMod->CDADOQuery->SQL->Add(SQLStr1);
        DataMod->CDADOQuery->Open();

    嗯 ,按照1楼的,2楼的!

    Active=true了就不要用Open

    Open了就不要在设置Active为true了。。

    我按照楼上的说法改了,还是有相同的问题,出现错误后继续运行是可以的,也能浏览pointtable数据库。

    什么错误 贴出来~~ 看看~
    完整代码~~

  • Filed under: C++ Builder
  • 为什么静态创建或者在主窗口的成员函数里动态创建就没有错误,个我把ADOQuery的创建放到一个类里就会出这个错误呢?

    例子:

    C/C++ code
    这样就可以: void __fastcall TForm1::fff(void) { TADOQuery* pQry1; pQry1 = new TADOQuery(NULL); } 这样就不可以: void __fastcall MyClass::fff(void) { TADOQuery* pQry1; pQry1 = new TADOQuery(NULL); //或者这样也不行:pQry1 = new TADOQuery(Form1); }

    我在DELPHI中也遇到过这种情况(在DLL中写类似的代码.) 好像和使用第三方控件在关. 只是猜测. 因为我新建一个工程, 写这样的代码就没有问题. 好像有DBGRIDEH就这样. 时间长了. 记的不是很清楚了.

    引用 2 楼 jjwwang 的回复:
    我在DELPHI中也遇到过这种情况(在DLL中写类似的代码.) 好像和使用第三方控件在关. 只是猜测. 因为我新建一个工程, 写这样的代码就没有问题. 好像有DBGRIDEH就这样. 时间长了. 记的不是很清楚了.

    可我一个第三方控件都没用啊,我写了一个协议转换类里面要用到数据库查询。和组件没什么关系。然后我写了一个只有一个空窗口的Demo调用了一下(新建一个对象),就出错误了。而且试运行是错误。

    我只是猜的, 问题我也一直没搞清楚. 问题并不是BORLAND网站上说的那样子.

    我测试没问题,可能的原因是:在重装之前,你原来的BCB没有卸干净。

    引用 5 楼 keiy 的回复:
    我测试没问题,可能的原因是:在重装之前,你原来的BCB没有卸干净。

    我是连操作系统都一起重装的……

    我发现这个问题很多人问过,可是没有一个帖子圆满解决。看来是比较棘手了……

    引用 4 楼 jjwwang 的回复:
    我只是猜的, 问题我也一直没搞清楚. 问题并不是BORLAND网站上说的那样子.

    是的,我想和版本没什么关系。

    你的类写在哪里了??
    有没有包含相关的头文件??

    C/C++ code
    struct Myclass{ void __fastcall fff() { TADOQuery* pQry1; pQry1 = new TADOQuery(NULL); pQry1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\test.mdb"; pQry1->SQL->Text = "SELECT * FROM blobtest"; pQry1->Active = true; delete pQry1; } }; void __fastcall TForm1::Button1Click(TObject *Sender) { Myclass mc; mc.fff(); }

    我这样写没有出错啊,你是在什么情况下出错的?

    没有人知道么:(

    Question:

    What is the cause of the error "Application is not licensed to use this feature"?

    Answer:

    This error occurs when you try to use components from one version of Delphi, such as Enterprise, with a different version that does not include those components, such as Standard. For example if you try to install the database components from the Enterprise version of Delphi into a Standard installation of Delphi.

    Another possible cause is if you have the Standard version of Delphi installed on your machine and you install the Professional or Enterprise version without first uninstalling the Standard version. This error may also occur if you move a project from one version to another and keep the same compiled units (.dcu). It is best to delete the .dcu files and let them be recreated automatically.

    Note: It is fine to have two different release versions of Delphi on your machine, such as Delphi 4 and Delphi 5, but not two versions of the same release such as Delphi 5 Standard and Delphi 5 Enterprise.

    引用自:http://dn.codegear.com/article/27031

    大致意思是TADOQuery是企业版才能用的东西,当在企业版的主机上安装过专业版的BCB或者delphi后,企业版也就不能再用TADOQuery了(出现application is not licened to use this feature)错误,还有一种情况就是工程文件是由专业版创建的,再用企业版打开,同样有问题。

    我就是这个问题的受害者,原来用bcb5的企业版,一切正常,然后安装了一个bcb6的专业版,结果bab5创建的工程文件TADOQuery不能用了,即使卸载了bcb6、bcb5然后再重装bcb5都不行。最后在其他主机上安装了一个干净的bcb5企业版,创建一个工程文件,加入TADOQuery,再回到有问题的主机上在这个主机上使用,结果没有问题了。看来问题可能出在工程文件身上,那位达人研究一个解决方案啊。

  • Filed under: C++ Builder
  • 表名 tblSun 内有两字段fMONO和fNAME

        ADOQuery1->Open();
        ADOQuery1->Append();
        ADOQuery1->FieldByName("fMONO")->AsString = mono->Text;
        ADOQuery1->FieldByName("fNAME")->AsString = name->Text;
        ADOQuery1->Post();

    用这个方法给fMONO和fNAME添加数据
    fMONO设置不允许重复

    请问该怎样做才能在输入已有fMONO值的情况下 覆盖fNAME
    比如我已经输入过一个fMONO=ABC fNAME=123
    下次再输fMONO=ABC fNAME=234的时候用234覆盖这个123

    因为是新手没分,烦请高手抽空帮下忙,谢谢.

    将ado指向你要改变的那条数据,
    然后:
        ADOQuery1->Edit();
        ADOQuery1->FieldByName("fMONO")->AsString = mono->Text;
        ADOQuery1->Post();

  • Filed under: C++ Builder
  • 本人在用adoquery与ACESS查询表(由多表如a,b形成)相连接后,现对adoquery(主要是a表)进行新增、修改等操作后,都可以进行,但出现在新增时发现在b表中也新增一条记录,记录中只有在a表中出现过的某一字段的值。请各位专家该如何设置。(另b表也在另一adotable中有用作查询)

    左连接,试过了,不行;我的要求只是只要对a表进行操作,而b表无需任何变化。

    该回复于2008-07-19 16:12:22被版主删除

    该回复于2008-07-10 02:45:56被版主删除

  • Filed under: C++ Builder
  • adoquery的BeforePost设置了DataSet->FieldByName("fmono")->AsString = Glass->scbh->Text;

    怎么按回车就自动发送了? 都这样还是只IE8这样… 
    adoquery的BeforePost设置了DataSet->FieldByName("fmono")->AsString = Glass->scbh->Text;
    DBGrid中每加一行 fmono字段中都应该自动加上scbh->text
    可第一次输入的时候都没有, 保存了 第二次再输才有, 不知道哪里出问题了.

    保存是这样的       

    if(scbh->Text==  ""  )
            {
            ShowMessage("Please insert PONO.");
            return;
            }
           
            dm1->qryGlass1->Close();
            dm1->qryGlass1->Open();

            if(dm1->qryGlass1->Locate("fMONO",Variant(scbh->Text),TLocateOptions()))
            {
            ShowMessage("PONo. already exists");
            return;
            }                     

            dm1->qryGlass1->Append();
            dm1->qryGlass1->FieldByName("fmono")->AsString = scbh->Text;
            dm1->qryGlass1->FieldByName("fname")->AsString = ks->Text;
            dm1->qryGlass1->FieldByName("fpdate")->AsDateTime = FormatDateTime("yyy/mm/dd", dtp1->Date);
            dm1->qryGlass1->FieldByName("fsdate")->AsDateTime = FormatDateTime("yyy/mm/dd", dtp2->Date);
            dm1->qryGlass1->FieldByName("fbddate")->AsDateTime = FormatDateTime("yyy/mm/dd", dtp3->Date);
            dm1->qryGlass1->FieldByName("fbdtime")->AsDateTime = FormatDateTime("HH:mm", dtp4->Time);
            dm1->qryGlass1->FieldByName("feddate")->AsDateTime = FormatDateTime("yyy/mm/dd", dtp5->Date);
            dm1->qryGlass1->FieldByName("fedtime")->AsDateTime = FormatDateTime("HH:mm", dtp6->Time);
            dm1->qryGlass1->FieldByName("fcount1")->AsString = blzps->Text;
            dm1->qryGlass1->FieldByName("fcount2")->AsString = glsl->Text;
            dm1->qryGlass1->FieldByName("fmemo1")->AsString = bz->Text;
            dm1->qryGlass1->Post();

            dm1->qryGlass2->EnableControls();
           

            ShowMessage("Success!");

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档