天天看點

WinCE資料庫操作之CeCreateDatabaseEx

        與CCeDBDatabase類資料庫相比,CeCreateDatabaseEx具有獨特的優勢,其建立路徑可以指定的特性決定了其資料可以永久儲存的 固有優勢,但相比CCeDBDatabase類資料庫而言,CeCreateDatabaseEx完全應用api函數操作,其操作也相對複雜一些。

Records允許的9種資料類型:

                      資料類型                             描述
IVal 2-byte signed integer
UiVal 2-byte unsigned integer
LVal 4-byte signed integer
UlVal 4-byte unsigned integer
FILETIME A time and date structure
LPWSTR 0-terminated Unicode string
CEBLOB A collection of bytes
BOOL Boolean
Double 8-byte signed value

雖然CeCreateDatabaseEx由于直接操作api函數而使得其相對複雜,但将其封裝後最終的使用者就不會覺察,其下是我在使用過程中封裝的幾個類,僅供參考:

// InfoIndexYCBase.h: interface for the CInfoIndexYCBase class.

//

//

#if !defined(AFX_INFOINDEXYCBASE_H__4AC91339_5B2C_4BF0_A721_5E97AD849B2C__INCLUDED_)

#define AFX_INFOINDEXYCBASE_H__4AC91339_5B2C_4BF0_A721_5E97AD849B2C__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CInfoIndexYCBase 

{

public:

 CInfoIndexYCBase();

 virtual ~CInfoIndexYCBase();

public:

 CString ViewParam(void); //檢視結構體内容

protected:

 enum{YCCOUNT = 13, STANDBYCOUNT = 10}; //YCCOUNT代表遙測量個數、STANDBYCOUNT代表備用參數個數

public:

 //設定、擷取No

 void SetNo(const CString &strNo);

 const CString GetNo(void)const;

 //設定、擷取SNo

 void SetSNo(const CString &strSNo);

 const CString GetSNo(void)const;

 //設定、擷取一次、二次标志

 //TRUE為一次、FALSE為二次

 void SetTransFlag(const BOOL &bTransFlag);

 const BOOL GetTransFlag(void)const;

 //設定、擷取PT一次(不取float類型是因為含有機關)

 void SetPT1(const CString &strPT1);

 const CString GetPT1(void)const;

 //設定、擷取PT二次

 void SetPT2(const CString &strPT2);

 const CString GetPT2(void)const;

 //設定、擷取CT一次

 void SetCT1(const CString &strCT1);

 const CString GetCT1(void)const;

 //設定、擷取CT二次

 void SetCT2(const CString &strCT2);

 const CString GetCT2(void)const;

 //設定、擷取遙測量選擇标志

 void SetYCSelectFlag(const BOOL *pbYCSelect, const int &nYCCount = YCCOUNT);

 void GetYCSelectFlag(BOOL *pbYCSelect, const int &nYCCount = YCCOUNT);

 //設定、擷取協定類型

 void SetProtocolID(const int &nProtocolID);

 const int GetProtocolID(void)const;

 //設定、擷取點表配置步驟索引

 void SetIndexConfigStep(const int &nIndexConfigStep);

 const int GetIndexConfigStep(void)const;

 //設定、擷取遙測量辨別碼有效标志

 void SetMarkEffectFlag(const BOOL *pbMarkEffectFlag, const int &nStandbyCount = STANDBYCOUNT);

 void GetMarkEffectFlag(BOOL *pbMarkEffectFlag, const int &nStandbyCount = STANDBYCOUNT);

 //設定、擷取是否已配置詳細資訊标志

 void SetHaveDetailInfoFlag(const BOOL &bHaveDetailInfoFlag);

 BOOL GetHaveDetailInfoFlag(void);

 //設定、擷取遙測量索引有效标志

 void SetYCIndexEffectFlag(const BOOL *pbYCIndexEffectFlag, const int &nYCCount = YCCOUNT);

 void GetYCIndexEffectFlag(BOOL *pbYCIndexEffectFlag, const int &nYCCount = YCCOUNT);

 //設定、擷取遙測量算法

 void SetYCArith(const int *pnYCArith, const int &nYCCount = YCCOUNT);

 void GetYCArith(int *pnYCArith, const int &nYCCount = YCCOUNT);

 //設定、擷取系數K

 void SetCoefficientK(const float *pfCoefficientK, const int &nYCCount = YCCOUNT);

 void GetCoefficientK(float *pfCoefficientK, const int &nYCCount = YCCOUNT);

 //設定、擷取系數B

 void SetCoefficientB(const float *pfCoefficientB, const int &nYCCount = YCCOUNT);

 void GetCoefficientB(float *pfCoefficientB, const int &nYCCount = YCCOUNT);

protected:

 void NewPropVal(CEPROPVAL *prgPropVal,

     const int &nStartIndex,

     int &nIndex);

 void PropValToRecord(CEPROPVAL *prgPropVal, int &nIndex);

 void DeletePropVal(void);

protected:

 //将數組轉換為指定格式(Ua|Ub|Uc|Uab|Ucb|Uca|Ia|Ib|Ic|P|Q|Cos|F)

 CString FormatDataToSpecialStr(const int *pnData, const int &nYCCount = YCCOUNT);

 CString FormatDataToSpecialStr(const float *pfData, const int &nYCCount = YCCOUNT);

 //将指定格式的字元串分離成數組

 void DetachDataFromSpecialStr(const CString &strData, int *pnData, const int &nYCCount = YCCOUNT);

 void DetachDataFromSpecialStr(const CString &strData, float *pfData, const int &nYCCount = YCCOUNT);

 //指派,為子類重載 = 做準備

 void Evaluate(const CInfoIndexYCBase &infoIndexBase);

protected:

 CString m_strNo;     //No

 CString m_strSNo;     //SNo

 CString m_strTransFlag;    //一次、二次标志。0為二次、1為一次

 CString m_strPT1;     //PT一次

 CString m_strPT2;     //PT二次

 CString m_strCT1;     //CT一次

 CString m_strCT2;     //CT二次

 //遙測量選擇标志

 //其格式為:Ua|Ub|Uc|Uab|Ucb|Uca|Ia|Ib|Ic|P|Q|Cos|F

 //選中為1、否則為0

 CString m_strYCSelectFlag;

 CString m_strProtocolID;   //協定類型:-1代表未配、0代表Finally、1代表Other、2代表CDT、3代表101、4代表103、5代表104

 CString m_strIndexConfigStep;  //點表資訊配置步驟索引:-1代表未配、0代表已配置基本資訊、1代表已配置詳細資訊

 CString m_strMarkEffectFlag;  //遙測辨別碼有效标志,0為無效、1為有效

 CString m_strHaveDetailInfoFlag; //是否已配置詳細資訊标志

 CString m_strYCIndexEffectFlag;  //遙測索引有效标志,針對每一個遙測量是否配置索引。0為無效、1為有效

 CString m_strYCArith;    //遙測量算法,其格式為:Ua|Ub|Uc|Uab|Ucb|Uca|Ia|Ib|Ic|P|Q|Cos|F,未配置為-1

 CString m_strCoefficientK;   //系數K,其格式為:Ua|Ub|Uc|Uab|Ucb|Uca|Ia|Ib|Ic|P|Q|Cos|F

 CString m_strCoefficientB;   //系數B,其格式為:Ua|Ub|Uc|Uab|Ucb|Uca|Ia|Ib|Ic|P|Q|Cos|F

};

#endif // !defined(AFX_INFOINDEXYCBASE_H__4AC91339_5B2C_4BF0_A721_5E97AD849B2C__INCLUDED_)

// InfoIndexYCBase.cpp: implementation of the CInfoIndexYCBase class.

//

//

#include "stdafx.h"

#include "InfoIndexYCBase.h"

//

// Construction/Destruction

//

CInfoIndexYCBase::CInfoIndexYCBase()

{

 m_strNo = _T("");     //No

 m_strSNo = _T("");     //SNo

 m_strTransFlag = _T("");   //一次、二次标志。0為二次、1為一次

 m_strPT1 = _T("");     //PT一次

 m_strPT2 = _T("");     //PT二次

 m_strCT1 = _T("");     //CT一次

 m_strCT2 = _T("");     //CT二次

 m_strYCSelectFlag = _T("-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1"); //遙測量選擇标志

 m_strProtocolID = _T("-1");    //協定類型:-1代表未配、0代表Finally、1代表Other、2代表CDT、3代表101、4代表103、5代表104

 m_strIndexConfigStep = _T("-1");  //點表資訊配置步驟索引:-1代表未配、0代表已配置基本資訊、1代表已配置詳細資訊

 m_strMarkEffectFlag = _T("0|0|0|0|0|0|0|0|0|0");     //遙測量辨別碼有效位

 m_strHaveDetailInfoFlag = _T("0");         //是否已配置詳細資訊标志

 m_strYCIndexEffectFlag = _T("0|0|0|0|0|0|0|0|0|0|0|0|0");;   //遙測索引有效标志,0為無效、1為有效

 m_strYCArith = _T("-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1");  //遙測量算法,格式如上

 m_strCoefficientK = _T("0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0");

 m_strCoefficientB = _T("0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0|0.0");

}

CInfoIndexYCBase::~CInfoIndexYCBase()

{

}

//檢視結構體内容

CString CInfoIndexYCBase::ViewParam()

{

 CString str;

 str = _T("No: ") + m_strNo + _T("/n");

 str += _T("SNo: ") + m_strSNo + _T("/n");

 str += _T("一次、二次标志: ") + m_strTransFlag + _T("/n");

 str += _T("PT一次: ") + m_strPT1 + _T("/t");

 str += _T("PT二次: ") + m_strPT2 + _T("/n");

 str += _T("CT一次: ") + m_strCT1 + _T("/t");

 str += _T("CT二次: ") + m_strCT2 + _T("/n");

 str += _T("遙測量選擇标志: ") + m_strYCSelectFlag + _T("/n");

 str += _T("協定類型: ") + m_strProtocolID + _T("/n");

 str += _T("點表資訊配置步驟索引: ") + m_strIndexConfigStep + _T("/n");

 str += _T("遙測辨別碼有效标志: ") + m_strMarkEffectFlag + _T("/n");

 str += _T("是否已配置詳細資訊标志: ") + m_strHaveDetailInfoFlag + _T("/n");

 str += _T("遙測索引有效标志: ") + m_strYCIndexEffectFlag + _T("/n");

 str += _T("遙測量算法: ") + m_strYCArith + _T("/n");

 str += _T("系數K: ") + m_strCoefficientK + _T("/n");

 str += _T("系數B: ") + m_strCoefficientB + _T("/n/n");

 return str;

}

//将數組轉換為指定格式(Ua|Ub|Uc|Uab|Ucb|Uca|Ia|Ib|Ic|P|Q|Cos|F)

CString CInfoIndexYCBase::FormatDataToSpecialStr(const int *pnData, const int &nYCCount)

{

 ASSERT(nYCCount > 0);

 CString str(_T("")), str1(_T(""));

 str.Format(_T("%d"), pnData[0]);

 for(register int i = 1; i < nYCCount; i++)

 {

  str1.Format(_T("|%d"), pnData[i]);

  str += str1;

 }

 return str;

}

CString CInfoIndexYCBase::FormatDataToSpecialStr(const float *pfData, const int &nYCCount)

{

 ASSERT(nYCCount > 0);

 CString str(_T("")), str1(_T(""));

 str.Format(_T("%f"), pfData[0]);

 for(register int i = 1; i < nYCCount; i++)

 {

  str1.Format(_T("|%f"), pfData[i]);

  str += str1;

 }

 return str;

}

//将指定格式的字元串分離成數組

void CInfoIndexYCBase::DetachDataFromSpecialStr(const CString &strData, int *pnData, const int &nYCCount)

{

 ASSERT(nYCCount > 0);

 CString strTemp(strData), str;

 for(register int i = 0; i < nYCCount; i++)

 {

  str = strTemp;

  if(str.Find(_T("|"), 0) != -1)

  {

   str.Delete(strTemp.Find(_T("|"), 0), strTemp.GetLength() - strTemp.Find(_T("|"), 0));

   strTemp.Delete(0, strTemp.Find(_T("|"), 0) + 1);

  }

  swscanf(str, _T("%d"), &pnData[i]);

 }

}

void CInfoIndexYCBase::DetachDataFromSpecialStr(const CString &strData, float *pfData, const int &nYCCount)

{

 ASSERT(nYCCount > 0);

 CString strTemp(strData), str;

 for(register int i = 0; i < nYCCount; i++)

 {

  str = strTemp;

  if(str.Find(_T("|"), 0) != -1)

  {

   str.Delete(strTemp.Find(_T("|"), 0), strTemp.GetLength() - strTemp.Find(_T("|"), 0));

   strTemp.Delete(0, strTemp.Find(_T("|"), 0) + 1);

  }

  swscanf(str, _T("%f"), &pfData[i]);

 }

}

//設定、擷取No

void CInfoIndexYCBase::SetNo(const CString &strNo)

{

 m_strNo = strNo;

}

const CString CInfoIndexYCBase::GetNo()const

{

 return m_strNo;

}

//設定、擷取SNo

void CInfoIndexYCBase::SetSNo(const CString &strSNo)

{

 m_strSNo = strSNo;

}

const CString CInfoIndexYCBase::GetSNo()const

{

 return m_strSNo;

}

//設定、擷取一次、二次标志

//TRUE為一次、FALSE為二次

void CInfoIndexYCBase::SetTransFlag(const BOOL &bTransFlag)

{

 m_strTransFlag = bTransFlag ? _T("1") : _T("0");

}

const BOOL CInfoIndexYCBase::GetTransFlag()const

{

 if(m_strTransFlag == _T("1"))

  return TRUE;

 return FALSE;

}

//設定、擷取PT一次(不取float類型是因為含有機關)

void CInfoIndexYCBase::SetPT1(const CString &strPT1)

{

 m_strPT1 = strPT1;

}

const CString CInfoIndexYCBase::GetPT1()const

{

 return m_strPT1;

}

//設定、擷取PT二次

void CInfoIndexYCBase::SetPT2(const CString &strPT2)

{

 m_strPT2 = strPT2;

}

const CString CInfoIndexYCBase::GetPT2()const

{

 return m_strPT2;

}

//設定、擷取CT一次

void CInfoIndexYCBase::SetCT1(const CString &strCT1)

{

 m_strCT1 = strCT1;

}

const CString CInfoIndexYCBase::GetCT1()const

{

 return m_strCT1;

}

//設定、擷取CT二次

void CInfoIndexYCBase::SetCT2(const CString &strCT2)

{

 m_strCT2 = strCT2;

}

const CString CInfoIndexYCBase::GetCT2()const

{

 return m_strCT2;

}

//設定、擷取遙測量選擇标志

void CInfoIndexYCBase::SetYCSelectFlag(const BOOL *pbYCSelect, const int &nYCCount)

{

 m_strYCSelectFlag = FormatDataToSpecialStr(pbYCSelect, nYCCount);

}

void CInfoIndexYCBase::GetYCSelectFlag(BOOL *pbYCSelect, const int &nYCCount)

{

 DetachDataFromSpecialStr(m_strYCSelectFlag, pbYCSelect, nYCCount);

}

//設定、擷取協定類型

void CInfoIndexYCBase::SetProtocolID(const int &nProtocolID)

{

 m_strProtocolID.Format(_T("%d"), nProtocolID);

}

const int CInfoIndexYCBase::GetProtocolID()const

{

 int nRet;

 swscanf(m_strProtocolID, _T("%d"), &nRet);

 return nRet;

}

//設定、擷取點表配置步驟索引

void CInfoIndexYCBase::SetIndexConfigStep(const int &nIndexConfigStep)

{

 m_strIndexConfigStep.Format(_T("%d"), nIndexConfigStep);

}

const int CInfoIndexYCBase::GetIndexConfigStep()const

{

 int nRet;

 swscanf(m_strIndexConfigStep, _T("%d"), &nRet);

 return nRet;

}

//設定、擷取遙測量辨別碼有效标志

void CInfoIndexYCBase::SetMarkEffectFlag(const BOOL *pbMarkEffectFlag, const int &nStandbyCount)

{

 m_strMarkEffectFlag = FormatDataToSpecialStr(pbMarkEffectFlag, nStandbyCount);

}

void CInfoIndexYCBase::GetMarkEffectFlag(BOOL *pbMarkEffectFlag, const int &nStandbyCount)

{

 DetachDataFromSpecialStr(m_strMarkEffectFlag, pbMarkEffectFlag, nStandbyCount);

}

//設定、擷取是否已配置詳細資訊标志

void CInfoIndexYCBase::SetHaveDetailInfoFlag(const BOOL &bHaveDetailInfoFlag)

{

 m_strHaveDetailInfoFlag = bHaveDetailInfoFlag ? _T("1") : _T("0");

}

BOOL CInfoIndexYCBase::GetHaveDetailInfoFlag()

{

 BOOL bRet = (m_strHaveDetailInfoFlag == _T("0")) ? FALSE : TRUE;

 return bRet;

}

//設定、擷取遙測量索引有效标志

void CInfoIndexYCBase::SetYCIndexEffectFlag(const BOOL *pbYCIndexEffectFlag, const int &nYCCount)

{

 m_strYCIndexEffectFlag = FormatDataToSpecialStr(pbYCIndexEffectFlag, nYCCount);

}

void CInfoIndexYCBase::GetYCIndexEffectFlag(BOOL *pbYCIndexEffectFlag, const int &nYCCount)

{

 DetachDataFromSpecialStr(m_strYCIndexEffectFlag, pbYCIndexEffectFlag, nYCCount);

}

//設定、擷取遙測量算法

void CInfoIndexYCBase::SetYCArith(const int *pnYCArith, const int &nYCCount)

{

 m_strYCArith = FormatDataToSpecialStr(pnYCArith, nYCCount);

}

void CInfoIndexYCBase::GetYCArith(int *pnYCArith, const int &nYCCount)

{

 DetachDataFromSpecialStr(m_strYCArith, pnYCArith, nYCCount);

}

//設定、擷取系數K

void CInfoIndexYCBase::SetCoefficientK(const float *pfCoefficientK, const int &nYCCount)

{

 m_strCoefficientK = FormatDataToSpecialStr(pfCoefficientK, nYCCount);

}

void CInfoIndexYCBase::GetCoefficientK(float *pfCoefficientK, const int &nYCCount)

{

 DetachDataFromSpecialStr(m_strCoefficientK, pfCoefficientK, nYCCount);

}

//設定、擷取系數B

void CInfoIndexYCBase::SetCoefficientB(const float *pfCoefficientB, const int &nYCCount)

{

 m_strCoefficientB = FormatDataToSpecialStr(pfCoefficientB, nYCCount);

}

void CInfoIndexYCBase::GetCoefficientB(float *pfCoefficientB, const int &nYCCount)

{

 DetachDataFromSpecialStr(m_strCoefficientB, pfCoefficientB, nYCCount);

}

void CInfoIndexYCBase::NewPropVal( CEPROPVAL *prgPropVal,

         const int &nStartIndex,

         int &nIndex)

{

 //No

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strNo.LockBuffer();

 //SNo

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strSNo.LockBuffer();

 //一次、二次标志

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strTransFlag.LockBuffer();

 //PT一次

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strPT1.LockBuffer();

 //PT二次

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strPT2.LockBuffer();

 //CT一次

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strCT1.LockBuffer();

 //CT二次

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strCT2.LockBuffer();

 //遙測量選擇标志

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strYCSelectFlag.LockBuffer();

 //協定類型

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strProtocolID.LockBuffer();

 //點表配置步驟索引

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strIndexConfigStep.LockBuffer();

 //遙測量辨別碼有效标志

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strMarkEffectFlag.LockBuffer();

 //是否已配置詳細資訊标志

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strHaveDetailInfoFlag.LockBuffer();

 //遙測量索引有效标志

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strYCIndexEffectFlag.LockBuffer();

 //遙測量算法

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strYCArith.LockBuffer();

 //系數K

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strCoefficientK.LockBuffer();

 //系數B

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, nStartIndex + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strCoefficientB.LockBuffer();

}

void CInfoIndexYCBase::PropValToRecord(CEPROPVAL *prgPropVal, int &nIndex)

{

 wcscpy(m_strNo.GetBuffer(255),     prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strSNo.GetBuffer(255),     prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strTransFlag.GetBuffer(255),   prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strPT1.GetBuffer(255),     prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strPT2.GetBuffer(255),     prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strCT1.GetBuffer(255),     prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strCT2.GetBuffer(255),     prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strYCSelectFlag.GetBuffer(255),  prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strProtocolID.GetBuffer(255),   prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strIndexConfigStep.GetBuffer(255),  prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strMarkEffectFlag.GetBuffer(255),  prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strHaveDetailInfoFlag.GetBuffer(255), prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strYCIndexEffectFlag.GetBuffer(255), prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strYCArith.GetBuffer(255),    prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strCoefficientK.GetBuffer(255),  prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strCoefficientB.GetBuffer(255),  prgPropVal[nIndex++].val.lpwstr);

 m_strNo.ReleaseBuffer();

 m_strSNo.ReleaseBuffer();

 m_strTransFlag.ReleaseBuffer();

 m_strPT1.ReleaseBuffer();

 m_strPT2.ReleaseBuffer();

 m_strCT1.ReleaseBuffer();

 m_strCT2.ReleaseBuffer();

 m_strYCSelectFlag.ReleaseBuffer();

 m_strProtocolID.ReleaseBuffer();

 m_strIndexConfigStep.ReleaseBuffer();

 m_strMarkEffectFlag.ReleaseBuffer();

 m_strHaveDetailInfoFlag.ReleaseBuffer();

 m_strYCIndexEffectFlag.ReleaseBuffer();

 m_strYCArith.ReleaseBuffer();

 m_strCoefficientK.ReleaseBuffer();

 m_strCoefficientB.ReleaseBuffer();

}

void CInfoIndexYCBase::DeletePropVal()

{

 m_strNo.UnlockBuffer();

 m_strSNo.UnlockBuffer();

 m_strTransFlag.UnlockBuffer();

 m_strPT1.UnlockBuffer();

 m_strPT2.UnlockBuffer();

 m_strCT1.UnlockBuffer();

 m_strCT2.UnlockBuffer();

 m_strYCSelectFlag.UnlockBuffer();

 m_strProtocolID.UnlockBuffer();

 m_strIndexConfigStep.UnlockBuffer();

 m_strMarkEffectFlag.UnlockBuffer();

 m_strHaveDetailInfoFlag.UnlockBuffer();

 m_strYCIndexEffectFlag.UnlockBuffer();

 m_strYCArith.UnlockBuffer();

 m_strCoefficientK.UnlockBuffer();

 m_strCoefficientB.UnlockBuffer();

}

//指派,為子類重載 = 做準備

void CInfoIndexYCBase::Evaluate(const CInfoIndexYCBase &infoIndexBase)

{

 m_strNo = infoIndexBase.m_strNo;

 m_strSNo = infoIndexBase.m_strSNo;

 m_strTransFlag = infoIndexBase.m_strTransFlag;

 m_strPT1 = infoIndexBase.m_strPT1;

 m_strPT2 = infoIndexBase.m_strPT2;

 m_strCT1 = infoIndexBase.m_strCT1;

 m_strCT2 = infoIndexBase.m_strCT2;

 m_strYCSelectFlag = infoIndexBase.m_strYCSelectFlag;

 m_strProtocolID = infoIndexBase.m_strProtocolID;

 m_strIndexConfigStep = infoIndexBase.m_strIndexConfigStep;

 m_strMarkEffectFlag = infoIndexBase.m_strMarkEffectFlag;

 m_strHaveDetailInfoFlag = infoIndexBase.m_strHaveDetailInfoFlag;

 m_strYCIndexEffectFlag = infoIndexBase.m_strYCIndexEffectFlag;

 m_strYCArith = infoIndexBase.m_strYCArith;

 m_strCoefficientK = infoIndexBase.m_strCoefficientK;

 m_strCoefficientB = infoIndexBase.m_strCoefficientB;

}

// InfoIndexYCCDT.h: interface for the CInfoIndexYCCDT class.

//

//

#if !defined(AFX_INFOINDEXYCCDT_H__A127D99D_91CD_4B38_A98B_12A8FD3C731F__INCLUDED_)

#define AFX_INFOINDEXYCCDT_H__A127D99D_91CD_4B38_A98B_12A8FD3C731F__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "InfoIndexYCBase.h"

class CInfoIndexYCCDT : public CInfoIndexYCBase 

{

public:

 CInfoIndexYCCDT();

 virtual ~CInfoIndexYCCDT();

public:

 void ViewParam(void); //檢視結構體内容

private:

 enum{PROPERTYCOUNT = 19, STARTINDEX = 1300};

public:

 static int GetPropertyCount(void);

 CInfoIndexYCCDT& operator =(const CInfoIndexYCCDT &infoIndexYCCDT);

public:

 //設定、擷取功能碼

 void SetFuncCode(const int *pnFuncCode, const int &nStandbyCount = STANDBYCOUNT);

 void GetFuncCode(int *pnFuncCode, const int &nStandbyCount = STANDBYCOUNT);

 //設定、擷取功能碼位置

 void SetFuncCodeAddr(const int &nFuncCodeAddr);

 const int GetFuncCodeAddr(void)const;

 //設定、擷取點号

 void SetDotNo(const int *pnDotNo, const int &nYCCount = YCCOUNT);

 void GetDotNo(int *pnDotNo, const int &nYCCount = YCCOUNT);

public:

 CEPROPVAL* NewPropVal(void);

 void PropValToRecord(CEPROPVAL *prgPropVal);

 void DeletePropVal(CEPROPVAL *prgPropVal);

private:

 CString m_strFuncCode;   //功能碼,其格式為:功能碼1|功能碼2|功能碼3|功能碼4|功能碼5|功能碼6|功能碼7|功能碼8|功能碼9|功能碼10

 CString m_strFuncCodeAddr;  //功能碼位置 

 CString m_strDotNo;    //點号,其格式為:Ua|Ub|Uc|Uab|Ucb|Uca|Ia|Ib|Ic|P|Q|Cos|F

};

#endif // !defined(AFX_INFOINDEXYCCDT_H__A127D99D_91CD_4B38_A98B_12A8FD3C731F__INCLUDED_)

// InfoIndexYCCDT.cpp: implementation of the CInfoIndexYCCDT class.

//

//

#include "stdafx.h"

#include "InfoIndexYCCDT.h"

//

// Construction/Destruction

//

CInfoIndexYCCDT::CInfoIndexYCCDT()

{

 m_strFuncCode = _T("-1|-1|-1|-1|-1|-1|-1|-1|-1|-1");

 m_strFuncCodeAddr = _T("-1");

 m_strDotNo = _T("-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1");

}

CInfoIndexYCCDT::~CInfoIndexYCCDT()

{

}

//檢視結構體内容

void CInfoIndexYCCDT::ViewParam()

{

 CString str;

 str = _T("功能碼: ") + m_strFuncCode + _T("/n");

 str += _T("功能碼位置: ") + m_strFuncCodeAddr + _T("/n");

 str += _T("點号: ") + m_strDotNo;

 str = CInfoIndexYCBase::ViewParam() + str;

 AfxMessageBox(str);

}

int CInfoIndexYCCDT::GetPropertyCount()

{

 return PROPERTYCOUNT;

}

CInfoIndexYCCDT& CInfoIndexYCCDT::operator =(const CInfoIndexYCCDT &infoIndexYCCDT)

{

 if(this == &infoIndexYCCDT)

  return *this;

 CInfoIndexYCBase::Evaluate(infoIndexYCCDT);

 m_strFuncCode = infoIndexYCCDT.m_strFuncCode;

 m_strFuncCodeAddr = infoIndexYCCDT.m_strFuncCodeAddr;

 m_strDotNo = infoIndexYCCDT.m_strDotNo;

 return *this;

}

//設定、擷取功能碼

void CInfoIndexYCCDT::SetFuncCode(const int *pnFuncCode, const int &nStandbyCount)

{

 m_strFuncCode = FormatDataToSpecialStr(pnFuncCode, nStandbyCount);

}

void CInfoIndexYCCDT::GetFuncCode(int *pnFuncCode, const int &nStandbyCount)

{

 DetachDataFromSpecialStr(m_strFuncCode, pnFuncCode, nStandbyCount);

}

//設定、擷取功能碼位置

void CInfoIndexYCCDT::SetFuncCodeAddr(const int &nFuncCodeAddr)

{

 m_strFuncCodeAddr.Format(_T("%d"), nFuncCodeAddr);

}

const int CInfoIndexYCCDT::GetFuncCodeAddr()const

{

 int nRet = 0;

 swscanf(m_strFuncCodeAddr, _T("%d"), &nRet);

 return nRet;

}

//設定、擷取點号

void CInfoIndexYCCDT::SetDotNo(const int *pnDotNo, const int &nYCCount)

{

 m_strDotNo = FormatDataToSpecialStr(pnDotNo, nYCCount);

}

void CInfoIndexYCCDT::GetDotNo(int *pnDotNo, const int &nYCCount)

{

 DetachDataFromSpecialStr(m_strDotNo, pnDotNo, nYCCount);

}

CEPROPVAL* CInfoIndexYCCDT::NewPropVal()

{

 CEPROPVAL *prgPropVal = new CEPROPVAL[PROPERTYCOUNT];

 ZeroMemory(prgPropVal, sizeof(CEPROPVAL[PROPERTYCOUNT]));

 int nIndex = 0;

 //基類函數

 CInfoIndexYCBase::NewPropVal(prgPropVal, STARTINDEX, nIndex);

 //功能碼

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, STARTINDEX + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strFuncCode.LockBuffer();

 //功能碼位置

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, STARTINDEX + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strFuncCodeAddr.LockBuffer();

 //點号

 prgPropVal[nIndex].propid = MAKELONG(CEVT_LPWSTR, STARTINDEX + nIndex);

 prgPropVal[nIndex++].val.lpwstr = m_strDotNo.LockBuffer();

 return prgPropVal;

}

void CInfoIndexYCCDT::PropValToRecord(CEPROPVAL *prgPropVal)

{

 int nIndex = 0;

 //基類函數

 CInfoIndexYCBase::PropValToRecord(prgPropVal, nIndex);

 wcscpy(m_strFuncCode.GetBuffer(255),   prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strFuncCodeAddr.GetBuffer(255),  prgPropVal[nIndex++].val.lpwstr);

 wcscpy(m_strDotNo.GetBuffer(255),    prgPropVal[nIndex++].val.lpwstr);

 m_strFuncCode.ReleaseBuffer();

 m_strFuncCodeAddr.ReleaseBuffer();

 m_strDotNo.ReleaseBuffer();

}

void CInfoIndexYCCDT::DeletePropVal(CEPROPVAL *prgPropVal)

{

 //基類函數

 CInfoIndexYCBase::DeletePropVal();

 m_strFuncCode.UnlockBuffer();

 m_strFuncCodeAddr.UnlockBuffer();

 m_strDotNo.UnlockBuffer();

 delete prgPropVal;

}

.....

// ProtocolDB.h: interface for the CProtocolDB class.

//

//

#if !defined(AFX_PROTOCOLDB_H__060DFC2F_EDF2_417C_A5CC_850BBD2AEF47__INCLUDED_)

#define AFX_PROTOCOLDB_H__060DFC2F_EDF2_417C_A5CC_850BBD2AEF47__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "Afxtempl.h"

#include "ProtocolVer.h"

#include "InfoManufactory.h"

#include "InfoProtocolName.h"

#include "InfoDeviceType.h"

#include "InfoProtocol.h"

#include "InfoIndexYCFinally.h"

#include "InfoRTUProtocol.h"

class CProtocolDB 

{

public:

 CProtocolDB();

 virtual ~CProtocolDB();

public:

 BOOL Open(void);  //打開資料庫

 BOOL Close(void);  //關閉資料庫

public:

 //增加

 BOOL AddRecord(CProtocolVer record);

 BOOL AddRecord(CInfoManufactory record);

 BOOL AddRecord(CInfoProtocolName record);

 BOOL AddRecord(CInfoDeviceType record);

 BOOL AddRecord(CInfoProtocol record);

 BOOL AddRecord(CInfoIndexYCFinally record);

 BOOL AddRecord(CInfoRTUProtocol record);

 //根據指定條件擷取

 BOOL GetRecord(CProtocolVer &record);

 BOOL GetRecord(CInfoManufactory &record);

 BOOL GetRecord(CInfoProtocolName &record);

 BOOL GetRecord(CInfoDeviceType &record);

 BOOL GetRecord(CInfoProtocol &record);

 BOOL GetRecord(CInfoIndexYCFinally &record);

 BOOL GetRecord(CInfoRTUProtocol &record);

 //編輯

 BOOL EditRecord(CProtocolVer record);

 BOOL EditRecord(CInfoManufactory record);

 BOOL EditRecord(CInfoProtocolName record);

 BOOL EditRecord(CInfoDeviceType record);

 BOOL EditRecord(CInfoProtocol record);

 BOOL EditRecord(CInfoIndexYCFinally record);

 BOOL EditRecord(CInfoRTUProtocol record);

 //删除

 BOOL DeleteRecord(void);      //删除版本号

 BOOL DeleteRecord(CInfoManufactory record);

 BOOL DeleteRecord(CInfoProtocolName record);

 BOOL DeleteRecord(CInfoDeviceType record);

 BOOL DeleteRecord(CInfoProtocol record);

 BOOL DeleteRecord(CInfoIndexYCFinally record);

 BOOL DeleteRecord(CInfoRTUProtocol record);

 //判斷是否存在

 BOOL HaveRecord(void);

 BOOL HaveRecord(CInfoManufactory record);

 BOOL HaveRecord(CInfoProtocolName record);

 BOOL HaveRecord(CInfoDeviceType record);

 BOOL HaveRecord(CInfoProtocol record);

 BOOL HaveRecord(CInfoIndexYCFinally record);

 BOOL HaveRecord(CInfoRTUProtocol record);

 //擷取指定表中的所有記錄

 BOOL LoadRecord(CList<CProtocolVer, CProtocolVer> &templ);

 BOOL LoadRecord(CList<CInfoManufactory, CInfoManufactory> &templ);

 BOOL LoadRecord(CList<CInfoProtocolName, CInfoProtocolName> &templ);

 BOOL LoadRecord(CList<CInfoDeviceType, CInfoDeviceType> &templ);

 BOOL LoadRecord(CList<CInfoProtocol, CInfoProtocol> &templ);

 BOOL LoadRecord(CList<CInfoIndexYCFinally, CInfoIndexYCFinally> &templ);

 BOOL LoadRecord(CList<CInfoRTUProtocol, CInfoRTUProtocol> &templ);

public:

 void SetbUpdateDataBase(BOOL bUpdateDataBase);

 BOOL GetbUpdateDataBase();

private:

 BOOL MountVol(void);

 BOOL CreateDB(void);

 BOOL OpenDB(void);

 //讀取

 BOOL ReadRecord(CProtocolVer &record);

 BOOL ReadRecord(CInfoManufactory &record);

 BOOL ReadRecord(CInfoProtocolName &record);

 BOOL ReadRecord(CInfoDeviceType &record);

 BOOL ReadRecord(CInfoProtocol &record);

 BOOL ReadRecord(CInfoIndexYCFinally &record);

 BOOL ReadRecord(CInfoRTUProtocol &record);

private:

 CEGUID m_guid2;

 CEGUID m_guid3;

 HANDLE m_hDB_ProtocolVer;

 HANDLE m_hDB_Manufactory;

 HANDLE m_hDB_ProtocolName;

 HANDLE m_hDB_DeviceType;

 HANDLE m_hDB_Protocol;

 HANDLE m_hDB_IndexYCFinally;

 HANDLE m_hDB_RTUProtocol;

private:

 enum{TABLECOUNT = 7};       //記錄表的個數

 static CString s_strTablesName[TABLECOUNT];  //記錄表名

private:

 BOOL m_bIsOpen;         //記錄是否資料庫已經打開

 BOOL m_bUpdateDataBase;       //資料庫更新标志 FALSE 不更新,TRUE 更新

};

#endif // !defined(AFX_PROTOCOLDB_H__060DFC2F_EDF2_417C_A5CC_850BBD2AEF47__INCLUDED_)

// ProtocolDB.cpp: implementation of the CProtocolDB class.

//

//

#include "stdafx.h"

#include "ProtocolDB.h"

//

// Construction/Destruction

//

CString CProtocolDB::s_strTablesName[TABLECOUNT] = {_T("DB_ProtocolVer"),

             _T("DB_Manufactory"),

             _T("DB_ProtocolName"),

             _T("DB_DeviceType"),

             _T("DB_ProtocolInfo"),

             _T("DB_IndexYCFInally"),

             _T("DB_RTUProtocol")};

CProtocolDB::CProtocolDB()

{

 m_bIsOpen = FALSE;

 m_bUpdateDataBase = FALSE;

}

CProtocolDB::~CProtocolDB()

{

}

BOOL CProtocolDB::MountVol()

{

 // Mount a volume

 BOOL bResult;

 if(m_bUpdateDataBase)

 {

  ::CreateDirectory(_T("//Disk//DataBase "), NULL);

  bResult = CeMountDBVol(

      &m_guid3,        // guid of mount

      TEXT("//Disk//DataBase//ProtocolDB.cdb "), // full path and name of database volume

      OPEN_ALWAYS);

 }

 else

 {

  ::CreateDirectory(_T("//Disk//Test "), NULL);

  bResult = CeMountDBVol(

      &m_guid2,        // guid of mount

      TEXT("//Disk//Test//ProtocolDB.cdb "), // full path and name of database volume

      OPEN_ALWAYS); 

 }// flags

 return bResult;

}

BOOL CProtocolDB::CreateDB()

{

 CEGUID *pGUID = m_bUpdateDataBase ? (&m_guid3) : (&m_guid2);

 for(int i = 0; i < TABLECOUNT; i++)

 {

  CEOID oid = 0;

  CEDBASEINFO ced;

  ZeroMemory(&ced, sizeof(CEDBASEINFO));

  ced.dwSize = sizeof(CEDBASEINFO);

  ced.dwFlags = CEDB_VALIDNAME;

  wcscpy(ced.szDbaseName, CProtocolDB::s_strTablesName[i]);  

  oid = CeCreateDatabaseEx( pGUID,  // guid of mounted database

         &ced);  // database information

  if(!oid)

   return FALSE;

 }

 CProtocolVer protocolVer;

 protocolVer.SetVerNo(_T("1.0"));

 AddRecord(protocolVer);

 return TRUE;

}

BOOL CProtocolDB::OpenDB()

{

 CEGUID *pGUID = m_bUpdateDataBase ? (&m_guid3) : (&m_guid2);

 HANDLE *phDB[TABLECOUNT] = {&m_hDB_ProtocolVer,

        &m_hDB_Manufactory,

        &m_hDB_ProtocolName,

        &m_hDB_DeviceType,

        &m_hDB_Protocol,

        &m_hDB_IndexYCFinally,

        &m_hDB_RTUProtocol};

 for(int i = 0; i < TABLECOUNT; i++)

 {

  CEOID oid = 0;

  *phDB[i] = CeOpenDatabaseEx(

         &m_guid2,            // guid of mounted database

         &oid,            // object identifier of database

         CProtocolDB::s_strTablesName[i].GetBuffer(0),  // name of database

         0,             // Property id for sort order

         0,       // auto increment record pointer on ReadRecord

         NULL);

  if(*phDB[i] == INVALID_HANDLE_VALUE)

   return FALSE;

 }

 return TRUE;

}

BOOL CProtocolDB::Open()

{

 if(m_bIsOpen)

  return TRUE;

 BOOL bResult = FALSE;

 // Mount database volume

 bResult = MountVol();

 if(!bResult)

  return FALSE;

 // Open the database

 bResult = OpenDB();

 if(!bResult)

 { // If not create the database

  bResult = CreateDB();

  if(!bResult)

   return FALSE;

  // Open the database

  bResult = OpenDB();

  if(!bResult)

   return FALSE;

 }

 // Seek to the beginning of a populated database

 DWORD dwIndex;

 CeSeekDatabase(m_hDB_ProtocolVer, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 m_bIsOpen = TRUE;

 return TRUE;

}

BOOL CProtocolDB::Close()

{

 if(!m_bIsOpen)

  return TRUE;

 CEGUID *pGUID = m_bUpdateDataBase ? (&m_guid3) : (&m_guid2);

 if(!CeFlushDBVol(pGUID))

  return FALSE;

 if(!CeUnmountDBVol(pGUID))

  return FALSE;

 CloseHandle(m_hDB_ProtocolVer);

 CloseHandle(m_hDB_Manufactory);

 CloseHandle(m_hDB_ProtocolName);

 CloseHandle(m_hDB_DeviceType);

 CloseHandle(m_hDB_Protocol);

 CloseHandle(m_hDB_IndexYCFinally);

 CloseHandle(m_hDB_RTUProtocol);

 m_bIsOpen = FALSE;

 return TRUE;

}

BOOL CProtocolDB::AddRecord(CProtocolVer record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 CEOID oid = CeWriteRecordProps(

     m_hDB_ProtocolVer,       // handle to database

     0,           // Create new record

     CProtocolVer::GetPropertyCount(),   // properties count

     prgPropVal);        // propval structure

 record.DeletePropVal(prgPropVal);

 // return TRUE/FALSE based on resultant value

 if(oid)

  return TRUE;

 return FALSE;

}

BOOL CProtocolDB::AddRecord(CInfoManufactory record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 CEOID oid = CeWriteRecordProps(

     m_hDB_Manufactory,       // handle to database

     0,           // Create new record

     CInfoManufactory::GetPropertyCount(),  // properties count

     prgPropVal);        // propval structure

 record.DeletePropVal(prgPropVal);

 // return TRUE/FALSE based on resultant value

 if(oid)

  return TRUE;

 return FALSE;

}

BOOL CProtocolDB::AddRecord(CInfoProtocolName record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 CEOID oid = CeWriteRecordProps(

     m_hDB_ProtocolName,       // handle to database

     0,           // Create new record

     CInfoProtocolName::GetPropertyCount(),  // properties count

     prgPropVal);        // propval structure

 record.DeletePropVal(prgPropVal);

 // return TRUE/FALSE based on resultant value

 if(oid)

  return TRUE;

 return FALSE;

}

BOOL CProtocolDB::AddRecord(CInfoDeviceType record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 CEOID oid = CeWriteRecordProps(

     m_hDB_DeviceType,       // handle to database

     0,           // Create new record

     CInfoDeviceType::GetPropertyCount(),  // properties count

     prgPropVal);        // propval structure

 record.DeletePropVal(prgPropVal);

 // return TRUE/FALSE based on resultant value

 if(oid)

  return TRUE;

 return FALSE;

}

BOOL CProtocolDB::AddRecord(CInfoProtocol record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 CEOID oid = CeWriteRecordProps(

     m_hDB_Protocol,        // handle to database

     0,           // Create new record

     CInfoProtocol::GetPropertyCount(),   // properties count

     prgPropVal);        // propval structure

 record.DeletePropVal(prgPropVal);

 // return TRUE/FALSE based on resultant value

 if(oid)

  return TRUE;

 return FALSE;

}

BOOL CProtocolDB::AddRecord(CInfoIndexYCFinally record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 CEOID oid = CeWriteRecordProps(

     m_hDB_IndexYCFinally,       // handle to database

     0,            // Create new record

     CInfoIndexYCFinally::GetPropertyCount(),  // properties count

     prgPropVal);         // propval structure

 record.DeletePropVal(prgPropVal);

 // return TRUE/FALSE based on resultant value

 if(oid)

  return TRUE;

 return FALSE;

}

BOOL CProtocolDB::AddRecord(CInfoRTUProtocol record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 CEOID oid = CeWriteRecordProps(

     m_hDB_RTUProtocol,       // handle to database

     0,           // Create new record

     CInfoRTUProtocol::GetPropertyCount(),  // properties count

     prgPropVal);        // propval structure

 record.DeletePropVal(prgPropVal);

 // return TRUE/FALSE based on resultant value

 if(oid)

  return TRUE;

 return FALSE;

}

BOOL CProtocolDB::ReadRecord(CProtocolVer &record)

{

 BYTE *prgBuffer = NULL;

 DWORD dwBuffer = 0;

 WORD wPropId = 0;

 CEOID oid = CeReadRecordPropsEx(

     m_hDB_ProtocolVer,   // handle to database

     CEDB_ALLOWREALLOC,  // flags

     &wPropId,    // read all properties

     NULL,     // read all properties

     &prgBuffer,    // pointer to buffer

     &dwBuffer,    // sizeof buffer

     NULL);     // parameter not meaningful

 if(oid)

 {

  record.PropValToRecord((CEPROPVAL *) prgBuffer);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::ReadRecord(CInfoManufactory &record)

{

 BYTE *prgBuffer = NULL;

 DWORD dwBuffer = 0;

 WORD wPropId = 0;

 CEOID oid = CeReadRecordPropsEx(

     m_hDB_Manufactory,  // handle to database

     CEDB_ALLOWREALLOC,  // flags

     &wPropId,    // read all properties

     NULL,     // read all properties

     &prgBuffer,    // pointer to buffer

     &dwBuffer,    // sizeof buffer

     NULL);     // parameter not meaningful

 if(oid)

 {

  record.PropValToRecord((CEPROPVAL *) prgBuffer);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::ReadRecord(CInfoProtocolName &record)

{

 BYTE *prgBuffer = NULL;

 DWORD dwBuffer = 0;

 WORD wPropId = 0;

 CEOID oid = CeReadRecordPropsEx(

     m_hDB_ProtocolName,  // handle to database

     CEDB_ALLOWREALLOC,  // flags

     &wPropId,    // read all properties

     NULL,     // read all properties

     &prgBuffer,    // pointer to buffer

     &dwBuffer,    // sizeof buffer

     NULL);     // parameter not meaningful

 if(oid)

 {

  record.PropValToRecord((CEPROPVAL *) prgBuffer);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::ReadRecord(CInfoDeviceType &record)

{

 BYTE *prgBuffer = NULL;

 DWORD dwBuffer = 0;

 WORD wPropId = 0;

 CEOID oid = CeReadRecordPropsEx(

     m_hDB_DeviceType,  // handle to database

     CEDB_ALLOWREALLOC,  // flags

     &wPropId,    // read all properties

     NULL,     // read all properties

     &prgBuffer,    // pointer to buffer

     &dwBuffer,    // sizeof buffer

     NULL);     // parameter not meaningful

 if(oid)

 {

  record.PropValToRecord((CEPROPVAL *) prgBuffer);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::ReadRecord(CInfoProtocol &record)

{

 BYTE *prgBuffer = NULL;

 DWORD dwBuffer = 0;

 WORD wPropId = 0;

 CEOID oid = CeReadRecordPropsEx(

     m_hDB_Protocol,   // handle to database

     CEDB_ALLOWREALLOC,  // flags

     &wPropId,    // read all properties

     NULL,     // read all properties

     &prgBuffer,    // pointer to buffer

     &dwBuffer,    // sizeof buffer

     NULL);     // parameter not meaningful

 if(oid)

 {

  record.PropValToRecord((CEPROPVAL *) prgBuffer);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::ReadRecord(CInfoIndexYCFinally &record)

{

 BYTE *prgBuffer = NULL;

 DWORD dwBuffer = 0;

 WORD wPropId = 0;

 CEOID oid = CeReadRecordPropsEx(

     m_hDB_IndexYCFinally,   // handle to database

     CEDB_ALLOWREALLOC,  // flags

     &wPropId,    // read all properties

     NULL,     // read all properties

     &prgBuffer,    // pointer to buffer

     &dwBuffer,    // sizeof buffer

     NULL);     // parameter not meaningful

 if(oid)

 {

  record.PropValToRecord((CEPROPVAL *) prgBuffer);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::ReadRecord(CInfoRTUProtocol &record)

{

 BYTE *prgBuffer = NULL;

 DWORD dwBuffer = 0;

 WORD wPropId = 0;

 CEOID oid = CeReadRecordPropsEx(

     m_hDB_RTUProtocol,  // handle to database

     CEDB_ALLOWREALLOC,  // flags

     &wPropId,    // read all properties

     NULL,     // read all properties

     &prgBuffer,    // pointer to buffer

     &dwBuffer,    // sizeof buffer

     NULL);     // parameter not meaningful

 if(oid)

 {

  record.PropValToRecord((CEPROPVAL *) prgBuffer);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::GetRecord(CProtocolVer &record)

{

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolVer, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 if(!oid)

 {

  ReadRecord(record);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::GetRecord(CInfoManufactory &record)

{

 CInfoManufactory infoManufactory;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoManufactory);

  if(record.GetNo() != _T(""))

  {

   if(infoManufactory.GetNo() == record.GetNo())

   {

    record = infoManufactory;

    return TRUE;

   }

  }

  else

  {

   if(infoManufactory.GetManufactoryName() == record.GetManufactoryName())

   {

    record = infoManufactory;

    return TRUE;

   }

  }

  oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE; 

}

BOOL CProtocolDB::GetRecord(CInfoProtocolName &record)

{

 CInfoProtocolName infoProtocolName;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoProtocolName);

  if(record.GetNo() != _T(""))

  {

   if(infoProtocolName.GetNo() == record.GetNo())

   {

    record = infoProtocolName;

    return TRUE;

   }

  }

  else

  {

   if( (infoProtocolName.GetSNo() == record.GetSNo()) &&

    (infoProtocolName.GetProtocolName() == record.GetProtocolName()))

   {

    record = infoProtocolName;

    return TRUE;

   }

  }

  oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::GetRecord(CInfoDeviceType &record)

{

 CInfoDeviceType infoDeviceType;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoDeviceType);

  if(record.GetNo() != _T(""))

  {

   if(infoDeviceType.GetNo() == record.GetNo())

   {

    record = infoDeviceType;

    return TRUE;

   }

  }

  else

  {

   if( (infoDeviceType.GetManufactoryNo() == record.GetManufactoryNo()) &&

    (infoDeviceType.GetDeviceType() == record.GetDeviceType()))

   {

    record = infoDeviceType;

    return TRUE;

   }

  }

  oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::GetRecord(CInfoProtocol &record)

{

 CInfoProtocol infoProtocol;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoProtocol);

  if(record.GetNo() != _T(""))

  {

   if(infoProtocol.GetNo() == record.GetNo())

   {

    record = infoProtocol;

    return TRUE;

   }

  }

  else

  {

   if(infoProtocol.GetSNo() == record.GetSNo())

   {

    record = infoProtocol;

    return TRUE;

   }

  }

  oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::GetRecord(CInfoIndexYCFinally &record)

{

 CInfoIndexYCFinally infoIndexYCFinally;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoIndexYCFinally);

  if(infoIndexYCFinally.GetNo() == record.GetNo())

  {

   record = infoIndexYCFinally;

   return TRUE;

  }

  oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::GetRecord(CInfoRTUProtocol &record)

{

 CInfoRTUProtocol infoRTUProtocol;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoRTUProtocol);

  if(infoRTUProtocol.GetNo() == _T(""))

  {

   if(infoRTUProtocol.GetNo() == record.GetNo())

   {

    record = infoRTUProtocol;

    return TRUE;

   }

  }

  else

  {

   if(infoRTUProtocol.GetRTUNo() == record.GetRTUNo())

   {

    record = infoRTUProtocol;

    return TRUE;

   }

  }

  oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::EditRecord(CProtocolVer record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolVer, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 if(!oid)

  return FALSE;

 if(CeWriteRecordProps(

     m_hDB_ProtocolVer,        // handle to database

     oid,           // Modify record

     CProtocolVer::GetPropertyCount(),   // properties count

     prgPropVal))         // propval structure

 {

  record.DeletePropVal(prgPropVal);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::EditRecord(CInfoManufactory record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CInfoManufactory tempRecord;

 BOOL bExist = FALSE;

 while(oid)

 {

  ReadRecord(tempRecord);

  if(tempRecord.GetNo() == record.GetNo())

  {

   bExist = TRUE;

   break;

  }

  oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 if(!bExist)

  return FALSE;

 if(CeWriteRecordProps(

     m_hDB_Manufactory,        // handle to database

     oid,           // Modify record

     CInfoManufactory::GetPropertyCount(),   // properties count

     prgPropVal))         // propval structure

 {

  record.DeletePropVal(prgPropVal);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::EditRecord(CInfoProtocolName record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CInfoProtocolName tempRecord;

 BOOL bExist = FALSE;

 while(oid)

 {

  ReadRecord(tempRecord);

  if(tempRecord.GetNo() == record.GetNo())

  {

   bExist = TRUE;

   break;

  }

  oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 if(!bExist)

  return FALSE;

 if(CeWriteRecordProps(

     m_hDB_ProtocolName,        // handle to database

     oid,           // Modify record

     CInfoProtocolName::GetPropertyCount(),   // properties count

     prgPropVal))         // propval structure

 {

  record.DeletePropVal(prgPropVal);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::EditRecord(CInfoDeviceType record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CInfoDeviceType tempRecord;

 BOOL bExist = FALSE;

 while(oid)

 {

  ReadRecord(tempRecord);

  if(tempRecord.GetNo() == record.GetNo())

  {

   bExist = TRUE;

   break;

  }

  oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 if(!bExist)

  return FALSE;

 if(CeWriteRecordProps(

     m_hDB_DeviceType,        // handle to database

     oid,           // Modify record

     CInfoDeviceType::GetPropertyCount(),   // properties count

     prgPropVal))         // propval structure

 {

  record.DeletePropVal(prgPropVal);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::EditRecord(CInfoProtocol record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CInfoProtocol tempRecord;

 BOOL bExist = FALSE;

 while(oid)

 {

  ReadRecord(tempRecord);

  if(tempRecord.GetNo() == record.GetNo())

  {

   bExist = TRUE;

   break;

  }

  oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 if(!bExist)

  return FALSE;

 if(CeWriteRecordProps(

     m_hDB_Protocol,        // handle to database

     oid,          // Modify record

     CInfoProtocol::GetPropertyCount(),   // properties count

     prgPropVal))        // propval structure

 {

  record.DeletePropVal(prgPropVal);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::EditRecord(CInfoIndexYCFinally record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CInfoIndexYCFinally tempRecord;

 BOOL bExist = FALSE;

 while(oid)

 {

  ReadRecord(tempRecord);

  if(tempRecord.GetNo() == record.GetNo())

  {

   bExist = TRUE;

   break;

  }

  oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 if(!bExist)

  return FALSE;

 if(CeWriteRecordProps(

     m_hDB_IndexYCFinally,        // handle to database

     oid,          // Modify record

     CInfoIndexYCFinally::GetPropertyCount(),   // properties count

     prgPropVal))        // propval structure

 {

  record.DeletePropVal(prgPropVal);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::EditRecord(CInfoRTUProtocol record)

{

 CEPROPVAL *prgPropVal = record.NewPropVal();

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 CInfoRTUProtocol tempRecord;

 BOOL bExist = FALSE;

 while(oid)

 {

  ReadRecord(tempRecord);

  if(tempRecord.GetNo() == record.GetNo())

  {

   bExist = TRUE;

   break;

  }

  oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 if(!bExist)

  return FALSE;

 if(CeWriteRecordProps(

     m_hDB_RTUProtocol,       // handle to database

     oid,          // Modify record

     CInfoRTUProtocol::GetPropertyCount(),  // properties count

     prgPropVal))        // propval structure

 {

  record.DeletePropVal(prgPropVal);

  return TRUE;

 }

 return FALSE;

}

BOOL CProtocolDB::DeleteRecord()

{

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolVer, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 //ASSERT(oid);

 if(!oid)

  return TRUE;

 if(!CeDeleteRecord(m_hDB_ProtocolVer, oid))

  return FALSE;

 return TRUE;

}

BOOL CProtocolDB::DeleteRecord(CInfoManufactory record)

{

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 //ASSERT(oid);

 CInfoManufactory tempRecord;

 while(oid)

 {

  ReadRecord(tempRecord);

  // Update GUI with currently selected record

  if(tempRecord.GetNo() == record.GetNo())

  {

   if(!CeDeleteRecord(m_hDB_Manufactory, oid))

    return FALSE;

   return TRUE;

  }

  oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::DeleteRecord(CInfoProtocolName record)

{

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 //ASSERT(oid);

 CInfoProtocolName tempRecord;

 while(oid)

 {

  ReadRecord(tempRecord);

  // Update GUI with currently selected record

  if(tempRecord.GetNo() == record.GetNo())

  {

   if(!CeDeleteRecord(m_hDB_ProtocolName, oid))

    return FALSE;

   return TRUE;

  }

  oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::DeleteRecord(CInfoDeviceType record)

{

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 //ASSERT(oid);

 CInfoDeviceType tempRecord;

 while(oid)

 {

  ReadRecord(tempRecord);

  // Update GUI with currently selected record

  if(tempRecord.GetNo() == record.GetNo())

  {

   if(!CeDeleteRecord(m_hDB_DeviceType, oid))

    return FALSE;

   return TRUE;

  }

  oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::DeleteRecord(CInfoProtocol record)

{

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 //ASSERT(oid);

 CInfoProtocol tempRecord;

 while(oid)

 {

  ReadRecord(tempRecord);

  // Update GUI with currently selected record

  if(tempRecord.GetNo() == record.GetNo())

  {

   if(!CeDeleteRecord(m_hDB_Protocol, oid))

    return FALSE;

   return TRUE;

  }

  oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::DeleteRecord(CInfoIndexYCFinally record)

{

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 //ASSERT(oid);

 CInfoIndexYCFinally tempRecord;

 while(oid)

 {

  ReadRecord(tempRecord);

  // Update GUI with currently selected record

  if(tempRecord.GetNo() == record.GetNo())

  {

   if(!CeDeleteRecord(m_hDB_IndexYCFinally, oid))

    return FALSE;

   return TRUE;

  }

  oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::DeleteRecord(CInfoRTUProtocol record)

{

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 //ASSERT(oid);

 CInfoRTUProtocol tempRecord;

 while(oid)

 {

  ReadRecord(tempRecord);

  // Update GUI with currently selected record

  if(tempRecord.GetNo() == record.GetNo())

  {

   if(!CeDeleteRecord(m_hDB_RTUProtocol, oid))

    return FALSE;

   return TRUE;

  }

  oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::HaveRecord()

{

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolVer, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 if(!oid)

  return TRUE;

 return FALSE;

}

BOOL CProtocolDB::HaveRecord(CInfoManufactory record)

{

 CInfoManufactory infoManufactory;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoManufactory);

  if(record.GetNo() != _T(""))

  {

   if(infoManufactory.GetNo() == record.GetNo())

   {

    return TRUE;

   }

  }

  else

  {

   if(infoManufactory.GetManufactoryName() == record.GetManufactoryName())

   {

    return TRUE;

   }

  }

  oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::HaveRecord(CInfoProtocolName record)

{

 CInfoProtocolName infoProtocolName;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoProtocolName);

  if(record.GetNo() != _T(""))

  {

   if(infoProtocolName.GetNo() == record.GetNo())

   {

    return TRUE;

   }

  }

  else

  {

   if( (infoProtocolName.GetSNo() == record.GetSNo()) &&

    (infoProtocolName.GetProtocolName() == record.GetProtocolName()))

   {

    return TRUE;

   }

  }

  oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::HaveRecord(CInfoDeviceType record)

{

 CInfoDeviceType infoDeviceType;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoDeviceType);

  if(record.GetNo() != _T(""))

  {

   if(infoDeviceType.GetNo() == record.GetNo())

   {

    return TRUE;

   }

  }

  else

  {

   if( (infoDeviceType.GetManufactoryNo() == record.GetManufactoryNo()) &&

    (infoDeviceType.GetProtocolNameNo() == record.GetProtocolNameNo()) &&

    (infoDeviceType.GetDeviceType() == record.GetDeviceType()))

   {

    return TRUE;

   }

  }

  oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::HaveRecord(CInfoProtocol record)

{

 CInfoProtocol infoProtocol;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoProtocol);

  if(infoProtocol.GetSNo() == record.GetSNo())

   return TRUE;

  oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::HaveRecord(CInfoIndexYCFinally record)

{

 CInfoIndexYCFinally infoIndexYCFinally;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoIndexYCFinally);

  if(infoIndexYCFinally.GetSNo() == record.GetSNo())

   return TRUE;

  oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::HaveRecord(CInfoRTUProtocol record)

{

 CInfoRTUProtocol infoRTUProtocol;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoRTUProtocol);

  if(infoRTUProtocol.GetRTUNo() == record.GetRTUNo())

   return TRUE;

  oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return FALSE;

}

BOOL CProtocolDB::LoadRecord(CList<CProtocolVer, CProtocolVer> &templ)

{

 templ.RemoveAll();

 CProtocolVer protocolVer;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolVer, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(protocolVer);

  if(templ.IsEmpty())

   templ.AddHead(protocolVer);

  else

   templ.AddTail(protocolVer);

  oid = CeSeekDatabase(m_hDB_ProtocolVer, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::LoadRecord(CList<CInfoManufactory, CInfoManufactory> &templ)

{

 templ.RemoveAll();

 CInfoManufactory infoManufactory;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoManufactory);

  if(templ.IsEmpty())

   templ.AddHead(infoManufactory);

  else

   templ.AddTail(infoManufactory);

  oid = CeSeekDatabase(m_hDB_Manufactory, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::LoadRecord(CList<CInfoProtocolName, CInfoProtocolName> &templ)

{

 templ.RemoveAll();

 CInfoProtocolName infoProtocolName;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoProtocolName);

  if(templ.IsEmpty())

   templ.AddHead(infoProtocolName);

  else

   templ.AddTail(infoProtocolName);

  oid = CeSeekDatabase(m_hDB_ProtocolName, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::LoadRecord(CList<CInfoDeviceType, CInfoDeviceType> &templ)

{

 templ.RemoveAll();

 CInfoDeviceType infoDeviceType;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoDeviceType);

  if(templ.IsEmpty())

   templ.AddHead(infoDeviceType);

  else

   templ.AddTail(infoDeviceType);

  oid = CeSeekDatabase(m_hDB_DeviceType, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::LoadRecord(CList<CInfoProtocol, CInfoProtocol> &templ)

{

 templ.RemoveAll();

 CInfoProtocol infoProtocol;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoProtocol);

  if(templ.IsEmpty())

   templ.AddHead(infoProtocol);

  else

   templ.AddTail(infoProtocol);

  oid = CeSeekDatabase(m_hDB_Protocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::LoadRecord(CList<CInfoIndexYCFinally, CInfoIndexYCFinally> &templ)

{

 templ.RemoveAll();

 CInfoIndexYCFinally infoIndexYCFinally;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoIndexYCFinally);

  if(templ.IsEmpty())

   templ.AddHead(infoIndexYCFinally);

  else

   templ.AddTail(infoIndexYCFinally);

  oid = CeSeekDatabase(m_hDB_IndexYCFinally, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

BOOL CProtocolDB::LoadRecord(CList<CInfoRTUProtocol, CInfoRTUProtocol> &templ)

{

 templ.RemoveAll();

 CInfoRTUProtocol infoRTUProtocol;

 DWORD dwIndex;

 CEOID oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_BEGINNING, 0, &dwIndex);

 while(oid)

 {

  ReadRecord(infoRTUProtocol);

  if(templ.IsEmpty())

   templ.AddHead(infoRTUProtocol);

  else

   templ.AddTail(infoRTUProtocol);

  oid = CeSeekDatabase(m_hDB_RTUProtocol, CEDB_SEEK_CURRENT, 1, &dwIndex);

 }

 return TRUE;

}

void CProtocolDB::SetbUpdateDataBase(BOOL bUpdateDataBase)

{

 m_bUpdateDataBase = bUpdateDataBase;

}

BOOL CProtocolDB::GetbUpdateDataBase()

{

 return m_bUpdateDataBase;

}