`
iihero
  • 浏览: 259910 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有关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;
      }
   }
}
分享到:
评论

相关推荐

    Ado.Net记事本程序

    Ado.Net记事本程序是一款基于Microsoft Visual Studio 2003开发的文本编辑应用程序,它结合了Ado.Net技术,使得程序能够处理数据库相关的功能。Ado.Net是.NET框架的一部分,专门用于处理数据访问,提供了高效、可靠...

    ADO.NET数据库编程

    - **XML支持**:ADO.NET使用XML作为数据交换格式,允许数据在应用程序之间或跨平台进行无损传输。 - **断开连接模式**:DataSet对象使得数据可以在与数据库断开连接的情况下进行操作,提高了应用程序的效率和灵活...

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

    在使用JDBC和PrepareStatement时,别忘了关闭资源,例如ResultSet、Statement和Connection,以避免内存泄漏。可以使用try-with-resources语句来确保资源的正确关闭。 这个资源提供的示例代码将帮助开发者深入理解...

    Ado.Net完全攻略

    14. **Entity Framework**:作为现代的ORM(对象关系映射)框架,Entity Framework构建在ADO.NET之上,简化了数据库访问,使得开发者可以使用C#或VB.NET的对象模型来操作数据。 通过深入学习和实践以上知识点,你...

    ADO.NET 本质论(PDG)

    在这个"ADO.NET 本质论(PDG)"中,我们将深入探讨ADO.NET的核心概念、架构以及使用方法。 1. **核心组件** - **DataSet**: DataSet是ADO.NET中的离线数据存储,它可以在应用程序内存中存储来自不同数据源的数据,并...

    JDBC(用PrepareStatement实现)

    **JDBC(用PrepareStatement实现)** Java Database Connectivity (JDBC) 是Java平台中的一个标准API,用于在Java应用程序和各种数据库之间建立桥梁。它允许Java开发者执行SQL语句,进行数据查询、更新和删除等操作。...

    prepareStatement和Statement的区别

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

    ADO.NET数据库增删改查.zip

    在标题提及的"ADO.NET数据库增删改查.zip"压缩包中,我们可能找到了一系列关于如何在C#中使用ADO.NET进行数据库操作的示例代码。以下是对这些关键知识点的详细解释: 1. **SqlConnection**:这是ADO.NET中连接到SQL...

    ADO.NET最佳实践技巧

    ADO.NET是微软.NET框架的一部分,它提供了一组用于与数据源交互的库,包括数据库连接、数据读取器、数据适配器、数据集和数据表等组件。本篇文章将深入探讨ADO.NET的最佳实践技巧,帮助开发者提升代码的效率、稳定性...

    SQLite ADO.net

    综上所述,SQLite ADO.NET为.NET开发者提供了一个简单、高效的途径来操作SQLite数据库,适用于桌面应用、移动应用或轻量级Web应用。结合readme.htm、bin和Doc目录中的文档,可以深入学习和了解SQLite ADO.NET的具体...

    .net连接DB2数据库编程简介

    在.NET环境中连接到DB2数据库是一项常见的任务,尤其对于开发跨平台的企业级应用程序而言。本文将详细介绍如何使用.NET Framework和IBM Data Provider for .NET来实现这一目标,以及相关的编程概念和示例。 首先,...

    DB2的JDBC驱动

    DB2的JDBC驱动是IBM公司为连接到DB2数据库而设计的一种Java数据库连接(JDBC)驱动程序。它是Java应用程序与DB2数据库之间通信的关键组件,使得开发人员能够使用Java语言来执行SQL语句、处理结果集以及管理数据库...

    DB2JDBC JAR包

    在实际使用中,为了使用DB2JDBC JAR包,开发者需要完成以下步骤: 1. 将`db2jcc4.jar`添加到项目的类路径(ClassPath)中,这样Java虚拟机在运行时就能找到所需的驱动。 2. 创建数据库连接:使用`java.sql....

    java数据库连接PrepareStatement

    在 Java 的数据库编程中,`PreparedStatement` 是一个非常重要的类,它继承自 `Statement` 类,并提供了更高级的功能来处理 SQL 语句,尤其是在处理参数化查询时更为高效和安全。下面我们将详细介绍 `...

    连接DB2包,DB2与JAVA连接驱动,JDBC驱动

    本文将详细讲解如何在Java中配置和使用DB2的JDBC驱动,以及相关的连接步骤。 1. **JDBC驱动类型**: JDBC驱动分为四种类型:Type 1、Type 2、Type 3和Type 4。对于DB2,我们通常使用Type 4驱动,这是一种纯Java...

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

    PreparedStatement ps = connection.prepareStatement(sql); ps.setInt(1, 10); ``` 在这个例子中,我们想知道实际执行的SQL语句是"SELECT * FROM table WHERE id = 10"。为了实现这个需求,我们可以自定义一个辅助...

    sqlite+.net4.0

    本压缩包文件"sqlite+4.0"包含了在.NET 4.0中使用SQLite所需的一些关键组件和库。 首先,SQLite 的.NET绑定允许.NET开发者通过.NET Framework 4.0访问SQLite数据库。这些绑定通常由SQLite-System.Data.SQLite或...

    jdbc.rar_java jdbc_java 数据库 连接_jdbc_jdbc-odbc_数据 插入 删除

    以MySQL为例,你需要将`mysql-connector-java.jar`文件添加到项目的类路径中。 接下来,我们来看如何建立数据库连接。JDBC提供了一个`DriverManager`类,它包含了一系列静态方法用于管理数据库驱动程序和数据库的...

    jdbc使用参考手册

    ** JDBC使用参考手册详解 ** Java Database Connectivity (JDBC) 是Java编程语言中用于与数据库交互的一组标准API。这个英文版的JDBC使用参考...这份英文版的JDBC使用参考手册将为你的数据库编程之路提供详尽的指导。

    mysql .net 连接驱动

    它允许.NET应用程序使用标准的ADO.NET接口来执行SQL查询、管理数据和处理MySQL服务器的各种任务。以下将详细介绍MySQL .NET连接驱动及其相关组件。 1. **MySQL Connector/NET** MySQL Connector/NET是Oracle公司为...

Global site tag (gtag.js) - Google Analytics