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>&nbsp;&nbsp;&nbsp;&nbsp;AppBuilder中进行直接ODBC 
            API数据库调用访问的基本方法!</B>&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;<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>作者:张修勇&nbsp; 
            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然后你可以选择&lt;添加&gt;按钮来新增一个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( 
            &amp;m_henv 
            )))<BR>{<BR>//创建新的DSN<BR>CreateDSN(IDS_HOME_DSNNAME,IDS_HOME_DBFILENAME);<BR>//分配连接句柄<BR>if 
            (SQL_SUCCESS == (m_retcode = SQLAllocConnect( m_henv, &amp;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,&amp;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,&amp;dbdata.m_Nid,0,&amp;cb);<BR>SQLBindCol(hstmt,2,SQL_C_TIMESTAMP,&amp;dbdata.m_Ariqi,0,&amp;cb);<BR>SQLBindCol(hstmt,3,SQL_C_DOUBLE,&amp;dbdata.m_Njine,0,&amp;cb);<BR>SQLBindCol(hstmt,4,SQL_C_CHAR,dbdata.m_Ashuoming,HHZhiChu_aShuoMing_SIZE,&amp;cb);<BR>SQLBindCol(hstmt,5,SQL_C_CHAR,dbdata.m_Alaiyuan,HHZhiChu_aLaiYuan_SIZE,&amp;cb);<BR>SQLBindCol(hstmt,6,SQL_C_CHAR,dbdata.m_Acunzhe,HHZhiChu_aCunZhe_SIZE,&amp;cb);<BR>SQLBindCol(hstmt,7,SQL_C_CHAR,dbdata.m_Ayongtu,HHZhiChu_aYongTu_SIZE,&amp;cb);<BR>SQLBindCol(hstmt,8,SQL_C_CHAR,dbdata.m_Axiaofei,HHZhiChu_aXiaoFei_SIZE,&amp;cb);<BR>SQLBindCol(hstmt,9,SQL_C_CHAR,dbdata.m_Abeizhu,HHZhiChu_aBeiZhu_SIZE,&amp;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, &amp;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, 
            &amp;nDataSourceNameLength, (UCHAR *)szSourceDescription, MAXBUFLEN, 
            &amp;nSourceDescriptionLength)) != SQL_NO_DATA &amp;&amp; nResult != 
            SQL_ERROR)<BR>{<BR>nDirection=SQL_FETCH_NEXT;<BR>// 
            szSourceDescription为DSN 的描述,可以在这里取来用;<BR>}<BR><BR>四、 针对表的操作:<BR>1、 
            取得表名:<BR>void SuperDatabase::GetTable(CStringList 
            &amp;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, 
            &amp;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, &amp;cb);<BR>::SQLBindCol(hstmt, 4, 
            SQL_C_CHAR, szTableType, 255, &amp;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,&amp;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,&amp;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,&amp;dbdata.m_Nid,0,&amp;cb1);<BR>SQLBindCol(hstmt,2,SQL_C_TIMESTAMP,&amp;dbdata.m_Ariqi,0,&amp;cb2);<BR>SQLBindCol(hstmt,3,SQL_C_DOUBLE,&amp;dbdata.m_Njine,0,&amp;cb3);<BR>SQLBindCol(hstmt,4,SQL_C_CHAR,dbdata.m_Ashuoming,HHZhiChu_aShuoMing_SIZE,&amp;cb4);<BR>SQLBindCol(hstmt,5,SQL_C_CHAR,dbdata.m_Alaiyuan,HHZhiChu_aLaiYuan_SIZE,&amp;cb5);<BR>SQLBindCol(hstmt,6,SQL_C_CHAR,dbdata.m_Acunzhe,HHZhiChu_aCunZhe_SIZE,&amp;cb6);<BR>SQLBindCol(hstmt,7,SQL_C_CHAR,dbdata.m_Ayongtu,HHZhiChu_aYongTu_SIZE,&amp;cb7);<BR>SQLBindCol(hstmt,8,SQL_C_CHAR,dbdata.m_Axiaofei,HHZhiChu_aXiaoFei_SIZE,&amp;cb8);<BR>SQLBindCol(hstmt,9,SQL_C_CHAR,dbdata.m_Abeizhu,HHZhiChu_aBeiZhu_SIZE,&amp;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-&gt;GetHDBC(), 
            &amp;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 &lt; 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 &gt; 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,&amp;pHostData[0].m_aStuffIDInd);<BR>SQLBindCol(m_hstmt,2,SQL_C_CHAR,pHostData[0].m_aNameCN,StuffbasicdataQry_aNameCN_SIZE,&amp;pHostData[0].m_aNameCNInd);<BR>SQLBindCol(m_hstmt,3,SQL_C_CHAR,pHostData[0].m_aNameEN,StuffbasicdataQry_aNameEN_SIZE,&amp;pHostData[0].m_aNameENInd);<BR>SQLBindCol(m_hstmt,4,SQL_C_CHAR,pHostData[0].m_aEducation,StuffbasicdataQry_aEducation_SIZE,&amp;pHostData[0].m_aEducationInd);<BR>SQLBindCol(m_hstmt,5,SQL_C_CHAR,pHostData[0].m_aGender,StuffbasicdataQry_aGender_SIZE,&amp;pHostData[0].m_aGenderInd);<BR>SQLBindCol(m_hstmt,6,SQL_C_TIMESTAMP,&amp;pHostData[0].m_dWorkDate,0,&amp;pHostData[0].m_dWorkDateInd);<BR>SQLBindCol(m_hstmt,7,SQL_C_CHAR,pHostData[0].m_aDepartment,StuffbasicdataQry_aDepartment_SIZE,&amp;pHostData[0].m_aDepartmentInd);<BR>SQLBindCol(m_hstmt,8,SQL_C_CHAR,pHostData[0].m_aBusiness,StuffbasicdataQry_aBusiness_SIZE,&amp;pHostData[0].m_aBusinessInd);<BR>SQLBindCol(m_hstmt,9,SQL_C_CHAR,pHostData[0].m_aBusinessLevel,StuffbasicdataQry_aBusinessLevel_SIZE,&amp;pHostData[0].m_aBusinessLevelInd);<BR>SQLBindCol(m_hstmt,10,SQL_C_CHAR,pHostData[0].m_aWorkType,StuffbasicdataQry_aWorkType_SIZE,&amp;pHostData[0].m_aWorkTypeInd);<BR>SQLBindCol(m_hstmt,11,SQL_C_TIMESTAMP,&amp;pHostData[0].m_dLeaveWorkDate,0,&amp;pHostData[0].m_dLeaveWorkDateInd);<BR>SQLBindCol(m_hstmt,12,SQL_C_CHAR,pHostData[0].m_aEnageType,StuffbasicdataQry_aEnageType_SIZE,&amp;pHostData[0].m_aEnageTypeInd);<BR>SQLBindCol(m_hstmt,13,SQL_C_TIMESTAMP,&amp;pHostData[0].m_dCreateDocDate,0,&amp;pHostData[0].m_dCreateDocDateInd);<BR><BR>while 
            (SQL_SUCCESS == 
            SQLExtendedFetch(m_hstmt,SQL_FETCH_NEXT,1,&amp;RowsFetched,pRowStatus))<BR>{<BR>for 
            (UINT Count = 0; Count &lt; RowsFetched; Count++)<BR>{<BR>if 
            (pRowStatus[Count] != SQL_ROW_DELETED &amp;&amp; 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-&gt;m_aStuffID = 
            "";<BR>else<BR>pData-&gt;m_aStuffID = 
            pHostData[Count].m_aStuffID;<BR>if (pHostData[Count].m_aNameCNInd == 
            SQL_NULL_DATA)<BR>pData-&gt;m_aNameCN = 
            "";<BR>else<BR>pData-&gt;m_aNameCN = 
            pHostData[Count].m_aNameCN;<BR>if (pHostData[Count].m_aNameENInd == 
            SQL_NULL_DATA)<BR>pData-&gt;m_aNameEN = 
            "";<BR>else<BR>pData-&gt;m_aNameEN = 
            pHostData[Count].m_aNameEN;<BR>if (pHostData[Count].m_aEducationInd 
            == SQL_NULL_DATA)<BR>pData-&gt;m_aEducation = 
            "";<BR>else<BR>pData-&gt;m_aEducation = 
            pHostData[Count].m_aEducation;<BR>if (pHostData[Count].m_aGenderInd 
            == SQL_NULL_DATA)<BR>pData-&gt;m_aGender = 
            "";<BR>else<BR>pData-&gt;m_aGender = 
            pHostData[Count].m_aGender;<BR>pData-&gt;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 + -
显示快捷键?