doc-exports/docs/dws/dev/dws_04_0123.html
Lu, Huayi e6fa411af0 DWS DEV 830.201 version
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>
2024-05-16 07:24:04 +00:00

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">&lt;stdlib.h&gt;</span><span class="c1"> </span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span><span class="c1"> </span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;sqlext.h&gt;</span>
<span class="cp">#ifdef WIN32</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;windows.h&gt;</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">&amp;</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">&amp;&amp;</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">&quot;Error AllocHandle</span><span class="se">\n</span><span class="s">&quot;</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">&amp;</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">&amp;&amp;</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 &quot;&quot; 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">&quot;gaussdb&quot;</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">&quot;userName&quot;</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">&quot;password&quot;</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">&amp;&amp;</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">&quot;Error SQLConnect %d</span><span class="se">\n</span><span class="s">&quot;</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">&quot;Connected !</span><span class="se">\n</span><span class="s">&quot;</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">&amp;</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">&quot;drop table IF EXISTS customer_t1&quot;</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">&quot;CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));&quot;</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">&quot;insert into customer_t1 values(25,'li')&quot;</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">&quot;insert into customer_t1 values(?)&quot;</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">&amp;</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">&quot;select id from testtable&quot;</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">&quot;SQLColAtrribute %s</span><span class="se">\n</span><span class="s">&quot;</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">&amp;</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">&amp;</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">&amp;</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">&quot;SQLGetData ----ID = %d</span><span class="se">\n</span><span class="s">&quot;</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">&quot;Done !</span><span class="se">\n</span><span class="s">&quot;</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">&lt;stdio.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdlib.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;sql.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;sqlext.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;string.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;util.c&quot;</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">&amp;</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">&quot;SQLAllocHandle(SQL_HANDLE_STMT)&quot;</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">&quot;SQLPrepare log: %s&quot;</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">&quot;SQLExecute stmt log: %s&quot;</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">&quot;SQLFreeHandle stmt log: %s&quot;</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">&quot;Please input your DSN&quot;</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">&quot;batchCount&quot;</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</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">&quot;ignoreCount&quot;</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</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">&gt;</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">&quot;ignoreCount(%d) should be less than batchCount(%d)</span><span class="se">\n</span><span class="s">&quot;</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">&gt;</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">&amp;</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">&quot;SQLAllocHandle(SQL_HANDLE_ENV)&quot;</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">&quot;SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)&quot;</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">&amp;</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">&quot;SQLAllocHandle(SQL_HANDLE_DBC)&quot;</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">&quot;SQLSetConnectAttr(SQL_LOGIN_TIMEOUT)&quot;</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">&quot;SQLSetConnectAttr(SQL_ATTR_AUTOCOMMIT)&quot;</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">&quot;SQLConnect(DSN:%s)&quot;</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">&quot;drop table if exists test_odbc_batch_insert&quot;</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">&quot;create table test_odbc_batch_insert(id int primary key, col varchar2(50))&quot;</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">&quot;FAILED:</span><span class="se">\t</span><span class="s">malloc data memory failed</span><span class="se">\n</span><span class="s">&quot;</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">&lt;</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">&quot;column test value %d&quot;</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">&lt;</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">&amp;</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">&quot;SQLAllocHandle(SQL_HANDLE_STMT)&quot;</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">&quot;insert into test_odbc_batch_insert values(?, ?)&quot;</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">&quot;SQLPrepare log: %s&quot;</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">&quot;SQLSetStmtAttr&quot;</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">&amp;</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">&quot;SQLBindParameter for id&quot;</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">&quot;SQLBindParameter for cols&quot;</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">&amp;</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">&quot;SQLSetStmtAttr for SQL_ATTR_PARAMS_PROCESSED_PTR&quot;</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">&quot;SQLSetStmtAttr for SQL_ATTR_PARAM_STATUS_PTR&quot;</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">&quot;SQLSetStmtAttr for SQL_ATTR_PARAM_OPERATION_PTR&quot;</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">&quot;SQLExecute stmt log: %s&quot;</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">&amp;</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">&quot;SQLRowCount execution&quot;</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">&quot;(batchCount - ignoreCount)(%d) != rowsCount(%d)&quot;</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">&quot;(batchCount - ignoreCount)(%d) == rowsCount(%d)&quot;</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">&quot;process(%d) != rowsCount(%d)&quot;</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">&quot;process(%d) == rowsCount(%d)&quot;</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">&lt;</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">&lt;</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">&quot;statusptr[%d](%d) != SQL_PARAM_UNUSED&quot;</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">&quot;statusptr[%d](%d) != SQL_PARAM_SUCCESS&quot;</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">&quot;SQLFreeHandle hstmtinesrt&quot;</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">&quot;</span><span class="se">\n</span><span class="s">Complete.</span><span class="se">\n</span><span class="s">&quot;</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>