C++Builder 程序员博客
2 Aug
各位大哥好。我现在用ACCESS 2003,我想用sql语句创建一个查询。或者更改ACCESS已经通过向导建立好的查询。不知道该怎么弄…好像不能用create view或 alter view。请问哪个大哥有办法呢。。。急!!!
sql语句不能创建一个查询
sql语句可以查询如: select * from table where field = 5;
19 Jul
我要设计一个仪表检测程序,采集仪表的输出量并保存。目前的问题是有的仪表输出的是电流值,有的仪表输出的是脉冲值,那我的想法是在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的书看看
19 Apr
这是我编写的一段用来采集设备读取的数据的程序,在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,我修改程序看一下。
还是有问题啊,不过我知道是指针的问题了,谢谢两位。
10 Feb
用 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"
12 Jan
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('