1. 程式人生 > 其它 >LabWindows操作SQL SERVER

LabWindows操作SQL SERVER

技術標籤: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);