我爱builder

C++Builder 程序员博客

各位大哥好。我现在用ACCESS 2003,我想用sql语句创建一个查询。或者更改ACCESS已经通过向导建立好的查询。不知道该怎么弄…好像不能用create view或 alter view。请问哪个大哥有办法呢。。。急!!!

sql语句不能创建一个查询
sql语句可以查询如: select * from table where field = 5;

  • Filed under: C++ Builder
  • 我要设计一个仪表检测程序,采集仪表的输出量并保存。目前的问题是有的仪表输出的是电流值,有的仪表输出的是脉冲值,那我的想法是在access中设计两种数据表来分别保存,但不知道在查询信息时,如何在DBGrid中显示这两个表中的信息,然后采用不同格式的报表打印。例如,一家公司送来两只表,区别如上述所说的输出量性质,那么当我按公司名称搜索检测记录时,这家公司的两只表应同时显示出来。请哪位高手能给分析下,提供这样的数据库设计思路,谢谢。SQL可以直接连接多个表的啊
    SELECT * from table1,table2 where table1.公司=table2.公司

    SELECT * from table1 inner join table2 on table1.公司=table2.公司
    不知道是不是我没理解楼主的意思~~-_-<
    上学的时候没有学过数据库吗?

    典型的select 语句啊,不需要什么设计思路啊

    adoquery1->Close();
    adoquery1->sql->Clear();
    adoquery1->sql->Text="SELECT * from table1,table2 where table1.公司=table2.公司"
    try
    {
    adoquery1->Open();
    }
    catch(…)
    {
    //error…..
    }建议lz找本SQL的书看看

  • Filed under: C++ Builder
  • 这是我编写的一段用来采集设备读取的数据的程序,在Timer1Timer里测试读数据的情况。单步时候可以正常执行几遍,然后跳出这个错误,出现CPU的画面,不知道是什么原因。这个问题都折腾了好几天了,求高手帮忙。
    #include <vcl.h>
    #pragma hdrstop

    #include "Unit1.h"
    #include "Unit2.h"
    #include "stdlib.h"
    //—————————————————————————
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    HANDLE gm_hDevice;
    int h,w;
    int CurNum=0;
    int gm_nPlus=16;
    unsigned long gm_nCounts;
    short gm_pBuffer[16*10];
    short gm_pBufferTemp[16];
    float gm_Temp1;
    float gm_Temp2;
    int gm_nRangeY;
    int gm_nrTimes=0; //Y方向每导间隔
    int ReadDataFalse=0;
    //int gm_nStartPointy=0; //Y方向绘制开始点;
    int ReadDataTrue=0;

    HINSTANCE gm_Handle;
    FARPROC gm_OpenDevice = NULL,
      gm_ReadData =NULL,
      gm_CloseDevice = NULL;
    bool ReadDataResult =false;
    bool CloseResult = false;
    HANDLE (*lpOpenDevice)()= NULL;
    bool (*lpReadData)(HANDLE ,short* ,ULONG *);
    bool (*lpCloseDevice)(HANDLE);
    //—————————————————————————
    //—————————————————————————
    typedef struct _PARAM
    {
    unsigned short nSenseDegree;
    unsigned short nHightFre;
    unsigned short nTimeConstant;
    unsigned short nWorkFre;
    unsigned short nModeOfSign;
    unsigned short nGateOfJam;
    unsigned short nHold1;
    unsigned short nHold2;
    }STRU_PARAM,*P_STRU_PARAM;
    //———————————————————————————————————

    extern "C" _declspec(dllexport) HANDLE __stdcall OpenDevice();
    extern "C" _declspec(dllexport) bool __stdcall CloseDevice(HANDLE hDevice);
    extern "C" _declspec(dllexport) bool __stdcall ReadData(HANDLE hDevice,short* pBuffer,ULONG *nCounts);
    extern "C" _declspec(dllexport) STRU_PARAM __stdcall ReadParam(HANDLE hDevice);

    //———————————————————————————————————–

    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      Button3->Enabled=false;
      Button4->Enabled=false;
      Button5->Enabled=false;

    }
    //——————————————————————————
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {

      Button1->Enabled = false;
      Button3->Enabled = false ;
      Button4->Enabled = true;
      Button5->Enabled = true;
      Button7->Enabled = false;
      Timer1->Enabled = true;

      //静态调用EEGAMP.dll中的OpenDevice函数
      gm_Handle = LoadLibrary("EEGAMP.dll");
      gm_OpenDevice = GetProcAddress(gm_Handle,"OpenDevice");
      gm_ReadData = GetProcAddress(gm_Handle,"ReadData");
      gm_CloseDevice = GetProcAddress(gm_Handle,"CloseDevice");
      lpOpenDevice = (HANDLE(__cdecl *)())gm_OpenDevice;
      lpReadData = (bool(__cdecl *)(HANDLE,short* ,ULONG *))gm_ReadData;
      lpCloseDevice = (bool(__cdecl *)(HANDLE))gm_CloseDevice;

      gm_hDevice = lpOpenDevice();

      if(gm_hDevice == INVALID_HANDLE_VALUE) Label1->Caption = "打开失败!";

    }

    //——————————————————————————
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    do
      {
      ReadDataResult = lpReadData(gm_hDevice,&gm_pBuffer[0],&gm_nCounts);  
      ReadDataFalse++;
      if(ReadDataFalse == 10) //连续10次未读到数据就关闭设备,重新打开
      {
      ReadDataFalse=0;
      lpCloseDevice(gm_hDevice);
      gm_hDevice = lpOpenDevice();
      lpReadData(gm_hDevice,&gm_pBuffer[0],&gm_nCounts);
      break;
      }
      }
      while(ReadDataResult == false);

      if(ReadDataResult==true)
      {
      ReadDataTrue++;
      }
    }
    //———————————————————————————
    “步时候可以正常执行几遍,然后跳出这个错误,出现CPU的画面,”
    运行到哪个位置 会出错?一般是在timer的事件执行完一遍的时候出错的。//连续10次未读到数据就关闭设备,重新打开
      do
      {
      ReadDataResult = lpReadData(gm_hDevice,&gm_pBuffer[0],&gm_nCounts);
      ReadDataFalse++;
      if(ReadDataFalse == 10) //连续10次未读到数据就关闭设备,重新打开
      {
      ReadDataFalse=0;
      lpCloseDevice(gm_hDevice);不知道关闭成功没有?
      gm_hDevice = lpOpenDevice();//不知道gm_hDevice 是否是NULL?
      lpReadData(gm_hDevice,&gm_pBuffer[0],&gm_nCounts);//执行此处读取之后,下一步如果ReadDataResult ==false则马上执行ReadDataResult = lpReadData(gm_hDevice,&gm_pBuffer[0],&gm_nCounts);//连续执行两次会不会有问题。

      break;
      }
      }
      while(ReadDataResult == false);

      if(ReadDataResult==true)
      {
      ReadDataTrue++;
      }谢谢tinki,我修改程序看一下。还是有问题啊,不过我知道是指针的问题了,谢谢两位。

  • Filed under: C++ Builder
  • 用 ADOConnection 连接一个 Access .mdb 数据库时

    在输入数据库名称时必须是绝对路径吗?

    在BCB 6 时, 我只输入文件名就可以了。 因为我的 数据库与应用在同一个目录。

    在 2010 如果只填文件名称, 在下次重启RS2010打开项目时,提示找不到文件 如下

    找不到文件 ‘C:Documents and Settings
    eeme桌面\clearsky.mdb.

    我的文件不在这个目录,但为什么会加上这个目录呢?调试时你将数据库放在Debug或Release文件夹里与你生成的exe文件在一个目录.从2006开时,生成的文件会放在单独的一个文件夹里运行时没有问题的。 我也把数据库文件在到对应目录里

    只是在修改项目时, RS2010 出现这个提示!我发觉 在 welcom page 打开项目录 会有这个问题

    在 File -> open project 打开项目录, 没有这个问题如果不行你可以在设计时使用这些
    String DBFile = ExtractFilePath(Application->ExeName)+"\clearsky.mdb";
    String Provider1="Provider=Microsoft.Jet.OLEDB.4.0;   Data Source="+DBFile+";Jet OLEDB";
      ADOConnection->ConnectionString = Provider1;
      ADOConnection->Open()  ;String Provider1="Provider=Microsoft.Jet.OLEDB.4.0;  Data Source="+DBFile;

    最近老是出错我猜是,用 welcome page 找开项目, 工程的默认目录为

    C:Documents and Settings
    eeme桌面\

    用 File->Open Project 找开项目, 工程的默认目录为

    工程的当前目录,

    所以后者正常, 这是不是 2010 的 bug ?试了试,

    你的数据库,开发阶段需要放在debug文件夹的上一级目录,而运行时你需要将数据库文件放在debug文件夹里,很容易理解,因为都是在各自的当前目录.

    至于你说的Welcome Page的问题没有.难道你的当前目录不是"C:Documents and Settings
    eeme桌面\"?
    另外中文路径有时也可能有问题.你放在别的目录试试

    ydlchina 老大你有QQ 吗?

    我发给你试试。 我看这是rs2010 一个 BUG!我的QQ是: 907684501

    已经发出,请查收,….谢谢按照你的提示做了,可能是个Bug,或是由于配置的原因我通常是下面这样的写的,没发现什么错误的,楼上的写法好象不太严谨吧
    ADOConnection1->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb(文件名);Persist Security Info=False"

  • Filed under: C++ Builder
  • s0="abcedf";
    ADOQuery->FieldByName("字段名")->AsString=s0.Trim();

    其中“字段名”在MDB里设置的是char (100);

    当把S0存入到数据表后,在数据表里居然保存"abcedf    ",后面全加空格,有没有办法不让它把空格添加进去呢?这个问题这么久还没人回答,帮你顶下吧
    如果我,就先试试Trim(s0),或者把字段长度变小点。或者,不加Trim(),再做个表和字段,存下看看谢谢关注,一样的,你说的方法我都用过了算了,那么存就存吧,你取数据的时候再加个Trim()吧。ADOQuery->FieldByName("字段名")->AsString=s0.Trim(); 之前加上

    ADOQuery->FieldByName("字段名")->AsString.StringOfChar(''); 试试很少用Access了
    不知道你这个字段是类型的
    估计是你的这个字段类型是定长的
    存进入的数据 如果不够长的话 会自动用空格补长的

  • Filed under: C++ Builder
  • 比方access库里的表Memo有两个字段:

    备注            日期
    备注一        2009-10-1
    备注二        2009-10-2

    现在用查询语句:select 备注,日期  from memo where 日期='2009-10-1'
    提示出错,

    改为:select 备注,日期  from memo where 日期="2009-10-1"
    也是提示出错。

    这里的日期字段该怎么办啊,如何选取指定日期的数据啊?

    茅塞顿开,太感谢妖哥了!

  • Filed under: C++ Builder
  • ……
    for (i=0;i <SDBGrid->SelectedRows->Count;i++)
      {
        SAdoTable->GotoBookmark((void *)SDBGrid->SelectedRows->Items[i].c_str());  //DBGrid控件 选中多行
        DAdoTable->Append();
        for (j=0;j <SAdoTable->FieldCount;j++)
        {
            if(SAdoTable->Fields->Fields[j]->DataType==ftAutoInc)
              continue;
            DAdoTable->Fields->Fields[j]->Value=SAdoTable->Fields->Fields[j]->Value;
        }
      }

    ……

    经测试 ,就是这个for语句慢,有没有办法 提高它的速度呢?比如用一条SQL语句,我想过用表复制,但没办法解决
    SAdoTable->GotoBookmark((void *)SDBGrid->SelectedRows->Items[i].c_str());
    不知哪个有办法 解决????

    解决后加100分,

    在http://topic.csdn.net/u/20090620/23/550d12c7-4a2d-46a2-841e-16ac8533a13a.html这里我也发了帖,但没有解决问题

    引用 1 楼 ccrun 的回复:
    我建议将选中行的ID记录下来,然后用一条SQL语句来搞定复制这个操作,筛选条件用多个"or Id=XX"连接起来。

    妖哥的是个好办法,速度有所提高,但相同记录数下,DB表仅用3~4秒,而mdb要用11~12秒,慢了四倍多啊(用我原来的方法,要20~21秒)

    一条SQL语句是搞不定的,因为如果选择过多,会出现“SQL  查询过于复杂”的错误,所以我只能新建一个临时表用于存放所选ID,并保存ID号(这一步又要用到for (i=0;i <SDBGrid->SelectedRows->Count;i++) //这个明显是速度瓶颈,不知还能在此基础上 有什么好的主意吗?

    谢谢

    把什么  for (j=0;j <SAdoTable->FieldCount;j++)
        {
            if(SAdoTable->Fields->Fields[j]->DataType==ftAutoInc)
              continue;
            DAdoTable->Fields->Fields[j]->Value=SAdoTable->Fields->Fields[j]->Value;
      }
    改为
      sql_temp="or 关键字段名="+DAdoTable->Fields->Fields[关键字序号]->Value;

    最后sql_temp="insert into 目标表名 select 需要的字段 from 源表名 where 1 <>1 "+ sql_temp不可以吗?
     

    如果记录过长的话,or 关键字段名="+DAdoTable->Fields->Fields[关键字序号]->Value,就会产生很长的字符串,

    会出现“SQL  查询过于复杂”的错误

    可以在源目标表增加字段吗,这样就可以记录被选择的行而且速度应该还可以?

    To JMG ,你的方法我很早就用过了,一个字,慢,目前来看,还是妖哥的方法快些,就是不知还能不能再快点?

    怎么会慢呢,是改变记录字段时慢(就鼠标点选的时候记可以记录,不会点鼠标的时候飞快吧,汗),还是插入时慢(就一句SQL语句就搞定了),不可能吧!对了,你的源表有多大,还是不是固定表?

    测试表3000多条记录,共25个字段,主要是字符串型 ,MEMO 型,整形  用DB表的话,4秒钟左右搞定,但mdb居然要个11秒左右,就是不知能不能再提高点速度,如果数据量再大的话,就要等个20多秒,也不知是不是我专牛角尖了,呵呵

    插入不慢,

  • Filed under: C++ Builder
  • ……
    for (i=0;i <SDBGrid->SelectedRows->Count;i++)
      {
        SAdoTable->GotoBookmark((void *)SDBGrid->SelectedRows->Items[i].c_str());  //DBGrid控件 选中多行
        DAdoTable->Append();
        for (j=0;j <SAdoTable->FieldCount;j++)
        {
            if(SAdoTable->Fields->Fields[j]->DataType==ftAutoInc)
              continue;
            DAdoTable->Fields->Fields[j]->Value=SAdoTable->Fields->Fields[j]->Value;
        }
      }

    ……

    经测试 ,就是这个for语句慢,有没有办法 提高它的速度呢?比如用一条SQL语句,我想过用表复制,但没办法解决
    SAdoTable->GotoBookmark((void *)SDBGrid->SelectedRows->Items[i].c_str());
    不知哪个有办法 解决????

    解决后加100分,

    在http://topic.csdn.net/u/20090620/23/550d12c7-4a2d-46a2-841e-16ac8533a13a.html这里我也发了帖,但没有解决问题

    引用 1 楼 ccrun 的回复:
    我建议将选中行的ID记录下来,然后用一条SQL语句来搞定复制这个操作,筛选条件用多个"or Id=XX"连接起来。

    妖哥的是个好办法,速度有所提高,但相同记录数下,DB表仅用3~4秒,而mdb要用11~12秒,慢了四倍多啊(用我原来的方法,要20~21秒)

    一条SQL语句是搞不定的,因为如果选择过多,会出现“SQL  查询过于复杂”的错误,所以我只能新建一个临时表用于存放所选ID,并保存ID号(这一步又要用到for (i=0;i <SDBGrid->SelectedRows->Count;i++) //这个明显是速度瓶颈,不知还能在此基础上 有什么好的主意吗?

    谢谢

    把什么  for (j=0;j <SAdoTable->FieldCount;j++)
        {
            if(SAdoTable->Fields->Fields[j]->DataType==ftAutoInc)
              continue;
            DAdoTable->Fields->Fields[j]->Value=SAdoTable->Fields->Fields[j]->Value;
      }
    改为
      sql_temp="or 关键字段名="+DAdoTable->Fields->Fields[关键字序号]->Value;

    最后sql_temp="insert into 目标表名 select 需要的字段 from 源表名 where 1 <>1 "+ sql_temp不可以吗?
     

    如果记录过长的话,or 关键字段名="+DAdoTable->Fields->Fields[关键字序号]->Value,就会产生很长的字符串,

    会出现“SQL  查询过于复杂”的错误

    可以在源目标表增加字段吗,这样就可以记录被选择的行而且速度应该还可以?

    To JMG ,你的方法我很早就用过了,一个字,慢,目前来看,还是妖哥的方法快些,就是不知还能不能再快点?

    怎么会慢呢,是改变记录字段时慢(就鼠标点选的时候记可以记录,不会点鼠标的时候飞快吧,汗),还是插入时慢(就一句SQL语句就搞定了),不可能吧!对了,你的源表有多大,还是不是固定表?

    测试表3000多条记录,共25个字段,主要是字符串型 ,MEMO 型,整形  用DB表的话,4秒钟左右搞定,但mdb居然要个11秒左右,就是不知能不能再提高点速度,如果数据量再大的话,就要等个20多秒,也不知是不是我专牛角尖了,呵呵

    插入不慢,

  • Filed under: C++ Builder
  • 我用的是ADOQuery ,不知ADOTable和ADOQuery 有没有优势?

    加内存,换CPU,在本地不要远程连接。

    网上:

    其實ADOtable及Query都是繼承同一個ADOdataset物件, 一般使用ADOtable 我們是直接指定datasource來源及指定單一tablename, 資料開啟時是將資料表全部記錄一次載入到呼叫端的buffer上, 所以記錄越多開啟時間越久, 除非你事先先進行filter的過濾, ADOquery則是必須透過SQL語法來執行, 一段我們會先對sql進行過濾, 所以使用query會比較好用, 又者如果你想對兩個資料表進行篩選記錄的話, 那非得使用query, 例如 select partno, partname from query1 where partno=(select partno form query2), 所以講白話, 就是table 是簡單式的作業, query則是進階式的運用

  • Filed under: C++ Builder
  •   现在我碰到以下问题:在我开发软件时,我使用系统日期是长日期显示,投入使用时,我将用户的电脑系统日期同样改为长日期显示,软件使用正常,直到用户将系统日期改为短日期后,出现查询结果不准确的现象,比如:我查询的语句是"select * from table where CDate(chsj)>'"+dtp1->Date+"'",这里的dtp1->Date=2009-1-1,可是返回的结果却是2008的记录。但将软件在我长日期系统上使用时,查询结果同样正确,请问有没有可以在长短性日期中都能正常使用的办法(在access下)。

    查询语句中将日期类型格式化一下…

    Access数据库时间查询是用#的
    "select * from table where CDate(chsj)>#"+dtp1->Date+"#"

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档