首要的安装 sqltoolkits.rar,添加 cvi_db.h cvi_db.fp,所有测试环境是LabWindows 2013+SQL SERVER 2008 +WINDOWS7/10
1 全局变量和数据结构
const int channelCount=21; //通道数目
int hdbc; //数据库连接
int hstat; //SQL语句执行
long curRecord=0; //当前记录
long sumRecord=0; //记录总数
//数据存储类型,每一个结构存储两个通道数据
struct AquireDataType
{
char w1NodeName[30]; //通道名称1
float w1WinSpeed; //风速数据1
float w1EnvTemp; //温度数据1
char w2NodeName[30]; //通道名称2
float w2WinSpeed; //风速数据2
float w2EnvTemp; //温度数据2
};
//数据存储数组,每一个结构存储两个通道数据
struct AquireDataType WxpAqurieData[channelCount];
2 数据库连接
//连接数据库
void connectDataBase()
{
int nBufSize=MAX_COMPUTERNAME_LENGTH+1;
TCHAR chBuf[nBufSize];
ZeroMemory(chBuf,nBufSize);
DWORD dwRet=nBufSize;
GetComputerName(chBuf,&dwRet);
char ConnectStr[1000];
sprintf(ConnectStr,"Provider=SQLOLEDB;Data Source=%s;Integrated Security=SSPI;Initial Catalog=DQmultiChannelDB",chBuf);
//LAPTOP-Q8T047LL SKY-20171206OAS
hdbc=DBConnect(ConnectStr);
}
3 完成数据插入操作(这里的字段有点多,采用了代码拼接的方式,其实你可以直接写: insert table(item1,item2) values (val1,val2) )
//插入数据进数据库
void inertDataIntoDB()
{
char temp[100];
char sql[1000]="insert into DQmultiChannel(";
char sql2[1000]="";
char sql3[1000]="";
//拼接字段
for(int i=1; i<channelCount; i++)
{
sprintf(temp,"S%02d,T%02d,S%02d,T%02d",2*i-1,2*i-1,2*i,2*i);
strcat(sql2,temp);
sprintf(temp,"%.2f,%.2f,%.2f,%.2f",
WxpAqurieData[i].w1WinSpeed,WxpAqurieData[i].w1EnvTemp,
WxpAqurieData[i].w2WinSpeed,WxpAqurieData[i].w2EnvTemp);
strcat(sql3,temp);
//最后一个加")"
if(i==channelCount-1)
strcat(sql2,")"),strcat(sql3,")");
else
strcat(sql2,","),strcat(sql3,",");
}
strcat(sql,sql2);
strcat(sql," values (");
strcat(sql,sql3);
hstat = DBActivateSQL (hdbc,sql);
}
4 数据检索(字段绑定也采用了循环代码的方式)
//从数据库读取数据
void WxpGetDataFromDB()
{
char sql[100];
char tt[100];
//格式化组建SQL语言字符串 (条件查询)
sprintf(sql,"select * from DQmultiChannel%","");
//执行SQL语言
hstat=DBActivateSQL(hdbc,sql);
//绑定字段
int count=0;
for(int i=1;i<channelCount;i++)
{
DBBindColFloat(hstat,4*i-2,&(WxpAqurieData[i].w1WinSpeed),&count);
DBBindColFloat(hstat,4*i-1,&(WxpAqurieData[i].w1EnvTemp),&count);
DBBindColFloat(hstat,4*i-0,&(WxpAqurieData[i].w2WinSpeed),&count);
DBBindColFloat(hstat,4*i+1,&(WxpAqurieData[i].w2EnvTemp),&count);
}
DBBindColChar(hstat,82,100,tt,&count,"%s");
sumRecord=DBNumberOfRecords(hstat);
DBFetchRandom(hstat,curRecord);
displayDataTableDB();
sprintf(sql,"多通道历史数据 %s" ,tt);
SetCtrlAttribute(panelHandleDb,PANELdb_WxpDataTableDB,ATTR_LABEL_TEXT,sql);
sprintf(sql,"当前记录 %d / %d" ,curRecord,sumRecord);
SetCtrlVal(panelHandleDb,PANELdb_DataBaseInfor,sql);
//查询执行完毕
DBDeactivateSQL(hstat);
}
5 彻底关闭数据库连接
DBDisconnect(hdbc);