csdn_文档中心_appbuilder中进行直接odbc api数据库调用访问的基本方法!.htm
来自「csdn10年中间经典帖子」· HTM 代码 · 共 560 行 · 第 1/3 页
HTM
560 行
SQL_NULL_DATA)<BR>pData->m_aDepartment =
"";<BR>else<BR>pData->m_aDepartment =
pHostData[Count].m_aDepartment;<BR>if
(pHostData[Count].m_aBusinessInd ==
SQL_NULL_DATA)<BR>pData->m_aBusiness =
"";<BR>else<BR>pData->m_aBusiness =
pHostData[Count].m_aBusiness;<BR>if
(pHostData[Count].m_aBusinessLevelInd ==
SQL_NULL_DATA)<BR>pData->m_aBusinessLevel =
"";<BR>else<BR>pData->m_aBusinessLevel =
pHostData[Count].m_aBusinessLevel;<BR>if
(pHostData[Count].m_aWorkTypeInd ==
SQL_NULL_DATA)<BR>pData->m_aWorkType =
"";<BR>else<BR>pData->m_aWorkType =
pHostData[Count].m_aWorkType;<BR>pData->m_dLeaveWorkDate.SetDateTime(pHostData[Count].m_dLeaveWorkDate.year,<BR>pHostData[Count].m_dLeaveWorkDate.month,<BR>pHostData[Count].m_dLeaveWorkDate.day,<BR>pHostData[Count].m_dLeaveWorkDate.hour,<BR>pHostData[Count].m_dLeaveWorkDate.minute,<BR>pHostData[Count].m_dLeaveWorkDate.second);<BR>if
(pHostData[Count].m_aEnageTypeInd ==
SQL_NULL_DATA)<BR>pData->m_aEnageType =
"";<BR>else<BR>pData->m_aEnageType =
pHostData[Count].m_aEnageType;<BR>pData->m_dCreateDocDate.SetDateTime(pHostData[Count].m_dCreateDocDate.year,<BR>pHostData[Count].m_dCreateDocDate.month,<BR>pHostData[Count].m_dCreateDocDate.day,<BR>pHostData[Count].m_dCreateDocDate.hour,<BR>pHostData[Count].m_dCreateDocDate.minute,<BR>pHostData[Count].m_dCreateDocDate.second);<BR><BR>m_aData.Add(pData);<BR>}<BR>}<BR>if
(RowsFetched < (UINT)m_nRowSetSize)<BR>break;<BR>}<BR>}<BR>delete
[] pRowStatus;<BR>delete [] pHostData;<BR>return
m_aData.GetSize();<BR>}<BR><BR>八、写数据库<BR>1、普通方法:<BR>CString
strSQL="INSERT INTO TABLE (FILE1,FILE2,FILE3) VALUES
(value1,value2,value3)"<BR><BR>long ExecuteSQL(SQLHDBC hdbc,CString
strSQL)<BR>{<BR>SQLRETURN ReturnCode;<BR>SQLHSTMT m_hstmt;<BR>BOOL
bReturn = FALSE;<BR>long nRowCount = 0;<BR>if (SQL_SUCCESS ==
(ReturnCode =
::SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&m_hstmt)))<BR>{<BR>if
(SQL_SUCCESS == (ReturnCode = ::SQLExecDirect(m_hstmt,
(UCHAR*)((LPCTSTR)strSQL),SQL_NTS)))<BR>{<BR>bReturn =
TRUE;<BR>::SQLRowCount(m_hstmt,&nRowCount);<BR>}<BR>}<BR>ReturnCode
= ::SQLFreeHandle(SQL_HANDLE_STMT,m_hstmt);<BR><BR>// if (!bReturn)
nRowCount = 0;<BR>return
nRowCount;<BR>}<BR>注意,要把字段赋为空,字符串、日期应是NULL,可以用下面的函数修改:<BR>CString
VerifySQLStr(CString strSQL)<BR>{<BR>int nLength =
strSQL.GetLength();<BR>int n1 = 0;//check '';<BR>int n2 = 0;<BR>int
m1 = 0;//check ##;<BR>int m2 = 0;<BR>for (int i = 0; i<
nLength;i++)<BR>{<BR>if (strSQL[i] == 39)<BR>{<BR>n2 = i;<BR>if
(n2-n1 ==
1)<BR>{<BR>strSQL.Delete(n1,2);<BR>strSQL.Insert(n1,"NULL");<BR>nLength
+=2;<BR>n1 = n2;<BR>}<BR>else<BR>{<BR>n1 = n2;<BR>}<BR>}<BR>if
(strSQL[i] == '#')<BR>{<BR>m2 = i;<BR>if (m2-m1 ==
1)<BR>{<BR>strSQL.Delete(m1,2);<BR>strSQL.Insert(m1,"NULL");<BR>nLength
+=2;<BR>m1 = m2;<BR>}<BR>else<BR>{<BR>m1 =
m2;<BR>}<BR>}<BR>}<BR>return strSQL;<BR>}<BR><BR>2、参数绑定:<BR>bool
CCddataSet::Insert(pDB_CDDATA_SET_FIELDS pData, bool bFirstTime /*
true */)<BR>{<BR>RETCODE ReturnCode;<BR>CString
strSQLString;<BR>static FF_DB_CDDATA_SET_FIELDS
HostData;<BR><BR><BR>// Prepare the statement and bind the columns
once<BR>if
(bFirstTime)<BR>{<BR>memset(&HostData,0,sizeof(HostData));<BR>SQLFreeStmt(m_hstmt,
SQL_CLOSE); // Close the cursor if any<BR>SQLFreeStmt(m_hstmt,
SQL_RESET_PARAMS); // Reset the statement
handle<BR>strSQLString.Format("INSERT INTO CDData
("<BR>"NGUANGPAN,"<BR>"NWENJIAN,"<BR>"NCLASS,"<BR>"AWENJIAN,"<BR>"NSHANGJI,"<BR>"NSHUXING,"<BR>"ABEIZHU
)"<BR>"VALUES ("<BR>"?," // nGuangPan<BR>"?," // nWenJian<BR>"?," //
nClass<BR>"?," // aWenJian<BR>"?," // nShangJi<BR>"?," //
nShuXing<BR>"? )" // aBeiZhu<BR>); // end format<BR><BR>ReturnCode =
SQLPrepare(m_hstmt, (UCHAR*)((LPCTSTR)strSQLString),SQL_NTS);<BR>if
(ReturnCode != SQL_SUCCESS)<BR>{<BR>return
false;<BR>}<BR><BR>SQLBindParameter(m_hstmt,1, SQL_PARAM_INPUT,
SQL_C_SLONG, SQL_INTEGER,
0,<BR>0,&HostData.m_Nguangpan,0,&HostData.m_NguangpanInd
);<BR>SQLBindParameter(m_hstmt,
2,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,
0,<BR>0,&HostData.m_Nwenjian,0, &HostData.m_NwenjianInd
);<BR>SQLBindParameter(m_hstmt,3,SQL_PARAM_INPUT,
SQL_C_SLONG,SQL_INTEGER,
0,<BR>0,&HostData.m_Nclass,0,&HostData.m_NclassInd
);<BR>SQLBindParameter(m_hstmt,4,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_VARCHAR,<BR>CDData_aWenJian_SIZE,0,HostData.m_Awenjian,0,&HostData.m_AwenjianInd
);<BR>SQLBindParameter(m_hstmt,5,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,<BR>0,&HostData.m_Nshangji,
0, &HostData.m_NshangjiInd
);<BR>SQLBindParameter(m_hstmt,6,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,
0,<BR>0, &HostData.m_Nshuxing, 0,&HostData.m_NshuxingInd
);<BR>SQLBindParameter(m_hstmt,
7,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_VARCHAR,<BR>CDData_aBeiZhu_SIZE,0,
HostData.m_Abeizhu, 0,&HostData.m_AbeizhuInd
);<BR><BR>}<BR><BR>// Move the data to host structure and execute
the statement<BR>HostData.m_Nguangpan =
pData->m_Nguangpan;<BR>HostData.m_Nwenjian =
pData->m_Nwenjian;<BR>HostData.m_Nclass =
pData->m_Nclass;<BR>HostData.m_AwenjianInd =
SQL_NTS;<BR>memcpy(HostData.m_Awenjian, pData->m_Awenjian,
CDData_aWenJian_SIZE);<BR>HostData.m_Nshangji =
pData->m_Nshangji;<BR>HostData.m_Nshuxing =
pData->m_Nshuxing;<BR>HostData.m_AbeizhuInd =
SQL_NTS;<BR>memcpy(HostData.m_Abeizhu, pData->m_Abeizhu,
CDData_aBeiZhu_SIZE);<BR><BR>ReturnCode = SQLExecute(m_hstmt);<BR>if
(ReturnCode != SQL_SUCCESS)<BR>{<BR>return false;<BR>}<BR><BR>return
true;<BR><BR>}<BR><BR><BR>九、其他操作:<BR><BR>1、检测SQL错误:<BR>void
DisplayError(SQLRETURN nResult, SWORD fHandleType, SQLHANDLE
handle)<BR>{<BR>UCHAR szErrState[SQL_SQLSTATE_SIZE+1]; // SQL Error
State string<BR>UCHAR szErrText[SQL_MAX_MESSAGE_LENGTH+1]; // SQL
Error Text string<BR>char szBuffer[1000];<BR>char
szDispBuffer[1000]; // Display Buffer<BR>// formatted Error text
Buffer<BR>SWORD wErrMsgLen; // Error message length<BR>long
dwErrCode; // Native Error code<BR>int iSize; // Display Error Text
size<BR>SQLRETURN nErrResult; // Return Code from
SQLGetDiagRec<BR>SWORD sMsgNum = 1;<BR>SWORD fFirstRun =
TRUE;<BR><BR>szBuffer[0] = '\0';<BR><BR>do<BR>{<BR>// continue to
bring messageboxes till all errors are displayed.<BR>// more than
one message box may be reqd. as err text has fixed<BR>// string
size.<BR><BR>// initialize display buffer with the string in error
text buffer<BR>strcpy(szDispBuffer, szBuffer);<BR><BR>// call
SQLGetDiagRec function with proper ODBC handles, repeatedly
until<BR>// function returns SQL_NO_DATA. Concatenate all error
strings<BR>// in the display buffer and display all
results.<BR>while ((nErrResult = SQLGetDiagRec(fHandleType, handle,
sMsgNum++,<BR>szErrState, &dwErrCode,
szErrText,<BR>SQL_MAX_MESSAGE_LENGTH-1, &wErrMsgLen))<BR>!=
SQL_NO_DATA) {<BR><BR><BR>if(nErrResult == SQL_ERROR ¦¦ nErrResult
== SQL_INVALID_HANDLE)<BR>break;<BR><BR>wsprintf(szBuffer,
SQLERR_FORMAT, (LPSTR)szErrState, dwErrCode,
(LPSTR)szErrText);<BR>iSize = strlen(szDispBuffer);<BR>if (iSize
&& (iSize+strlen(szBuffer)+1) >= 1000)<BR>break;<BR>if
(iSize)<BR>strcat(szDispBuffer, "\n");<BR>strcat(szDispBuffer,
szBuffer);<BR>}<BR><BR>// display proper ERROR or WARNING message
with proper title<BR><BR>if (nResult ==
SQL_SUCCESS_WITH_INFO)<BR>MessageBox(NULL, szDispBuffer, (fFirstRun?
SQLWRNMSGTITLE : SQLWRNCNTDTITLE),<BR>MB_OK ¦
MB_ICONINFORMATION);<BR>else<BR>MessageBox(NULL, szDispBuffer,
(fFirstRun? SQLERRMSGTITLE : SQLERRCNTDTITLE),<BR>MB_OK ¦
MB_ICONEXCLAMATION);<BR><BR>if (fFirstRun)<BR>fFirstRun =
FALSE;<BR>}<BR>while (!(nErrResult == SQL_NO_DATA ¦¦ nErrResult ==
SQL_ERROR ¦¦ nErrResult ==
SQL_INVALID_HANDLE));<BR>}<BR>分配和释放语句<BR><BR>任何与处理和传递SQL语句相关的SQL函数都要求一个有效的语句句柄作为<BR>参数。语句句柄很象环境或连接句柄,区别之处在于它引用SQL语句或者其它<BR>返回结果的ODBC函数。一个连接句柄可以与几个语句句柄相关连,但每一个<BR>语句句柄只能与一个连接句柄相关连。应用系统要想分配语句句柄,只需调用<BR>下面描述的SQLAllocStmt即可。
<BR><BR>SQLAllocStmt为语句句柄分配内存存储区,并将此句柄与连接句柄指定的<BR>连接联系在一起。应用系统必须先用SQLAllocStmt为SQL语句分配内存,然后<BR>才能提供引用某一特殊语句句柄的SQL语句。<BR><BR>SQLAllocStmt的语法如下:<BR>RETCODE
SQLAllocStmt(hdbc,phstmt)<BR>SQLAllocStmt的返回码为:<BR>SQL-SUCCESS<BR>SQL-SUCCESS-WITH-INFO<BR>SQL-INVALID-HANDLE<BR>SQL-ERROR
<BR><BR><BR>SQLFreeStmt<BR><BR>SQLFreeStmt完成以下动作:<BR>.停止任何与指定语句句柄相关的、当前正在处理的SQL语句;<BR>关闭任何与指定语句句柄相关的打开光标;<BR>舍弃所有未完成的结果。<BR>有选择的释放与指定语句句柄相关的所有资源;<BR><BR>SQLFreeStmt的语法为:<BR>RETCODE
SQLFreeStmt(hstmt,fOption)
<BR>SQLFreeStmt的返回码是:<BR>SQL-SUCCESS<BR>SQL-SUCCESS-WITH-INFO<BR>SQL-INVALID-HANDLE<BR>SQL-ERROR
<BR><BR>最后
<BR><BR>在我们的开发系统AppBuilder中你可以不必对上面的复杂的过程进行完整的了解,你也不必书写任何的调用代码,我们将这一切都自动为你产生,同时还和开发最终程序的界面融合在一起,一切都非常简单。为你的开发自动编写大量的代码,如果你需要看看,请到:www.ucancode.com中下在一个免费的版本。
<BR><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0
width=770>
<TBODY>
<TR bgColor=#006699>
<TD align=middle bgColor=#006699 id=white><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle>
<SCRIPT
src="CSDN_文档中心_AppBuilder中进行直接ODBC API数据库调用访问的基本方法!.files/readnum.htm"></SCRIPT>
</TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TH bgColor=#006699 id=white><FONT
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD>你没有登陆,无法发表评论。 请先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=290">登陆</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
<TBODY>
<TR align=middle>
<TD height=10 vAlign=bottom><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
border=0 height=48
src="CSDN_文档中心_AppBuilder中进行直接ODBC API数据库调用访问的基本方法!.files/biaoshi.gif"
width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?