forked from docs/doc-exports
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com> Co-authored-by: Lu, Huayi <luhuayi@huawei.com> Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
667 lines
84 KiB
HTML
667 lines
84 KiB
HTML
<a name="EN-US_TOPIC_0000001233761825"></a><a name="EN-US_TOPIC_0000001233761825"></a>
|
|
|
|
<h1 class="topictitle1">ODBC Development Example</h1>
|
|
<div id="body8662426"><div class="section" id="EN-US_TOPIC_0000001233761825__s4ab19e6f0e0d41b39b0e68c0896b1c4c"><h4 class="sectiontitle">Code for Common Functions</h4><div class="codecoloring" codetype="Cpp" id="EN-US_TOPIC_0000001233761825__s4135e8b296f5453e8907f6d34738eb4f"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span>
|
|
<span class="normal">11</span>
|
|
<span class="normal">12</span>
|
|
<span class="normal">13</span>
|
|
<span class="normal">14</span>
|
|
<span class="normal">15</span>
|
|
<span class="normal">16</span>
|
|
<span class="normal">17</span>
|
|
<span class="normal">18</span>
|
|
<span class="normal">19</span>
|
|
<span class="normal">20</span>
|
|
<span class="normal">21</span>
|
|
<span class="normal">22</span>
|
|
<span class="normal">23</span>
|
|
<span class="normal">24</span>
|
|
<span class="normal">25</span>
|
|
<span class="normal">26</span>
|
|
<span class="normal">27</span>
|
|
<span class="normal">28</span>
|
|
<span class="normal">29</span>
|
|
<span class="normal">30</span>
|
|
<span class="normal">31</span>
|
|
<span class="normal">32</span>
|
|
<span class="normal">33</span>
|
|
<span class="normal">34</span>
|
|
<span class="normal">35</span>
|
|
<span class="normal">36</span>
|
|
<span class="normal">37</span>
|
|
<span class="normal">38</span>
|
|
<span class="normal">39</span>
|
|
<span class="normal">40</span>
|
|
<span class="normal">41</span>
|
|
<span class="normal">42</span>
|
|
<span class="normal">43</span>
|
|
<span class="normal">44</span>
|
|
<span class="normal">45</span>
|
|
<span class="normal">46</span>
|
|
<span class="normal">47</span>
|
|
<span class="normal">48</span>
|
|
<span class="normal">49</span>
|
|
<span class="normal">50</span>
|
|
<span class="normal">51</span>
|
|
<span class="normal">52</span>
|
|
<span class="normal">53</span>
|
|
<span class="normal">54</span>
|
|
<span class="normal">55</span>
|
|
<span class="normal">56</span>
|
|
<span class="normal">57</span>
|
|
<span class="normal">58</span>
|
|
<span class="normal">59</span>
|
|
<span class="normal">60</span>
|
|
<span class="normal">61</span>
|
|
<span class="normal">62</span>
|
|
<span class="normal">63</span>
|
|
<span class="normal">64</span>
|
|
<span class="normal">65</span>
|
|
<span class="normal">66</span>
|
|
<span class="normal">67</span>
|
|
<span class="normal">68</span>
|
|
<span class="normal">69</span>
|
|
<span class="normal">70</span>
|
|
<span class="normal">71</span>
|
|
<span class="normal">72</span>
|
|
<span class="normal">73</span>
|
|
<span class="normal">74</span>
|
|
<span class="normal">75</span>
|
|
<span class="normal">76</span>
|
|
<span class="normal">77</span>
|
|
<span class="normal">78</span>
|
|
<span class="normal">79</span>
|
|
<span class="normal">80</span>
|
|
<span class="normal">81</span>
|
|
<span class="normal">82</span>
|
|
<span class="normal">83</span>
|
|
<span class="normal">84</span>
|
|
<span class="normal">85</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1">// The following example shows how to obtain data from GaussDB(DWS) through the ODBC interface.</span>
|
|
<span class="c1">// DBtest.c (compile with: libodbc.so) </span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdlib.h></span><span class="c1"> </span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span><span class="c1"> </span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><sqlext.h></span>
|
|
<span class="cp">#ifdef WIN32</span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><windows.h></span>
|
|
<span class="cp">#endif </span>
|
|
<span class="n">SQLHENV</span><span class="w"> </span><span class="n">V_OD_Env</span><span class="p">;</span><span class="w"> </span><span class="c1">// Handle ODBC environment </span>
|
|
<span class="n">SQLHSTMT</span><span class="w"> </span><span class="n">V_OD_hstmt</span><span class="p">;</span><span class="w"> </span><span class="c1">// Handle statement </span>
|
|
<span class="n">SQLHDBC</span><span class="w"> </span><span class="n">V_OD_hdbc</span><span class="p">;</span><span class="w"> </span><span class="c1">// Handle connection </span>
|
|
<span class="kt">char</span><span class="w"> </span><span class="k">typename</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
|
|
<span class="n">SQLINTEGER</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span>
|
|
<span class="n">SQLINTEGER</span><span class="w"> </span><span class="n">V_OD_erg</span><span class="p">,</span><span class="n">V_OD_buffer</span><span class="p">,</span><span class="n">V_OD_err</span><span class="p">,</span><span class="n">V_OD_id</span><span class="p">;</span>
|
|
<span class="n">SQLLEN</span><span class="w"> </span><span class="n">V_StrLen_or_IndPtr</span><span class="p">;</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">argv</span><span class="p">[])</span><span class="w"> </span>
|
|
<span class="p">{</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="c1">// 1. Apply for an environment handle. </span>
|
|
<span class="w"> </span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLAllocHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_ENV</span><span class="p">,</span><span class="n">SQL_NULL_HANDLE</span><span class="p">,</span><span class="o">&</span><span class="n">V_OD_Env</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_SUCCESS</span><span class="p">)</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="p">(</span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_SUCCESS_WITH_INFO</span><span class="p">))</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="p">{</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Error AllocHandle</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="p">}</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="c1">// 2. Set environment attributes (version information) </span>
|
|
<span class="w"> </span><span class="n">SQLSetEnvAttr</span><span class="p">(</span><span class="n">V_OD_Env</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_ATTR_ODBC_VERSION</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)</span><span class="n">SQL_OV_ODBC3</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="c1">// 3. Apply for a connection handle. </span>
|
|
<span class="w"> </span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLAllocHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_DBC</span><span class="p">,</span><span class="w"> </span><span class="n">V_OD_Env</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">V_OD_hdbc</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_SUCCESS</span><span class="p">)</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="p">(</span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_SUCCESS_WITH_INFO</span><span class="p">))</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="p">{</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">SQLFreeHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_ENV</span><span class="p">,</span><span class="w"> </span><span class="n">V_OD_Env</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="c1">// 4. Set connection attributes.</span>
|
|
<span class="w"> </span><span class="n">SQLSetConnectAttr</span><span class="p">(</span><span class="n">V_OD_hdbc</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_ATTR_AUTOCOMMIT</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_AUTOCOMMIT_ON</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="c1">// 5. Connect to the data source. userName and password indicate the username and password for connecting to the database. Set them as needed.</span>
|
|
<span class="c1">// If the username and password have been set in the odbc.ini file, you do not need to set userName or password here, retaining "" for them. However, you are not advised to do so because the username and password will be disclosed if the permission for odbc.ini is abused.</span>
|
|
<span class="w"> </span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLConnect</span><span class="p">(</span><span class="n">V_OD_hdbc</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLCHAR</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="s">"gaussdb"</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_NTS</span><span class="p">,</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="p">(</span><span class="n">SQLCHAR</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="s">"userName"</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_NTS</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLCHAR</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="s">"password"</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_NTS</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_SUCCESS</span><span class="p">)</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="p">(</span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_SUCCESS_WITH_INFO</span><span class="p">))</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="p">{</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Error SQLConnect %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">V_OD_erg</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">SQLFreeHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_ENV</span><span class="p">,</span><span class="w"> </span><span class="n">V_OD_Env</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="p">}</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Connected !</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="c1">// 6. Set statement attributes</span>
|
|
<span class="w"> </span><span class="n">SQLSetStmtAttr</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="n">SQL_ATTR_QUERY_TIMEOUT</span><span class="p">,(</span><span class="n">SQLPOINTER</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mi">3</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="c1">// 7. Apply for a statement handle</span>
|
|
<span class="w"> </span><span class="n">SQLAllocHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_STMT</span><span class="p">,</span><span class="w"> </span><span class="n">V_OD_hdbc</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">V_OD_hstmt</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="c1">// 8. Executes an SQL statement directly</span>
|
|
<span class="w"> </span><span class="n">SQLExecDirect</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="s">"drop table IF EXISTS customer_t1"</span><span class="p">,</span><span class="n">SQL_NTS</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">SQLExecDirect</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="s">"CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));"</span><span class="p">,</span><span class="n">SQL_NTS</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">SQLExecDirect</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="s">"insert into customer_t1 values(25,'li')"</span><span class="p">,</span><span class="n">SQL_NTS</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="c1">// 9. Prepare for execution</span>
|
|
<span class="w"> </span><span class="n">SQLPrepare</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="s">"insert into customer_t1 values(?)"</span><span class="p">,</span><span class="n">SQL_NTS</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="c1">// 10. Bind parameters</span>
|
|
<span class="w"> </span><span class="n">SQLBindParameter</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">SQL_PARAM_INPUT</span><span class="p">,</span><span class="n">SQL_C_SLONG</span><span class="p">,</span><span class="n">SQL_INTEGER</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="o">&</span><span class="n">value</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="nb">NULL</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="c1">// 11. Execute the ready statement</span>
|
|
<span class="w"> </span><span class="n">SQLExecute</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">SQLExecDirect</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="s">"select id from testtable"</span><span class="p">,</span><span class="n">SQL_NTS</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="c1">// 12. Obtain the attributes of a certain column in the result set</span>
|
|
<span class="w"> </span><span class="n">SQLColAttribute</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">SQL_DESC_TYPE_NAME</span><span class="p">,</span><span class="k">typename</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="k">typename</span><span class="p">),</span><span class="nb">NULL</span><span class="p">,</span><span class="nb">NULL</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"SQLColAtrribute %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="k">typename</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="c1">// 13. Bind the result set</span>
|
|
<span class="w"> </span><span class="n">SQLBindCol</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">SQL_C_SLONG</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLPOINTER</span><span class="p">)</span><span class="o">&</span><span class="n">V_OD_buffer</span><span class="p">,</span><span class="mi">150</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="p">(</span><span class="n">SQLLEN</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="o">&</span><span class="n">V_StrLen_or_IndPtr</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="c1">// 14. Collect data using SQLFetch</span>
|
|
<span class="w"> </span><span class="n">V_OD_erg</span><span class="o">=</span><span class="n">SQLFetch</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="c1">// 15. Obtain and return data using SQLGetData</span>
|
|
<span class="w"> </span><span class="k">while</span><span class="p">(</span><span class="n">V_OD_erg</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_NO_DATA</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">SQLGetData</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">SQL_C_SLONG</span><span class="p">,(</span><span class="n">SQLPOINTER</span><span class="p">)</span><span class="o">&</span><span class="n">V_OD_id</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="nb">NULL</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"SQLGetData ----ID = %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">V_OD_id</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">V_OD_erg</span><span class="o">=</span><span class="n">SQLFetch</span><span class="p">(</span><span class="n">V_OD_hstmt</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">};</span>
|
|
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Done !</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="c1">// 16. Disconnect from the data source and release handles</span>
|
|
<span class="w"> </span><span class="n">SQLFreeHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_STMT</span><span class="p">,</span><span class="n">V_OD_hstmt</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">SQLDisconnect</span><span class="p">(</span><span class="n">V_OD_hdbc</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">SQLFreeHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_DBC</span><span class="p">,</span><span class="n">V_OD_hdbc</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">SQLFreeHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_ENV</span><span class="p">,</span><span class="w"> </span><span class="n">V_OD_Env</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="k">return</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001233761825__section6611714101314"><h4 class="sectiontitle">Code for Batch Processing</h4><div class="codecoloring" codetype="Cpp" id="EN-US_TOPIC_0000001233761825__screen1654542412144"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal"> 10</span>
|
|
<span class="normal"> 11</span>
|
|
<span class="normal"> 12</span>
|
|
<span class="normal"> 13</span>
|
|
<span class="normal"> 14</span>
|
|
<span class="normal"> 15</span>
|
|
<span class="normal"> 16</span>
|
|
<span class="normal"> 17</span>
|
|
<span class="normal"> 18</span>
|
|
<span class="normal"> 19</span>
|
|
<span class="normal"> 20</span>
|
|
<span class="normal"> 21</span>
|
|
<span class="normal"> 22</span>
|
|
<span class="normal"> 23</span>
|
|
<span class="normal"> 24</span>
|
|
<span class="normal"> 25</span>
|
|
<span class="normal"> 26</span>
|
|
<span class="normal"> 27</span>
|
|
<span class="normal"> 28</span>
|
|
<span class="normal"> 29</span>
|
|
<span class="normal"> 30</span>
|
|
<span class="normal"> 31</span>
|
|
<span class="normal"> 32</span>
|
|
<span class="normal"> 33</span>
|
|
<span class="normal"> 34</span>
|
|
<span class="normal"> 35</span>
|
|
<span class="normal"> 36</span>
|
|
<span class="normal"> 37</span>
|
|
<span class="normal"> 38</span>
|
|
<span class="normal"> 39</span>
|
|
<span class="normal"> 40</span>
|
|
<span class="normal"> 41</span>
|
|
<span class="normal"> 42</span>
|
|
<span class="normal"> 43</span>
|
|
<span class="normal"> 44</span>
|
|
<span class="normal"> 45</span>
|
|
<span class="normal"> 46</span>
|
|
<span class="normal"> 47</span>
|
|
<span class="normal"> 48</span>
|
|
<span class="normal"> 49</span>
|
|
<span class="normal"> 50</span>
|
|
<span class="normal"> 51</span>
|
|
<span class="normal"> 52</span>
|
|
<span class="normal"> 53</span>
|
|
<span class="normal"> 54</span>
|
|
<span class="normal"> 55</span>
|
|
<span class="normal"> 56</span>
|
|
<span class="normal"> 57</span>
|
|
<span class="normal"> 58</span>
|
|
<span class="normal"> 59</span>
|
|
<span class="normal"> 60</span>
|
|
<span class="normal"> 61</span>
|
|
<span class="normal"> 62</span>
|
|
<span class="normal"> 63</span>
|
|
<span class="normal"> 64</span>
|
|
<span class="normal"> 65</span>
|
|
<span class="normal"> 66</span>
|
|
<span class="normal"> 67</span>
|
|
<span class="normal"> 68</span>
|
|
<span class="normal"> 69</span>
|
|
<span class="normal"> 70</span>
|
|
<span class="normal"> 71</span>
|
|
<span class="normal"> 72</span>
|
|
<span class="normal"> 73</span>
|
|
<span class="normal"> 74</span>
|
|
<span class="normal"> 75</span>
|
|
<span class="normal"> 76</span>
|
|
<span class="normal"> 77</span>
|
|
<span class="normal"> 78</span>
|
|
<span class="normal"> 79</span>
|
|
<span class="normal"> 80</span>
|
|
<span class="normal"> 81</span>
|
|
<span class="normal"> 82</span>
|
|
<span class="normal"> 83</span>
|
|
<span class="normal"> 84</span>
|
|
<span class="normal"> 85</span>
|
|
<span class="normal"> 86</span>
|
|
<span class="normal"> 87</span>
|
|
<span class="normal"> 88</span>
|
|
<span class="normal"> 89</span>
|
|
<span class="normal"> 90</span>
|
|
<span class="normal"> 91</span>
|
|
<span class="normal"> 92</span>
|
|
<span class="normal"> 93</span>
|
|
<span class="normal"> 94</span>
|
|
<span class="normal"> 95</span>
|
|
<span class="normal"> 96</span>
|
|
<span class="normal"> 97</span>
|
|
<span class="normal"> 98</span>
|
|
<span class="normal"> 99</span>
|
|
<span class="normal">100</span>
|
|
<span class="normal">101</span>
|
|
<span class="normal">102</span>
|
|
<span class="normal">103</span>
|
|
<span class="normal">104</span>
|
|
<span class="normal">105</span>
|
|
<span class="normal">106</span>
|
|
<span class="normal">107</span>
|
|
<span class="normal">108</span>
|
|
<span class="normal">109</span>
|
|
<span class="normal">110</span>
|
|
<span class="normal">111</span>
|
|
<span class="normal">112</span>
|
|
<span class="normal">113</span>
|
|
<span class="normal">114</span>
|
|
<span class="normal">115</span>
|
|
<span class="normal">116</span>
|
|
<span class="normal">117</span>
|
|
<span class="normal">118</span>
|
|
<span class="normal">119</span>
|
|
<span class="normal">120</span>
|
|
<span class="normal">121</span>
|
|
<span class="normal">122</span>
|
|
<span class="normal">123</span>
|
|
<span class="normal">124</span>
|
|
<span class="normal">125</span>
|
|
<span class="normal">126</span>
|
|
<span class="normal">127</span>
|
|
<span class="normal">128</span>
|
|
<span class="normal">129</span>
|
|
<span class="normal">130</span>
|
|
<span class="normal">131</span>
|
|
<span class="normal">132</span>
|
|
<span class="normal">133</span>
|
|
<span class="normal">134</span>
|
|
<span class="normal">135</span>
|
|
<span class="normal">136</span>
|
|
<span class="normal">137</span>
|
|
<span class="normal">138</span>
|
|
<span class="normal">139</span>
|
|
<span class="normal">140</span>
|
|
<span class="normal">141</span>
|
|
<span class="normal">142</span>
|
|
<span class="normal">143</span>
|
|
<span class="normal">144</span>
|
|
<span class="normal">145</span>
|
|
<span class="normal">146</span>
|
|
<span class="normal">147</span>
|
|
<span class="normal">148</span>
|
|
<span class="normal">149</span>
|
|
<span class="normal">150</span>
|
|
<span class="normal">151</span>
|
|
<span class="normal">152</span>
|
|
<span class="normal">153</span>
|
|
<span class="normal">154</span>
|
|
<span class="normal">155</span>
|
|
<span class="normal">156</span>
|
|
<span class="normal">157</span>
|
|
<span class="normal">158</span>
|
|
<span class="normal">159</span>
|
|
<span class="normal">160</span>
|
|
<span class="normal">161</span>
|
|
<span class="normal">162</span>
|
|
<span class="normal">163</span>
|
|
<span class="normal">164</span>
|
|
<span class="normal">165</span>
|
|
<span class="normal">166</span>
|
|
<span class="normal">167</span>
|
|
<span class="normal">168</span>
|
|
<span class="normal">169</span>
|
|
<span class="normal">170</span>
|
|
<span class="normal">171</span>
|
|
<span class="normal">172</span>
|
|
<span class="normal">173</span>
|
|
<span class="normal">174</span>
|
|
<span class="normal">175</span>
|
|
<span class="normal">176</span>
|
|
<span class="normal">177</span>
|
|
<span class="normal">178</span>
|
|
<span class="normal">179</span>
|
|
<span class="normal">180</span>
|
|
<span class="normal">181</span>
|
|
<span class="normal">182</span>
|
|
<span class="normal">183</span>
|
|
<span class="normal">184</span>
|
|
<span class="normal">185</span>
|
|
<span class="normal">186</span>
|
|
<span class="normal">187</span>
|
|
<span class="normal">188</span>
|
|
<span class="normal">189</span>
|
|
<span class="normal">190</span>
|
|
<span class="normal">191</span>
|
|
<span class="normal">192</span>
|
|
<span class="normal">193</span>
|
|
<span class="normal">194</span>
|
|
<span class="normal">195</span>
|
|
<span class="normal">196</span>
|
|
<span class="normal">197</span>
|
|
<span class="normal">198</span>
|
|
<span class="normal">199</span>
|
|
<span class="normal">200</span>
|
|
<span class="normal">201</span>
|
|
<span class="normal">202</span>
|
|
<span class="normal">203</span>
|
|
<span class="normal">204</span>
|
|
<span class="normal">205</span>
|
|
<span class="normal">206</span>
|
|
<span class="normal">207</span>
|
|
<span class="normal">208</span>
|
|
<span class="normal">209</span>
|
|
<span class="normal">210</span>
|
|
<span class="normal">211</span>
|
|
<span class="normal">212</span>
|
|
<span class="normal">213</span>
|
|
<span class="normal">214</span>
|
|
<span class="normal">215</span>
|
|
<span class="normal">216</span>
|
|
<span class="normal">217</span>
|
|
<span class="normal">218</span>
|
|
<span class="normal">219</span>
|
|
<span class="normal">220</span>
|
|
<span class="normal">221</span>
|
|
<span class="normal">222</span>
|
|
<span class="normal">223</span>
|
|
<span class="normal">224</span>
|
|
<span class="normal">225</span>
|
|
<span class="normal">226</span>
|
|
<span class="normal">227</span>
|
|
<span class="normal">228</span>
|
|
<span class="normal">229</span>
|
|
<span class="normal">230</span>
|
|
<span class="normal">231</span>
|
|
<span class="normal">232</span>
|
|
<span class="normal">233</span>
|
|
<span class="normal">234</span>
|
|
<span class="normal">235</span>
|
|
<span class="normal">236</span>
|
|
<span class="normal">237</span>
|
|
<span class="normal">238</span>
|
|
<span class="normal">239</span>
|
|
<span class="normal">240</span></pre></div></td><td class="code"><div><pre><span></span><span class="cm">/**********************************************************************</span>
|
|
<span class="cm">* Set UseBatchProtocol to 1 in the data source and set the database parameter support_batch_bind</span>
|
|
<span class="cm">* to on.</span>
|
|
<span class="cm">* The CHECK_ERROR command is used to check and print error information.</span>
|
|
<span class="cm">* This example is used to interactively obtain the DSN, data volume to be processed, and volume of ignored data from users, and insert required data into the test_odbc_batch_insert table.</span>
|
|
<span class="cm">***********************************************************************/</span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdlib.h></span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><sql.h></span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><sqlext.h></span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><string.h></span>
|
|
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf">"util.c"</span>
|
|
|
|
<span class="kt">void</span><span class="w"> </span><span class="nf">Exec</span><span class="p">(</span><span class="n">SQLHDBC</span><span class="w"> </span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="n">SQLCHAR</span><span class="o">*</span><span class="w"> </span><span class="n">sql</span><span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="w"> </span><span class="n">SQLRETURN</span><span class="w"> </span><span class="n">retcode</span><span class="p">;</span><span class="w"> </span><span class="c1">// Return status</span>
|
|
<span class="w"> </span><span class="n">SQLHSTMT</span><span class="w"> </span><span class="n">hstmt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQL_NULL_HSTMT</span><span class="p">;</span><span class="w"> </span><span class="c1">// Statement handle</span>
|
|
<span class="w"> </span><span class="n">SQLCHAR</span><span class="w"> </span><span class="n">loginfo</span><span class="p">[</span><span class="mi">2048</span><span class="p">];</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Allocate Statement Handle</span>
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLAllocHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_STMT</span><span class="p">,</span><span class="w"> </span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">hstmt</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLAllocHandle(SQL_HANDLE_STMT)"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">hstmt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Prepare Statement</span>
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLPrepare</span><span class="p">(</span><span class="n">hstmt</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLCHAR</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">sql</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_NTS</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLPrepare log: %s"</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">sql</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="n">hstmt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLExecute</span><span class="p">(</span><span class="n">hstmt</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLExecute stmt log: %s"</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">sql</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="n">hstmt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLFreeHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_STMT</span><span class="p">,</span><span class="w"> </span><span class="n">hstmt</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLFreeHandle stmt log: %s"</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">sql</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="n">hstmt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="w"> </span><span class="p">()</span><span class="w"> </span>
|
|
<span class="p">{</span>
|
|
<span class="w"> </span><span class="n">SQLHENV</span><span class="w"> </span><span class="n">henv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQL_NULL_HENV</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLHDBC</span><span class="w"> </span><span class="n">hdbc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQL_NULL_HDBC</span><span class="p">;</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">batchCount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1000</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLLEN</span><span class="w"> </span><span class="n">rowsCount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">ignoreCount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
|
|
|
|
<span class="w"> </span><span class="n">SQLRETURN</span><span class="w"> </span><span class="n">retcode</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLCHAR</span><span class="w"> </span><span class="n">dsn</span><span class="p">[</span><span class="mi">1024</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="sc">'\0'</span><span class="p">};</span>
|
|
<span class="w"> </span><span class="n">SQLCHAR</span><span class="w"> </span><span class="n">loginfo</span><span class="p">[</span><span class="mi">2048</span><span class="p">];</span>
|
|
|
|
<span class="c1">// Interactively obtain data source names.</span>
|
|
<span class="w"> </span><span class="n">getStr</span><span class="p">(</span><span class="s">"Please input your DSN"</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">dsn</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">dsn</span><span class="p">),</span><span class="w"> </span><span class="sc">'N'</span><span class="p">);</span>
|
|
<span class="c1">// Interactively obtain the amount of data to be batch processed.</span>
|
|
<span class="w"> </span><span class="n">getInt</span><span class="p">(</span><span class="s">"batchCount"</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">batchCount</span><span class="p">,</span><span class="w"> </span><span class="sc">'N'</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="k">do</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="c1">// Interactively obtain the amount of batch processing data that is not inserted into the database.</span>
|
|
<span class="w"> </span><span class="n">getInt</span><span class="p">(</span><span class="s">"ignoreCount"</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">ignoreCount</span><span class="p">,</span><span class="w"> </span><span class="sc">'N'</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ignoreCount</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">batchCount</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"ignoreCount(%d) should be less than batchCount(%d)</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">ignoreCount</span><span class="p">,</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span><span class="k">while</span><span class="p">(</span><span class="n">ignoreCount</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLAllocHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_ENV</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_NULL_HANDLE</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">henv</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLAllocHandle(SQL_HANDLE_ENV)"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">henv</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_ENV</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Set ODBC Verion</span>
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLSetEnvAttr</span><span class="p">(</span><span class="n">henv</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_ATTR_ODBC_VERSION</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="p">(</span><span class="n">SQLPOINTER</span><span class="o">*</span><span class="p">)</span><span class="n">SQL_OV_ODBC3</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">henv</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_ENV</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Allocate Connection</span>
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLAllocHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_DBC</span><span class="p">,</span><span class="w"> </span><span class="n">henv</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">hdbc</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLAllocHandle(SQL_HANDLE_DBC)"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">henv</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_DBC</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Set Login Timeout</span>
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLSetConnectAttr</span><span class="p">(</span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_LOGIN_TIMEOUT</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLPOINTER</span><span class="p">)</span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLSetConnectAttr(SQL_LOGIN_TIMEOUT)"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_DBC</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Set Auto Commit</span>
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLSetConnectAttr</span><span class="p">(</span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_ATTR_AUTOCOMMIT</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="p">(</span><span class="n">SQLPOINTER</span><span class="p">)(</span><span class="mi">1</span><span class="p">),</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLSetConnectAttr(SQL_ATTR_AUTOCOMMIT)"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_DBC</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Connect to DSN</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">(</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLConnect(DSN:%s)"</span><span class="p">,</span><span class="w"> </span><span class="n">dsn</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLConnect</span><span class="p">(</span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLCHAR</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">dsn</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_NTS</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="p">(</span><span class="n">SQLCHAR</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_DBC</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="c1">// init table info.</span>
|
|
<span class="w"> </span><span class="n">Exec</span><span class="p">(</span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="s">"drop table if exists test_odbc_batch_insert"</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">Exec</span><span class="p">(</span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="s">"create table test_odbc_batch_insert(id int primary key, col varchar2(50))"</span><span class="p">);</span>
|
|
|
|
<span class="c1">// The following code constructs the data to be inserted based on the data volume entered by users:</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">SQLRETURN</span><span class="w"> </span><span class="n">retcode</span><span class="p">;</span><span class="w"> </span>
|
|
<span class="w"> </span><span class="n">SQLHSTMT</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQL_NULL_HSTMT</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLCHAR</span><span class="w"> </span><span class="o">*</span><span class="n">sql</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLINTEGER</span><span class="w"> </span><span class="o">*</span><span class="n">ids</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLCHAR</span><span class="w"> </span><span class="o">*</span><span class="n">cols</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLLEN</span><span class="w"> </span><span class="o">*</span><span class="n">bufLenIds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLLEN</span><span class="w"> </span><span class="o">*</span><span class="n">bufLenCols</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLUSMALLINT</span><span class="w"> </span><span class="o">*</span><span class="n">operptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLUSMALLINT</span><span class="w"> </span><span class="o">*</span><span class="n">statusptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">SQLULEN</span><span class="w"> </span><span class="n">process</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Data is constructed by column. Each column is stored continuously.</span>
|
|
<span class="w"> </span><span class="n">ids</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">SQLINTEGER</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">ids</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">cols</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">SQLCHAR</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">cols</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">50</span><span class="p">);</span>
|
|
<span class="c1">// Data size in each row for a column</span>
|
|
<span class="w"> </span><span class="n">bufLenIds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">SQLLEN</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">bufLenIds</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">bufLenCols</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">SQLLEN</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">bufLenCols</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
<span class="c1">// Whether this row needs to be processed. The value is SQL_PARAM_IGNORE or SQL_PARAM_PROCEED.</span>
|
|
<span class="w"> </span><span class="n">operptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">SQLUSMALLINT</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">operptr</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">memset</span><span class="p">(</span><span class="n">operptr</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">operptr</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
<span class="c1">// Processing result of the row</span>
|
|
<span class="c1">// Note: In the database, a statement belongs to one transaction. Therefore, data is processed as a unit. That is, either all data is inserted successfully or all data fails to be inserted.</span>
|
|
<span class="w"> </span><span class="n">statusptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">SQLUSMALLINT</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">statusptr</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">memset</span><span class="p">(</span><span class="n">statusptr</span><span class="p">,</span><span class="w"> </span><span class="mi">88</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">statusptr</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nb">NULL</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ids</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">cols</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">bufLenCols</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">bufLenIds</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span><span class="w"> </span><span class="s">"FAILED:</span><span class="se">\t</span><span class="s">malloc data memory failed</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="k">goto</span><span class="w"> </span><span class="n">exit</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
|
|
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">batchCount</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">ids</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">(</span><span class="n">cols</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">50</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="s">"column test value %d"</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">bufLenIds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">ids</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
|
|
<span class="w"> </span><span class="n">bufLenCols</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">strlen</span><span class="p">(</span><span class="n">cols</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">50</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">i</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">operptr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">ignoreCount</span><span class="p">)</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">SQL_PARAM_IGNORE</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SQL_PARAM_PROCEED</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Allocate Statement Handle</span>
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLAllocHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_STMT</span><span class="p">,</span><span class="w"> </span><span class="n">hdbc</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">hstmtinesrt</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLAllocHandle(SQL_HANDLE_STMT)"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Prepare Statement</span>
|
|
<span class="w"> </span><span class="n">sql</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">SQLCHAR</span><span class="o">*</span><span class="p">)</span><span class="s">"insert into test_odbc_batch_insert values(?, ?)"</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLPrepare</span><span class="p">(</span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLCHAR</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">sql</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_NTS</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLPrepare log: %s"</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">sql</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLSetStmtAttr</span><span class="p">(</span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_ATTR_PARAMSET_SIZE</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLPOINTER</span><span class="p">)</span><span class="n">batchCount</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">batchCount</span><span class="p">));</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLSetStmtAttr"</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLBindParameter</span><span class="p">(</span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_PARAM_INPUT</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_C_SLONG</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_INTEGER</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">ids</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="o">&</span><span class="p">(</span><span class="n">ids</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">bufLenIds</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLBindParameter for id"</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLBindParameter</span><span class="p">(</span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_PARAM_INPUT</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_C_CHAR</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_CHAR</span><span class="p">,</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="n">cols</span><span class="p">,</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="n">bufLenCols</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLBindParameter for cols"</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLSetStmtAttr</span><span class="p">(</span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_ATTR_PARAMS_PROCESSED_PTR</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLPOINTER</span><span class="p">)</span><span class="o">&</span><span class="n">process</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">process</span><span class="p">));</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLSetStmtAttr for SQL_ATTR_PARAMS_PROCESSED_PTR"</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLSetStmtAttr</span><span class="p">(</span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_ATTR_PARAM_STATUS_PTR</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLPOINTER</span><span class="p">)</span><span class="n">statusptr</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">statusptr</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLSetStmtAttr for SQL_ATTR_PARAM_STATUS_PTR"</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLSetStmtAttr</span><span class="p">(</span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_ATTR_PARAM_OPERATION_PTR</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">SQLPOINTER</span><span class="p">)</span><span class="n">operptr</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">operptr</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">batchCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLSetStmtAttr for SQL_ATTR_PARAM_OPERATION_PTR"</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLExecute</span><span class="p">(</span><span class="n">hstmtinesrt</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLExecute stmt log: %s"</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">sql</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLRowCount</span><span class="p">(</span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">rowsCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLRowCount execution"</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">rowsCount</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="p">(</span><span class="n">batchCount</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">ignoreCount</span><span class="p">))</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">(</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"(batchCount - ignoreCount)(%d) != rowsCount(%d)"</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">batchCount</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">ignoreCount</span><span class="p">),</span><span class="w"> </span><span class="n">rowsCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">SQL_ERROR</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="k">else</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">(</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"(batchCount - ignoreCount)(%d) == rowsCount(%d)"</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">batchCount</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">ignoreCount</span><span class="p">),</span><span class="w"> </span><span class="n">rowsCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">SQL_SUCCESS</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">rowsCount</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">process</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">(</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"process(%d) != rowsCount(%d)"</span><span class="p">,</span><span class="w"> </span><span class="n">process</span><span class="p">,</span><span class="w"> </span><span class="n">rowsCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">SQL_ERROR</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="k">else</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">(</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"process(%d) == rowsCount(%d)"</span><span class="p">,</span><span class="w"> </span><span class="n">process</span><span class="p">,</span><span class="w"> </span><span class="n">rowsCount</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">SQL_SUCCESS</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
|
|
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">batchCount</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">ignoreCount</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">statusptr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_PARAM_UNUSED</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">(</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"statusptr[%d](%d) != SQL_PARAM_UNUSED"</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">statusptr</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">SQL_ERROR</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">statusptr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_PARAM_SUCCESS</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">(</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"statusptr[%d](%d) != SQL_PARAM_SUCCESS"</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">statusptr</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">SQL_ERROR</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
|
|
<span class="w"> </span><span class="n">retcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SQLFreeHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_STMT</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">sprintf</span><span class="p">((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="s">"SQLFreeHandle hstmtinesrt"</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">CHECK_ERROR</span><span class="p">(</span><span class="n">retcode</span><span class="p">,</span><span class="w"> </span><span class="n">loginfo</span><span class="p">,</span><span class="w"> </span><span class="n">hstmtinesrt</span><span class="p">,</span><span class="w"> </span><span class="n">SQL_HANDLE_STMT</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
|
|
|
|
<span class="nl">exit</span><span class="p">:</span>
|
|
<span class="w"> </span><span class="n">printf</span><span class="w"> </span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">Complete.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Connection</span>
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">hdbc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_NULL_HDBC</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">SQLDisconnect</span><span class="p">(</span><span class="n">hdbc</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">SQLFreeHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_DBC</span><span class="p">,</span><span class="w"> </span><span class="n">hdbc</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Environment</span>
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">henv</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">SQL_NULL_HENV</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="n">SQLFreeHandle</span><span class="p">(</span><span class="n">SQL_HANDLE_ENV</span><span class="p">,</span><span class="w"> </span><span class="n">henv</span><span class="p">);</span>
|
|
|
|
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="familylinks">
|
|
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_04_0117.html">ODBC-Based Development</a></div>
|
|
</div>
|
|
</div>
|
|
|