csdn_文档中心_appbuilder中进行直接odbc api数据库调用访问的基本方法!.htm
来自「csdn10年中间经典帖子」· HTM 代码 · 共 560 行 · 第 1/3 页
HTM
560 行
<TD align=middle bgColor=#003399 height=10><FONT
color=#ffffff>标题</FONT></TD>
<TD><B> AppBuilder中进行直接ODBC
API数据库调用访问的基本方法!</B> ucancode(转贴) </TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
<TD width=500> AppBuilder中进行直接ODBC
API数据库调用访问的基本方法!</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399 height=10><FONT
color=#ffffff>出处</FONT></TD>
<TD height=10> <A
href="http://www.ucancode.com/jiaocheng/index.htm">http://www.ucancode.com/jiaocheng/index.htm</A></TD></TR>
<TR>
<TD align=middle height=10></TD>
<TD height=10></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
<TABLE border=0 width=600>
<TBODY>
<TR>
<TD align=left><BR>作者:张修勇
AppBuilder的网址:http://www.ucancode.com<BR><BR>第一章:如何为你的开发系统配置DSN:<BR><BR>(一)、打开Windows的控制面板。选择ODBC
Data Sources图标,双击打开此图标内容,此时出现ODBC Data Source
Administrator对话框。<BR><BR><BR><BR>(2)、在对话框中选择User
DSN然后你可以选择<添加>按钮来新增一个DSN.<BR><BR><BR><BR>第二章:如何利用ODBC
API在VC下面直接编写基于数据库的程序:<BR><BR>ODBC数据库编程<BR>一、 一般步骤: <BR><BR>分配环境
<BR><BR>应用系统在调用任何ODBC函数之前,首先必须初始化ODBC,并建立一个环境。<BR>ODBC用该环境监视应用系统已经建立的数据库连接。每个应用系统只建立一个<BR>环境是很有必要的,因为不管有多少连接都可以在一个环境中建立。完成这一分<BR>配过程的ODBC函数SQLAllocEnv在下一小节描述。<BR><BR>SQLAllocEnv<BR>SQLAllocEnv为环境句柄分配内存,并初始化应用系统使用的ODBC调用层接口。<BR>应用系统在调用任何其他ODBC函数之前必须调用SQLAllocEnv。<BR>以下是SQLAllocEnv的语法:<BR>RETCODE
SQLAllocEnv(phenv)<BR>SQLAllocEnv的参数如下表所示,其返回码是SQL-ERROR。因为调用SQLError<BR>时无有效句柄,所以该函数没有SQLSTATE返回码;
<BR>//分配环境句柄<BR>SQLRETURN m_retcode;<BR>if( m_henv != SQL_NULL_HENV
)<BR>return FALSE;<BR>if (SQL_SUCCESS == (m_retcode = SQLAllocEnv(
&m_henv
)))<BR>{<BR>//创建新的DSN<BR>CreateDSN(IDS_HOME_DSNNAME,IDS_HOME_DBFILENAME);<BR>//分配连接句柄<BR>if
(SQL_SUCCESS == (m_retcode = SQLAllocConnect( m_henv, &m_hdbc
)))<BR>{<BR>// 连接数据源<BR>if (SQL_SUCCESS == (m_retcode = SQLConnect(
m_hdbc, (UCHAR *)((LPCTSTR)m_strDSN), SQL_NTS, NULL, 0, NULL, 0
)))<BR>{<BR>m_bConnected =
TRUE;<BR>}<BR>}<BR>}<BR>分配连接句柄<BR><BR>就象应用系统的环境由环境句柄代表一样,连接句柄代表应用系统与数据源<BR>之间的连接。对于应用系统所要连接的每一个数据源而言,都必须分配一个连接<BR>句柄。例如,如果需要同时与dBase和BTrieve的数据源连接,必须分配两个连接<BR>句柄。下一小节描述函数SQLAllocConnect.<BR><BR>SQLAllocConnect在henv标识的环境里为连接句柄分配内存。以下是<BR>SQLAllocConnect的语法:<BR>RETCODE
SQLAllocConnect(henv,phdbc)<BR>SQLAllocConnect
的参数如下表所示,其返回码是:<BR>SQL-SUCCESS<BR>SQL-SUCCESS-WITH-INFO<BR>SQL-ERROR<BR>SQL-INVALID-HANDLE<BR>SQLSTATE的返回码是:<BR>01000
S1000 S1001
S1009<BR>利用核心函数与数据源连接<BR><BR>尽管有很多ODBC函数可以建立连接,但在核心API层却只有一种,即函数<BR>SQLConnect。它提供简单、有效的方法与数据源的连接。所有驱动程序都支持<BR>SQLConnect,所以它是最具有互用性的解决方案。下面是SQLConnect的描述。<BR><BR>SQLConnect加载一个数据库驱动程序,并建立一个与数据源的连接。该连接<BR>句柄确定所有连接信息(包括它的状态,事务状态和错误信息)的存储位置。<BR><BR>SQLConnect的语法如下:<BR>RETCODE
SQLConnect(hdbc,szDSN,cbDSN,szUID,cbUID,szAuthStr,cbAuthAtr)<BR><BR>SQLConnectde的返回码是:<BR>SQL-SUCCESS<BR>SQL-SUCCESS-WITH-INFO<BR>SQL-ERROR<BR>SQL-INVALID-NUMBER<BR><BR><BR>与数据源断开<BR><BR>应用系统一旦使用完成一个数据源连接,便应与之断开。连接是十分昂贵<BR>的资源,因为很多DBMS对同时连接的每一个许可人员或用户都是收费的。当<BR>连接完成时,应当把它返回,以便其它用户能注册进入该系统。下面描述的ODBC<BR>函数SQLDisconnect处理这一操作过程。<BR><BR>SQLDisconnect关闭与指定的连接句柄相关的数据源连接。SQLDisconnect<BR>的语法如下:<BR>RETCODESQLDisconnect(hdbc)<BR>SQLDisconnect的返回码是:<BR>SQL-SUCCESS<BR>SQL-SUCCESS-WITH-INFO<BR>SQL-ERROR<BR>SQL-INVALID-HANDLE
<BR><BR>如果数据源连接成功的话,就可以继续下一步;<BR>CString strSQLString;<BR>RETCODE
ReturnCode;<BR>SQLHSTMThstmt;<BR>if (SQL_SUCCESS !=
SQLAllocHandle(SQL_HANDLE_STMT,theApp.m_hdbc,&hstmt))<BR>return;<BR>strSQLString.Format(<BR>"SELECT
"<BR>"NID,"<BR>"ARIQI,"<BR>"NJINE,"<BR>"ASHUOMING,"<BR>"ALAIYUAN,"<BR>"ACUNZHE,"<BR>"AYONGTU,"<BR>"AXIAOFEI,"<BR>"ABEIZHU"<BR>"
FROM HHZhiChu "<BR>" WHERE NID=%u",<BR>nID);<BR>if (SQL_SUCCESS ==
(ReturnCode =
SQLExecDirect(hstmt,(UCHAR*)((LPCTSTR)strSQLString),SQL_NTS)))<BR>{<BR>SQLBindCol(hstmt,1,SQL_C_SLONG,&dbdata.m_Nid,0,&cb);<BR>SQLBindCol(hstmt,2,SQL_C_TIMESTAMP,&dbdata.m_Ariqi,0,&cb);<BR>SQLBindCol(hstmt,3,SQL_C_DOUBLE,&dbdata.m_Njine,0,&cb);<BR>SQLBindCol(hstmt,4,SQL_C_CHAR,dbdata.m_Ashuoming,HHZhiChu_aShuoMing_SIZE,&cb);<BR>SQLBindCol(hstmt,5,SQL_C_CHAR,dbdata.m_Alaiyuan,HHZhiChu_aLaiYuan_SIZE,&cb);<BR>SQLBindCol(hstmt,6,SQL_C_CHAR,dbdata.m_Acunzhe,HHZhiChu_aCunZhe_SIZE,&cb);<BR>SQLBindCol(hstmt,7,SQL_C_CHAR,dbdata.m_Ayongtu,HHZhiChu_aYongTu_SIZE,&cb);<BR>SQLBindCol(hstmt,8,SQL_C_CHAR,dbdata.m_Axiaofei,HHZhiChu_aXiaoFei_SIZE,&cb);<BR>SQLBindCol(hstmt,9,SQL_C_CHAR,dbdata.m_Abeizhu,HHZhiChu_aBeiZhu_SIZE,&cb);<BR>if
(SQL_SUCCESS == (ReturnCode =
SQLFetch(hstmt)))<BR>{<BR>//读数据成功,可一对数据进行处理了。<BR>}<BR>}<BR>::SQLFreeHandle(SQL_HANDLE_STMT,hstmt);<BR><BR><BR>程序完了后要关闭数据库,<BR>//断开连接<BR>if
(m_bConnected)<BR>{<BR>SQLDisconnect(m_hdbc);<BR>SQLFreeHandle(SQL_HANDLE_DBC,m_hdbc);<BR>m_hdbc
= NULL;<BR>}<BR>//删除DSN<BR>if
(FoundDSNName(IDS_HOME_DSNNAME))<BR>DeleteDSN(IDS_HOME_DSNNAME);<BR>//删除环境句柄<BR>if
(m_henv)<BR>{<BR>SQLFreeHandle(SQL_HANDLE_ENV,m_henv);<BR>m_henv =
NULL;<BR>}<BR><BR>二、 针对数据库的操作<BR>以下的方法只对ACCESS数据库有效,<BR>1、
生成数据库<BR>CString strFileName="c:\1.mdb";<BR>CString
strDriver;<BR>char szFileName[100+_MAX_PATH];<BR>strDriver =
"Microsoft Access Driver
(*.mdb)\0";<BR>sprintf(szFileName,"CREATE_DB=%s
General\0\0",strFileName);<BR>SQLConfigDataSource(NULL,ODBC_ADD_DSN,strDriver,szFileName);<BR>2、
压缩数据库<BR>BOOL SuperDatabase::Compaction(CString strSourName, CString
strDestName)<BR>{<BR>if (strSourName.IsEmpty())<BR>return
FALSE;<BR>if (strDestName.IsEmpty())<BR>strDestName =
strSourName;<BR>char szCommand[100+_MAX_PATH];<BR>int j;<BR>CString
strDriver;<BR>strDriver = "Microsoft Access Driver (*.mdb)\0";<BR>j
= sprintf(szCommand,"COMPACT_DB=%s %s
General\0\0",strSourName,strDestName);<BR>return
SQLConfigDataSource(NULL,ODBC_ADD_DSN,strDriver,szCommand);<BR>}<BR>3、
取得数据库的名称:<BR>如果已经打开了一个数据源,可以通过数据源来取得当前的数据库的名称;<BR>CString
SuperDatabase::GetDatabaseName()<BR>{<BR>ASSERT(m_hdbc !=
SQL_NULL_HDBC);<BR>char szName[MAX_TNAME_LEN];<BR>SWORD
nResult;<BR>SQLGetInfo(m_hdbc, SQL_DATABASE_NAME,<BR>szName,
MAX_TNAME_LEN, &nResult);<BR>return szName;<BR>}<BR><BR>三、
针对数据源的操作:<BR>1、 增加数据源<BR>BOOL SuperDatabase::CreateDSN(CString
strDriver, CString strFileName,CString strDSN, CString strUserID,
CString strPWD)<BR>{<BR>char szAttr[100+_MAX_PATH];<BR>int j;<BR>if
(strDriver.IsEmpty())<BR>strDriver = "Microsoft Access Driver
(*.mdb)\0";<BR>j = sprintf(szAttr,"DSN=%s\0",strDSN);<BR>j++;<BR>j =
sprintf(szAttr+j,"DBQ=%s\0\0 ",strFileName);<BR>return
SQLConfigDataSource(NULL,ODBC_ADD_DSN,strDriver,szAttr);<BR>}<BR>2、
删除数据源<BR>void SuperDatabase::RemoveDSN(CString strDSN)<BR>{<BR>char
szDSN[255];<BR>sprintf(szDSN,"DSN=%s\0\0",strDSN);<BR>BOOL
bIsSuccess = SQLConfigDataSource(NULL,ODBC_REMOVE_DSN,"Microsoft
Access Driver (*.mdb)\0",szDSN);<BR>}<BR>3、 取得系统已有得DSN<BR>SWORD
nDataSourceNameLength; //DSN str length<BR>SWORD
nSourceDescriptionLength; //Driver Description str length<BR>char
szSourceDescription[MAXBUFLEN+1]; //Driver Description
string<BR>SQLRETURN nResult; //Return Code<BR>SWORD
nDirection=SQL_FETCH_FIRST;<BR>if ((nResult = SQLDataSources(m_henv,
nDirection, (UCHAR *)((LPCTSTR)strDataSourceName), MAXBUFLEN,
&nDataSourceNameLength, (UCHAR *)szSourceDescription, MAXBUFLEN,
&nSourceDescriptionLength)) != SQL_NO_DATA && nResult !=
SQL_ERROR)<BR>{<BR>nDirection=SQL_FETCH_NEXT;<BR>//
szSourceDescription为DSN 的描述,可以在这里取来用;<BR>}<BR><BR>四、 针对表的操作:<BR>1、
取得表名:<BR>void SuperDatabase::GetTable(CStringList
&tableList)<BR>{<BR>ASSERT(m_bIsConnect);<BR>if
(!m_bIsConnect)<BR>return;<BR>SQLHSTMT hstmt = NULL;<BR>if
(SQL_SUCCESS == ::SQLAllocHandle(SQL_HANDLE_STMT, m_hdbc,
&hstmt))<BR>{<BR>if (SQL_SUCCESS == ::SQLTables(hstmt, NULL, 0,
NULL, 0,<BR>NULL, 0, NULL, 0))<BR>{<BR>SDWORD cb;<BR>char
szTable[255];<BR>char szTableType[255];<BR>::SQLBindCol(hstmt, 3,
SQL_C_CHAR, szTable, 255, &cb);<BR>::SQLBindCol(hstmt, 4,
SQL_C_CHAR, szTableType, 255, &cb);<BR>while (SQL_SUCCESS ==
::SQLFetch(hstmt))<BR>{<BR>if (0 == strcmp(szTableType,
"TABLE"))//TABLE表示表,VIEW表示查询<BR>{<BR>tableList.AddTail(szTable);<BR>}<BR>}<BR>}<BR>}<BR>::SQLFreeHandle(SQL_HANDLE_STMT,
hstmt);<BR>hstmt = NULL;<BR>}<BR>2、 创建表:可以用SQL语句生成表,使用的命令为:"CREATE
TABLE":<BR>CREATE TABLE table (field1 type [(size)] [NOT NULL]
[index1] [, field2 type [(size)] [NOT NULL] [index2] [, ...]] [,
CONSTRAINT multifieldindex [, ...]]) 其中,各类型type如下:<BR>数据类型
Type参数<BR>整型 SHORT<BR>长整型 INTEGER<BR>单精度 FLOAT<BR>双精度 DOUBLE<BR>字符串
TEXT<BR>日期 DATETIME<BR>是/否 BIT<BR>货币 CURRENCY<BR>系统自动编号
COUNTER<BR><BR>五、 对列的操作:<BR>1、 取得SQL语句中的列数:<BR>int
SuperRecordSet::GetColCount()<BR>{<BR>SWORD swColCount;<BR>if
(m_hstmt == NULL)<BR>return -1;<BR>if (SQL_SUCCESS ==
::SQLNumResultCols(m_hstmt,&swColCount))<BR>return
swColCount;<BR>else<BR>return
-1;<BR>}<BR><BR>七、数据的读取<BR>1、列绑定:<BR>CString
strSQLString;<BR>RETCODE ReturnCode;<BR>SQLHSTMT hstmt;<BR>if
(SQL_SUCCESS !=
SQLAllocHandle(SQL_HANDLE_STMT,theApp.m_hdbc,&hstmt))<BR>return;<BR>FF_DB_HHZHICHU_SET_FIELDS
dbdata;<BR>SDWORD cb1;<BR>SDWORD cb2;<BR>SDWORD cb3;<BR>SDWORD
cb4;<BR>SDWORD cb5;<BR>SDWORD cb6;<BR>SDWORD cb7;<BR>SDWORD
cb8;<BR>SDWORD cb9;<BR><BR>// Build the SQL
Statement<BR>strSQLString.Format(<BR>"SELECT
"<BR>"NID,"<BR>"ARIQI,"<BR>"NJINE,"<BR>"ASHUOMING,"<BR>"ALAIYUAN,"<BR>"ACUNZHE,"<BR>"AYONGTU,"<BR>"AXIAOFEI,"<BR>"ABEIZHU"<BR>"
FROM HHZhiChu "<BR>" WHERE NID=%u",<BR>nID);<BR><BR>if (SQL_SUCCESS
== (ReturnCode =
SQLExecDirect(hstmt,(UCHAR*)((LPCTSTR)strSQLString),SQL_NTS)))<BR>{<BR>SQLBindCol(hstmt,1,SQL_C_SLONG,&dbdata.m_Nid,0,&cb1);<BR>SQLBindCol(hstmt,2,SQL_C_TIMESTAMP,&dbdata.m_Ariqi,0,&cb2);<BR>SQLBindCol(hstmt,3,SQL_C_DOUBLE,&dbdata.m_Njine,0,&cb3);<BR>SQLBindCol(hstmt,4,SQL_C_CHAR,dbdata.m_Ashuoming,HHZhiChu_aShuoMing_SIZE,&cb4);<BR>SQLBindCol(hstmt,5,SQL_C_CHAR,dbdata.m_Alaiyuan,HHZhiChu_aLaiYuan_SIZE,&cb5);<BR>SQLBindCol(hstmt,6,SQL_C_CHAR,dbdata.m_Acunzhe,HHZhiChu_aCunZhe_SIZE,&cb6);<BR>SQLBindCol(hstmt,7,SQL_C_CHAR,dbdata.m_Ayongtu,HHZhiChu_aYongTu_SIZE,&cb7);<BR>SQLBindCol(hstmt,8,SQL_C_CHAR,dbdata.m_Axiaofei,HHZhiChu_aXiaoFei_SIZE,&cb8);<BR>SQLBindCol(hstmt,9,SQL_C_CHAR,dbdata.m_Abeizhu,HHZhiChu_aBeiZhu_SIZE,&cb9);<BR><BR><BR>//
Fetch and store...<BR>if (SQL_SUCCESS == (ReturnCode =
SQLFetch(hstmt)))<BR>{<BR>m_Record.m_Nid =
dbdata.m_Nid;<BR><BR>m_Record.m_Ariqi.SetDateTime(dbdata.m_Ariqi.year,<BR>dbdata.m_Ariqi.month,<BR>dbdata.m_Ariqi.day,<BR>dbdata.m_Ariqi.hour,<BR>dbdata.m_Ariqi.minute,<BR>dbdata.m_Ariqi.second);<BR><BR>m_Record.m_Njine
= dbdata.m_Njine;<BR>m_Record.m_Ashuoming =
dbdata.m_Ashuoming;<BR>m_Record.m_Alaiyuan =
dbdata.m_Alaiyuan;<BR>m_Record.m_Acunzhe =
dbdata.m_Acunzhe;<BR>m_Record.m_Ayongtu =
dbdata.m_Ayongtu;<BR>m_Record.m_Axiaofei =
dbdata.m_Axiaofei;<BR>m_Record.m_Abeizhu =
dbdata.m_Abeizhu;<BR><BR>}<BR>}<BR>::SQLFreeHandle(SQL_HANDLE_STMT,hstmt);<BR><BR>其中,如果cb1、cb2、cb3、cb4、cb5、cb6、cb7、cb8、cb9是接受返回的数据的大小的,如果他们的值等于SQL_NULL_DATA,那么表示此记录的这个字段的值为空。<BR><BR>2、块绑定<BR>CStuffbasicdataQry::CStuffbasicdataQry(CODBCDatabase*
pDB) : m_nRowSetSize(1000), m_pDatabase(pDB)<BR>{<BR>m_hstmt =
SQL_NULL_HSTMT;<BR>RETCODE ReturnCode =
SQLAllocHandle(SQL_HANDLE_STMT, m_pDatabase->GetHDBC(),
&m_hstmt);<BR>if (ReturnCode != SQL_SUCCESS)<BR>TRACE("Unable to
allocate Statement Handle in
CTtttempSet\n");<BR>}<BR><BR>CStuffbasicdataQry::~CStuffbasicdataQry()<BR>{<BR>Reset();<BR>if
(m_hstmt)<BR>SQLFreeHandle(SQL_HANDLE_STMT, m_hstmt);<BR>}<BR>void
CStuffbasicdataQry::Reset()<BR>{<BR>if
(m_hstmt)<BR>SQLFreeHandle(SQL_HANDLE_STMT, m_hstmt);<BR>for (int i
= 0; i < m_aData.GetSize(); i++)<BR>delete
m_aData.GetAt(i);<BR>m_aData.RemoveAll();<BR>}<BR>int
CStuffbasicdataQry::Load()<BR>{<BR>CString
strSQLString;<BR>//RETCODE ReturnCode;<BR>UDWORD
RowsFetched;<BR>UWORD
*pRowStatus;<BR>pFF_DB_STUFFBASICDATAQRY_FIELDS
pHostData;<BR><BR>ASSERT(m_nRowSetSize > 0);<BR>pRowStatus = new
UWORD[m_nRowSetSize];<BR>ASSERT(pRowStatus);<BR>pHostData = new
FF_DB_STUFFBASICDATAQRY_FIELDS[m_nRowSetSize];<BR>ASSERT(pHostData);<BR><BR>SQLSetStmtOption(m_hstmt,SQL_BIND_TYPE,sizeof(FF_DB_STUFFBASICDATAQRY_FIELDS));<BR>SQLSetStmtOption(m_hstmt,SQL_CONCURRENCY,SQL_CONCUR_READ_ONLY);<BR>SQLSetStmtOption(m_hstmt,SQL_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN);<BR>SQLSetStmtOption(m_hstmt,SQL_ROWSET_SIZE,m_nRowSetSize);<BR><BR>strSQLString.Format(<BR>"SELECT
* "<BR>" FROM STUFFBASICDATA");<BR><BR>if (SQL_SUCCESS ==
SQLExecDirect(m_hstmt,(UCHAR*)((LPCTSTR)strSQLString),SQL_NTS))<BR>{<BR>SQLBindCol(m_hstmt,1,SQL_C_CHAR,pHostData[0].m_aStuffID,StuffbasicdataQry_aStuffID_SIZE,&pHostData[0].m_aStuffIDInd);<BR>SQLBindCol(m_hstmt,2,SQL_C_CHAR,pHostData[0].m_aNameCN,StuffbasicdataQry_aNameCN_SIZE,&pHostData[0].m_aNameCNInd);<BR>SQLBindCol(m_hstmt,3,SQL_C_CHAR,pHostData[0].m_aNameEN,StuffbasicdataQry_aNameEN_SIZE,&pHostData[0].m_aNameENInd);<BR>SQLBindCol(m_hstmt,4,SQL_C_CHAR,pHostData[0].m_aEducation,StuffbasicdataQry_aEducation_SIZE,&pHostData[0].m_aEducationInd);<BR>SQLBindCol(m_hstmt,5,SQL_C_CHAR,pHostData[0].m_aGender,StuffbasicdataQry_aGender_SIZE,&pHostData[0].m_aGenderInd);<BR>SQLBindCol(m_hstmt,6,SQL_C_TIMESTAMP,&pHostData[0].m_dWorkDate,0,&pHostData[0].m_dWorkDateInd);<BR>SQLBindCol(m_hstmt,7,SQL_C_CHAR,pHostData[0].m_aDepartment,StuffbasicdataQry_aDepartment_SIZE,&pHostData[0].m_aDepartmentInd);<BR>SQLBindCol(m_hstmt,8,SQL_C_CHAR,pHostData[0].m_aBusiness,StuffbasicdataQry_aBusiness_SIZE,&pHostData[0].m_aBusinessInd);<BR>SQLBindCol(m_hstmt,9,SQL_C_CHAR,pHostData[0].m_aBusinessLevel,StuffbasicdataQry_aBusinessLevel_SIZE,&pHostData[0].m_aBusinessLevelInd);<BR>SQLBindCol(m_hstmt,10,SQL_C_CHAR,pHostData[0].m_aWorkType,StuffbasicdataQry_aWorkType_SIZE,&pHostData[0].m_aWorkTypeInd);<BR>SQLBindCol(m_hstmt,11,SQL_C_TIMESTAMP,&pHostData[0].m_dLeaveWorkDate,0,&pHostData[0].m_dLeaveWorkDateInd);<BR>SQLBindCol(m_hstmt,12,SQL_C_CHAR,pHostData[0].m_aEnageType,StuffbasicdataQry_aEnageType_SIZE,&pHostData[0].m_aEnageTypeInd);<BR>SQLBindCol(m_hstmt,13,SQL_C_TIMESTAMP,&pHostData[0].m_dCreateDocDate,0,&pHostData[0].m_dCreateDocDateInd);<BR><BR>while
(SQL_SUCCESS ==
SQLExtendedFetch(m_hstmt,SQL_FETCH_NEXT,1,&RowsFetched,pRowStatus))<BR>{<BR>for
(UINT Count = 0; Count < RowsFetched; Count++)<BR>{<BR>if
(pRowStatus[Count] != SQL_ROW_DELETED && pRowStatus[Count]
!= SQL_ROW_ERROR )<BR>{<BR>pDB_STUFFBASICDATAQRY_FIELDS pData = new
DB_STUFFBASICDATAQRY_FIELDS();<BR>ASSERT(pData);<BR><BR>if
(pHostData[Count].m_aStuffIDInd ==
SQL_NULL_DATA)<BR>pData->m_aStuffID =
"";<BR>else<BR>pData->m_aStuffID =
pHostData[Count].m_aStuffID;<BR>if (pHostData[Count].m_aNameCNInd ==
SQL_NULL_DATA)<BR>pData->m_aNameCN =
"";<BR>else<BR>pData->m_aNameCN =
pHostData[Count].m_aNameCN;<BR>if (pHostData[Count].m_aNameENInd ==
SQL_NULL_DATA)<BR>pData->m_aNameEN =
"";<BR>else<BR>pData->m_aNameEN =
pHostData[Count].m_aNameEN;<BR>if (pHostData[Count].m_aEducationInd
== SQL_NULL_DATA)<BR>pData->m_aEducation =
"";<BR>else<BR>pData->m_aEducation =
pHostData[Count].m_aEducation;<BR>if (pHostData[Count].m_aGenderInd
== SQL_NULL_DATA)<BR>pData->m_aGender =
"";<BR>else<BR>pData->m_aGender =
pHostData[Count].m_aGender;<BR>pData->m_dWorkDate.SetDateTime(pHostData[Count].m_dWorkDate.year,<BR>pHostData[Count].m_dWorkDate.month,<BR>pHostData[Count].m_dWorkDate.day,<BR>pHostData[Count].m_dWorkDate.hour,<BR>pHostData[Count].m_dWorkDate.minute,<BR>pHostData[Count].m_dWorkDate.second);<BR>if
(pHostData[Count].m_aDepartmentInd ==
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?