LabWindows操作SQL SERVER
阿新 • • 發佈:2020-12-31
技術標籤:LabWindowDBConnectcvi_db.fpDBFetchRandomDBDeactivateSQLDBDisconnect
首要的安裝 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);