
# 执行SQL语句
为了执行SQL语句，ODBC提供一组专门的API，并在[表1]中集中列出了相关API并进行了说明。这些API覆盖了SQL的预处理、参数绑定、直接执行以及语句属性设置等功能，是应用程序与数据库进行指令交互的核心接口。
 表1相关API说明 
| **功能**           | **API**                                                                                               |
|:---|:---|
| 设置语句属性           | [SQLSetStmtAttr](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/gaussdb-42-0171.html)   |
| 为执行SQL语句做准备      | [SQLPrepare](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/gaussdb-42-0166.html)       |
| 执行一条准备好的SQL语句    | [SQLExecute](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/gaussdb-42-0160.html)       |
| 绑定SQL语句的参数标志和缓冲区 | [SQLBindParameter](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/gaussdb-42-0155.html) |
| 直接执行SQL语句        | [SQLExecDirect](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/gaussdb-42-0159.html)    |
   
![](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- ODBC为应用程序与数据库的中心层，负责把应用程序发出的SQL指令传到数据库当中，自身并不解析SQL语法。故在应用程序中写入带有保密信息的SQL语句时（如明文密码），保密信息会被暴露在驱动日志中。
- 数据库中收到的一次执行请求（不在事务块中），如果含有多条语句，将会被打包成一个事务，如果其中有一个语句失败，那么整个请求都将会被回滚。
- 关闭事务自动提交后，需要显式手动提交事务，否则可能引发问题。例如，执行SELECT语句时会隐式开启事务，如果不手动提交，该隐式事务将无法正常结束，演变为长事务，导致一系列潜在问题。
 
示例如下（完整示例请参考[获取和处理数据库中的数据](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/gaussdb-42-0145.html)）：
```
// 申请语句句柄。
SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);  
// 设置语句属性。
SQLSetStmtAttr(V_OD_hstmt, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER *)3, 0);
// 直接执行SQL语句。
SQLExecDirect(V_OD_hstmt, "drop table IF EXISTS customer_t1", SQL_NTS);
SQLExecDirect(V_OD_hstmt, "CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));", SQL_NTS);
SQLExecDirect(V_OD_hstmt, "insert into customer_t1 values(25, 'li')", SQL_NTS);
// 准备执行。
SQLPrepare(V_OD_hstmt, "insert into customer_t1 values(?)", SQL_NTS);
// 绑定参数。
SQLBindParameter(V_OD_hstmt,1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0,
   &value, 0, NULL);
// 执行准备好的语句。
SQLExecute(V_OD_hstmt);      SQLExecDirect(V_OD_hstmt, "select c_customer_sk from customer_t1", SQL_NTS);
```
