`

有关prepare statement在ODBC、JDBC、ADO.NET上的对比使用(以DB2为例)

 
阅读更多

参数标记的概述

对于需要执行多次的 SQL 语句,通常准备 SQL 语句一次并通过在运行时期间使用参数标记来替换输入值以重复使用查询方案比较好。

在 DB2 Everyplace 中,参数标记由“?”字符表示并指示在 SQL 语句中的何处替换应用程序变量。参数标记将按编号引用,且它们是从左至右连续编号的(从 1 开始)。在执行 SQL 语句之前,应用程序必须将变量存储区绑定至在 SQL 语句中指定的每个参数标记。此外,绑定变量必须是有效的存储区且在对数据库执行准备语句时必须包含输入数据值。

以下示例演示包含两个参数标记的 SQL 语句。

SELECT * FROM customers WHERE custid = ? AND lastname = ?

参数标记使用的示例

DB2 Everyplace 提供一组丰富的标准接口(包括 CLI/ODBC、JDBC 和 ADO.NET)以有效地存取数据。以下示例代码片段显示将带有参数标记的准备语句用于每个数据存取 API 的情况。

考虑表 t1 的以下表模式,其中列 c1 是表 t1 的主键。

表 1. 示例表模式

列名 DB2 Everyplace 数据类型 可空
c1 INTEGER false
c2 SMALLINT true
c3 CHAR(20) true
c4 VARCHAR(20) true
c5 DECIMAL(8,2) true
c6 DATE true
c7 TIME true
c8 TIMESTAMP true
c9 BLOB(30) true

以下示例演示如何使用准备语句将一行插入表 t1 中。

CLI 示例

void parameterExample1(void)
{
   SQLHENV henv;
   SQLHDBC hdbc;
   SQLHSTMT hstmt;
   SQLRETURN rc;
   TCHAR server[] = _T("C://mysample//");
   TCHAR uid[] = _T("db2e");
   TCHAR pwd[] = _T("db2e");
   long p1 = 10;
   short p2 = 100;
   TCHAR p3[100];
   TCHAR p4[100];
   TCHAR p5[100];
   TCHAR p6[100];
   TCHAR p7[100];
   TCHAR p8[100];
   char  p9[100];
   long len = 0;
 
   _tcscpy(p3, _T("data1"));
   _tcscpy(p4, _T("data2"));
   _tcscpy(p5, _T("10.12"));
   _tcscpy(p6, _T("2003-06-30"));
   _tcscpy(p7, _T("12:12:12"));
   _tcscpy(p8, _T("2003-06-30-17.54.27.710000"));
 
   memset(p9, 0, sizeof(p9));
   p9[0] = 'X';
   p9[1] = 'Y';
   p9[2] = 'Z';
 
   rc = SQLAllocEnv(&henv);
   // check return code ...
 
   rc = SQLAllocConnect(henv, &hdbc);
   // check return code ...
 
   rc = SQLConnect(hdbc, (SQLTCHAR*)server, SQL_NTS,
				(SQLTCHAR*)uid, SQL_NTS, (SQLTCHAR*)pwd, SQL_NTS);
   // check return code ...
 
   rc = SQLAllocStmt(hdbc, &hstmt);
   // check return code ...
 
   // prepare the statement
   rc = SQLPrepare(hstmt, _T("INSERT INTO t1 VALUES (?,?,?,?,?,?,?,?,?)"), SQL_NTS);
   // check return code ...
 
   // bind input parameters
   rc = SQLBindParameter(hstmt, (unsigned short)1, SQL_PARAM_INPUT,
							SQL_C_LONG, SQL_INTEGER, 4, 0, &p1, sizeof(p1), &len);
   // check return code ...
 
   rc = SQLBindParameter(hstmt, (unsigned short)2, SQL_PARAM_INPUT, SQL_C_LONG,
							SQL_SMALLINT, 2, 0, &p2, sizeof(p2), &len);
   // check return code ...
 
   len = SQL_NTS;
   rc = SQLBindParameter(hstmt, (unsigned short)3, SQL_PARAM_INPUT, SQL_C_TCHAR,
							SQL_CHAR, 0, 0, &p3[0], 100, &len);
   // check return code ...
 
   rc = SQLBindParameter(hstmt, (unsigned short)4, SQL_PARAM_INPUT, SQL_C_TCHAR,
							SQL_VARCHAR, 0, 0, &p4[0], 100, &len);
   // check return code ...
 
   rc = SQLBindParameter(hstmt, (unsigned short)5, SQL_PARAM_INPUT, SQL_C_TCHAR,
							SQL_DECIMAL, 8, 2, &p5[0], 100, &len);
   // check return code ...
 
   rc = SQLBindParameter(hstmt, (unsigned short)6, SQL_PARAM_INPUT, SQL_C_TCHAR,
							SQL_TYPE_DATE, 0, 0, &p6[0], 100, &len);
   // check return code ...
 
   rc = SQLBindParameter(hstmt, (unsigned short)7, SQL_PARAM_INPUT, SQL_C_TCHAR,
							SQL_TYPE_TIME, 0, 0, &p7[0], 100, &len);
   // check return code ...
 
   rc = SQLBindParameter(hstmt, (unsigned short)8, SQL_PARAM_INPUT, SQL_C_TCHAR,
							SQL_TYPE_TIMESTAMP, 0, 0, &p8[0], 100, &len);
   // check return code ...
 
   len = 3;
   rc = SQLBindParameter(hstmt, (unsigned short)9, SQL_PARAM_INPUT, SQL_C_BINARY,
							SQL_BINARY, 0, 0, &p9[0], 100, &len);
   // check return code ...
 
   // execute the prepared statement
   rc = SQLExecute(hstmt);
   // check return code ...
 
   rc = SQLFreeStmt(hstmt, SQL_DROP);
   // check return code ...
 
   rc = SQLDisconnect(hdbc);
   // check return code ...
 
   rc = SQLFreeConnect(hdbc);
   // check return code ...
 
   rc = SQLFreeEnv(henv);
   // check return code ...
 
}
 
 

JDBC 示例

public static void parameterExample1() {
 
   String driver = "com.ibm.db2e.jdbc.DB2eDriver";
   String url    = "jdbc:db2e:mysample";
   Connection conn = null;
   PreparedStatement pstmt = null;
 
 try
   {
      Class.forName(driver);
 
      conn = DriverManager.getConnection(url);
 
      // prepare the statement
      pstmt = conn.prepareStatement("INSERT INTO t1 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
 
      // bind the input parameters
      pstmt.setInt(1, 1);
      pstmt.setShort(2, (short)2);
      pstmt.setString(3, "data1");
      pstmt.setString(4, "data2");
      pstmt.setBigDecimal(5, new java.math.BigDecimal("12.34"));
      pstmt.setDate(6, new java.sql.Date(System.currentTimeMillis() ) );
      pstmt.setTime(7,  new java.sql.Time(System.currentTimeMillis() ) );
      pstmt.setTimestamp (8,  new java.sql.Timestamp(System.currentTimeMillis() ) );
      pstmt.setBytes(9, new byte[] { (byte)'X', (byte)'Y', (byte)'Z' } );
 
      // execute the statement
      pstmt.execute();
 
      pstmt.close();
 
      conn.close();
   }
        catch (SQLException sqlEx)
   {
            while(sqlEx !=null)
      {
                System.out.println("SQLERROR:/n"+sqlEx.getErrorCode()+
                    ",SQLState:"+sqlEx.getSQLState()+
                    ",Message:"+sqlEx.getMessage()+
                    ",Vendor:"+sqlEx.getErrorCode());
                sqlEx =sqlEx.getNextException();
      }
   }
        catch (Exception ex)
   {
            ex.printStackTrace();
   }
}
 
 

ADO.NET 示例

[C#]

public static void ParameterExample1()
{
   DB2eConnection conn = null;
   DB2eCommand cmd  = null;
   String connString   = @"database=./; uid=db2e; pwd=db2e";
   int i = 1;
 
 try
   {
      conn = new DB2eConnection(connString);
 
      conn.Open();
 
      cmd = new DB2eCommand("INSERT INTO t1 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", conn);
 
      // prepare the command
      cmd.Prepare();
 
      // bind the input parameters
      DB2eParameter p1 = new DB2eParameter("@p1", DB2eType.Integer);
      p1.Value = ++i;
      cmd.Parameters.Add(p1);
 
      DB2eParameter p2 = new DB2eParameter("@p2", DB2eType.SmallInt);
      p2.Value = 100;
      cmd.Parameters.Add(p2);
 
      DB2eParameter p3 = new DB2eParameter("@p3", DB2eType.Char);
      p3.Value = "data1";
      cmd.Parameters.Add(p3);
 
      DB2eParameter p4 = new DB2eParameter("@p4", DB2eType.VarChar);
      p4.Value = "data2";
      cmd.Parameters.Add(p4);
 
      DB2eParameter p5 = new DB2eParameter("@p5", DB2eType.Decimal);
      p5.Value = 20.25;
      cmd.Parameters.Add(p5);
 
      DB2eParameter p6 = new DB2eParameter("@p6", DB2eType.Date);
      p6.Value = DateTime.Now;
      cmd.Parameters.Add(p6);
 
      DB2eParameter p7 = new DB2eParameter("@p7", DB2eType.Time);
      p7.Value = new TimeSpan(23, 23, 23);
      cmd.Parameters.Add(p7);
 
      DB2eParameter p8 = new DB2eParameter("@p8", DB2eType.Timestamp);
      p8.Value = DateTime.Now;
      cmd.Parameters.Add(p8);
 
      byte []barr = new byte[3];
      barr[0] = (byte)'X';
      barr[1] = (byte)'Y';
      barr[2] = (byte)'Z';
 
      DB2eParameter p9 = new DB2eParameter("@p9", DB2eType.Blob);
      p9.Value = barr;
      cmd.Parameters.Add(p9);
 
      // execute the prepared command
      cmd.ExecuteNonQuery();
   }
   catch (DB2eException e1)
   {
      for (int i=0; i < e1.Errors.Count; i++)
      {
         Console.WriteLine("Error #" + i + "/n" +
            "Message: " + e1.Errors[i].Message + "/n" +
            "Native: " + e1.Errors[i].NativeError.ToString() + "/n" +
            "SQL: " + e1.Errors[i].SQLState + "/n");
      }
   }
   catch (Exception e2)
   {
       Console.WriteLine(e2.Message);
   }
     finally
   {
      if (conn != null && conn.State != ConnectionState.Closed)
      {
            conn.Close();
            conn = null;
      }
   }
}
分享到:
评论

相关推荐

    JDBC(用PrepareStatement实现)

    用JDBC实现Java与数据库的连接,该文件使用PrepareStatement实现。

    prepareStatement和Statement的区别

    prepareStatement和Statement的区别 prepareStatement和Statement是 Java 中两个常用的数据库操作接口,它们都可以用来执行 SQL 语句,但是它们之间有着明显的区别。 首先,从创建时的区别开始,Statement 需要...

    java数据库连接PrepareStatement

    java数据库连接PrepareStatement

    利用JDBC的PrepareStatement打印真实SQL的方法详解

    PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程,下面这篇文章主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的方法,需要的朋友可以参考借鉴,下面来一起看看吧。

    JDBC PrepareStatement 使用(附各种场景 demo)

    该资源中包含 JDBC 连接 MySQL 完整代码、常规 select、update 语句完整代码,以及 JDBC 批量处理数据的几种不同方式完整代码,且附带 使用说明!

    .net性能优化宝典

    2.3.2 使用Prepare. 19 2.3.3 使用绑定变量 ★... 19 2.4 DataReader 20 2.4.1 显式关闭DataReader 20 2.4.2 用索引号访问代替名称索引号访问属性... 20 2.4.3 使用类型化方法访问属性... 20 2.4.4 使用多数据...

    Spring Data JDBC与JDBC的区别

    JDBC规范  ... PrepareStatement:预编译语句,性能更好  CallableStatement:调用存储过程  ResultSet:结果集,封装了多条记录  JDBC数据库连接池/Connection Pool  DBCP:apache tomcat内置  

    JDBC详解HTML-JDBC.pp

    &lt;3&gt;.JDBC网络纯java驱动程序:将JDBC转换为与DBMS无关的网络协议,又被某服务器转换为一种DBMS 协议,以操作各种数据库 &lt;4&gt;.本地协议纯java驱动程序:将JDBC调用直接转换成JDBC所使用的网络协议 2、JDBC操作基本...

    06丨数据库原理:为什么PrepareStatement性能更好更安全?.pdf

    数据库原理:为什么PrepareStatement性能更好更安全

    java连接odbc

    * `PreparedStatement` 对象:用于执行参数化的 SQL 语句,可以使用 `Connection.prepareStatement(String sql)` 方法创建,例如: ```java PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users...

    踩踩踩JDBC六大步骤

    PrepareStatement: conn.prepareStatement(String sql); CallableStatement: conn.prepareCall(String sql); 4)执行sql语句 stmt.execute(sql); stmt.executeUpdate(sql); stmt.executeQuery(sql); pstmt.execute*...

    jdbc-odbc的基本操作

    String dbUrl = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+dbPath; cn = DriverManager.getConnection(dbUrl); pstmt = cn.prepareStatement("select PCity from shouji where ?=PhoneNo"); ...

    亮剑.NET深入体验与实战精要2

    本书适合于.NET初、中级开发人员参考学习,特别有助于.NET从业者进入实战层次,也可作为相关培训机构的参考教材,还可以作为高等院校相关专业师生的参考书。 目录 第1篇 技术基础总结 第1章 .NET,你真的知道了吗 3 ...

    MySQL prepare语句的SQL语法

    MySQL prepare语法: PREPARE statement_name FROM preparable_SQL_statement; /*定义*/ EXECUTE statement_name [USING @var_name [, @var_name] …]; /*执行预处理语句*/ {DEALLOCATE | DROP} PREPARE statement_...

    亮剑.NET深入体验与实战精要3

    本书适合于.NET初、中级开发人员参考学习,特别有助于.NET从业者进入实战层次,也可作为相关培训机构的参考教材,还可以作为高等院校相关专业师生的参考书。 目录 第1篇 技术基础总结 第1章 .NET,你真的知道了吗 3 ...

    prepare cashflow_cashflow_statement_

    Do you know how to prepare a cashflow statement?

    db2 数控jar包

    private static String user = "db2admin"; private static String password = "123";... pst = conn.prepareStatement(sql); pst.executeUpdate(); pst.close(); }catch (Exception e) { } }

    Mastering .NET Machine Learning(PACKT,2016)

    You will begin with an introduction to F# and prepare yourselves for machine learning using the .NET Framework. You will then learn how to write a simple linear regression model and, forming a base ...

    logstash-output-jdbc.zip

    在一个联网的虚拟机上下载好插件 ./logstash-plugin install logstash-input-jdbc 查看插件是否安装 ./logstash-plugin list 打包下载好的插件(可能会有错误;多试几次) ./logstash-plugin prepare-offline-...

    MCAD/MCSD Self-Paced Training Kit: Developing Windows-Based Applications with Microsoft Visual Basic .NET and Microsoft Visual C# .NET, Second Edition

    About the Book &lt;br/&gt;Real-world developer training for results on the job—and on the exam. &lt;br/&gt;Build real-world programming skills—and prepare for MCP Exams 70-306 and 70-316—with this ...

Global site tag (gtag.js) - Google Analytics