C#打造自己通用的数据库访问类解析

C#打造自己通用的数据库访问类解析
C#打造自己通用的数据库访问类解析

C#打造自己通用的数据库访问类

using System;

using System.Collections.Generic;

using System.Data;

using https://www.360docs.net/doc/cf9828480.html,mon;

namespace NetSkycn.Data

{

///

/// 通用数据库访问类,封装了对数据库的常见操作

/// 作者:周公

/// 创建日期:2011-07-18

/// 修改日期:2012-04-12

/// 新浪微博地址:https://www.360docs.net/doc/cf9828480.html,/zhoufoxcn

///

public sealed class DbUtility

{

public string ConnectionString { get; set; }

private DbProviderFactory providerFactory;

///

/// 构造函数

///

/// 数据库连接字符串

/// 数据库类型枚举,参见

public DbUtility(string connectionString, DbProviderType providerType)

{

ConnectionString = connectionString;

providerFactory = ProviderFactory.GetDbProviderFactory(providerType);

if (providerFactory == null)

{

throw new ArgumentException("Can't load DbProviderFactory for given value of providerType");

}

}

///

/// 对数据库执行增删改操作,返回受影响的行数。

///

/// 要执行的增删改的SQL语句

/// 执行增删改语句所需要的参数

///

public int ExecuteNonQuery(string sql, IList parameters)

{

return ExecuteNonQuery(sql, parameters, CommandType.Text);

}

///

/// 对数据库执行增删改操作,返回受影响的行数。

///

/// 要执行的增删改的SQL语句

/// 执行增删改语句所需要的参数

/// 执行的SQL语句的类型

///

public int ExecuteNonQuery(string sql, IList parameters, CommandType commandType)

{

using (DbCommand command = CreateDbCommand(sql, parameters, commandType))

{

command.Connection.Open();

int affectedRows = command.ExecuteNonQuery();

command.Connection.Close();

return affectedRows;

}

}

///

/// 执行一个查询语句,返回一个关联的DataReader实例

///

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

///

public DbDataReader ExecuteReader(string sql, IList parameters)

{

return ExecuteReader(sql, parameters, CommandType.Text);

}

///

/// 执行一个查询语句,返回一个关联的DataReader实例

///

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

/// 执行的SQL语句的类型

///

public DbDataReader ExecuteReader(string sql, IList parameters, CommandType commandType)

{

DbCommand command = CreateDbCommand(sql, parameters, commandType);

command.Connection.Open();

return command.ExecuteReader(CommandBehavior.CloseConnection);

}

///

/// 执行一个查询语句,返回一个包含查询结果的DataTable

///

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

///

public DataTable ExecuteDataTable(string sql, IList parameters)

{

return ExecuteDataTable(sql, parameters, CommandType.Text);

}

///

/// 执行一个查询语句,返回一个包含查询结果的DataTable

///

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

/// 执行的SQL语句的类型

///

public DataTable ExecuteDataTable(string sql, IList parameters, CommandType commandType)

{

using (DbCommand command = CreateDbCommand(sql, parameters, commandType))

{

using (DbDataAdapter adapter = providerFactory.CreateDataAdapter())

{

adapter.SelectCommand = command;

DataTable data = new DataTable();

adapter.Fill(data);

return data;

}

}

}

///

/// 执行一个查询语句,返回查询结果的第一行第一列

///

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

///

public Object ExecuteScalar(string sql, IList parameters)

{

return ExecuteScalar(sql, parameters, CommandType.Text);

}

///

/// 执行一个查询语句,返回查询结果的第一行第一列

///

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

/// 执行的SQL语句的类型

///

public Object ExecuteScalar(string sql, IList parameters, CommandType commandType)

{

using (DbCommand command = CreateDbCommand(sql, parameters, commandType))

{

command.Connection.Open();

object result = command.ExecuteScalar();

command.Connection.Close();

return result;

}

}

///

/// 查询多个实体集合

///

/// 返回的实体集合类型

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

///

public List QueryForList(string sql, IList parameters) where T : new()

{

return QueryForList(sql, parameters, CommandType.Text);

}

///

/// 查询多个实体集合

///

/// 返回的实体集合类型

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

/// 执行的SQL语句的类型

///

public List QueryForList(string sql, IList parameters, CommandType commandType) where T : new()

{

DataTable data = ExecuteDataTable(sql, parameters, commandType);

return EntityReader.GetEntities(data);

}

///

/// 查询单个实体

///

/// 返回的实体集合类型

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

///

public T QueryForObject(string sql, IList parameters) where T : new()

{

return QueryForObject(sql, parameters, CommandType.Text);

}

///

/// 查询单个实体

///

/// 返回的实体集合类型

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

/// 执行的SQL语句的类型

///

public T QueryForObject(string sql, IList parameters, CommandType commandType) where T : new()

{

return QueryForList(sql, parameters, commandType)[0];

}

public DbParameter CreateDbParameter(string name, object value)

{

return CreateDbParameter(name, ParameterDirection.Input, value);

}

public DbParameter CreateDbParameter(string name, ParameterDirection parameterDirection, object value)

{

DbParameter parameter = providerFactory.CreateParameter();

parameter.ParameterName = name;

parameter.Value = value;

parameter.Direction = parameterDirection;

return parameter;

}

///

/// 创建一个DbCommand对象

///

/// 要执行的查询语句

/// 执行SQL查询语句所需要的参数

/// 执行的SQL语句的类型

///

private DbCommand CreateDbCommand(string sql, IList parameters, CommandType commandType)

{

DbConnection connection = providerFactory.CreateConnection();

DbCommand command = providerFactory.CreateCommand();

connection.ConnectionString = ConnectionString;

https://www.360docs.net/doc/cf9828480.html,mandText = sql;

https://www.360docs.net/doc/cf9828480.html,mandType = commandType;

command.Connection = connection;

if (!(parameters == null || parameters.Count == 0))

{

foreach (DbParameter parameter in parameters)

{

command.Parameters.Add(parameter);

}

}

return command;

}

}

///

/// 数据库类型枚举

///

public enum DbProviderType : byte

{

SqlServer,

MySql,

SQLite,

Oracle,

ODBC,

OleDb,

Firebird,

PostgreSql,

DB2,

Informix,

SqlServerCe

}

///

/// DbProviderFactory工厂类

///

public class ProviderFactory

{

private static Dictionary providerInvariantNames = new Dictionary();

private static Dictionary providerFactoies = new Dictionary(20);

static ProviderFactory()

{

//加载已知的数据库访问类的程序集

providerInvariantNames.Add(DbProviderType.SqlServer,

"System.Data.SqlClient");

providerInvariantNames.Add(DbProviderType.OleDb, "System.Data.OleDb");

providerInvariantNames.Add(DbProviderType.ODBC, "System.Data.ODBC");

providerInvariantNames.Add(DbProviderType.Oracle,

"Oracle.DataAccess.Client");

providerInvariantNames.Add(DbProviderType.MySql,

"MySql.Data.MySqlClient");

providerInvariantNames.Add(DbProviderType.SQLite, "System.Data.SQLite");

providerInvariantNames.Add(DbProviderType.Firebird,

"FirebirdSql.Data.Firebird");

providerInvariantNames.Add(DbProviderType.PostgreSql, "Npgsql");

providerInvariantNames.Add(DbProviderType.DB2, "IBM.Data.DB2.iSeries");

providerInvariantNames.Add(https://www.360docs.net/doc/cf9828480.html,rmix, "https://www.360docs.net/doc/cf9828480.html,rmix");

providerInvariantNames.Add(DbProviderType.SqlServerCe,

"System.Data.SqlServerCe");

}

///

/// 获取指定数据库类型对应的程序集名称

///

/// 数据库类型枚举

///

public static string GetProviderInvariantName(DbProviderType providerType)

{

return providerInvariantNames[providerType];

}

///

/// 获取指定类型的数据库对应的DbProviderFactory

///

/// 数据库类型枚举

///

public static DbProviderFactory GetDbProviderFactory(DbProviderType providerType)

{

//如果还没有加载,则加载该DbProviderFactory

if (!providerFactoies.ContainsKey(providerType))

{

providerFactoies.Add(providerType,

ImportDbProviderFactory(providerType));

}

return providerFactoies[providerType];

}

///

/// 加载指定数据库类型的DbProviderFactory

///

/// 数据库类型枚举

///

private static DbProviderFactory ImportDbProviderFactory(DbProviderType providerType)

{

string providerName = providerInvariantNames[providerType];

DbProviderFactory factory = null;

try

{

//从全局程序集中查找

factory = DbProviderFactories.GetFactory(providerName);

}

catch (ArgumentException e)

{

factory = null;

}

return factory;

}

}

}

using System;

using System.Collections.Generic;

using System.Data;

using https://www.360docs.net/doc/cf9828480.html,mon;

using System.Reflection;

namespace NetSkycn.Data

{

///

/// 实体阅读器类,可以从DataTable中或者DbDataReader的实例中将数据转换成对应的示例

/// 作者:周公

/// 创建日期:2011-07-21

/// 修改日期:2012-04-12

/// 新浪微博地址:https://www.360docs.net/doc/cf9828480.html,/zhoufoxcn

///

public sealed class EntityReader

{

private const BindingFlags BindingFlag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

//将类型与该类型所有的可写且未被忽略属性之间建立映射

private static Dictionary> propertyMappings = new Dictionary>();

///

/// 将DataTable中的所有数据转换成List>T<集合

///

/// DataTable中每条数据可以转换的数据类型

/// 包含有可以转换成数据类型T的数据集合

///

public static List GetEntities(DataTable dataTable) where T : new()

{

if (dataTable == null)

{

throw new ArgumentNullException("dataTable");

}

//如果T的类型满足以下条件:字符串、ValueType或者是Nullable

if (typeof(T) == typeof(string)||typeof(T)==typeof(byte[])|| typeof(T).IsValueType)

{

return GetSimpleEntities(dataTable);

}

else

{

return GetComplexEntities(dataTable);

}

}

///

/// 将DbDataReader中的所有数据转换成List>T<集合

///

/// DbDataReader中每条数据可以转换的数据类型

/// 包含有可以转换成数据类型T的DbDataReader实例

///

public static List GetEntities(DbDataReader reader) where T : new()

{

List list = new List();

if (reader == null)

{

throw new ArgumentNullException("reader");

}

//如果T的类型满足以下条件:字符串、ValueType或者是Nullable

if (typeof(T) == typeof(string) || typeof(T).IsValueType)

{

return GetSimpleEntities(reader);

}

else

{

return GetComplexEntities(reader);

}

}

///

/// 从DataTable中将每一行的第一列转换成T类型的数据

///

/// 要转换的目标数据类型

/// 包含有可以转换成数据类型T的数据集合

///

private static List GetSimpleEntities(DataTable dataTable) where T : new()

{

List list = new List();

foreach (DataRow row in dataTable.Rows)

{

list.Add((T)GetV alueFromObject(row[0], typeof(T)));

}

return list;

}

///

/// 将指定的Object 的值转换为指定类型的值。

///

/// 实现IConvertible 接口的Object,或者为null

/// 要转换的目标数据类型

///

private static object GetValueFromObject(object value, Type targetType)

{

if (targetType == typeof(string))//如果要将value转换成string类型

{

return GetString(value);

}

else if(targetType==typeof(byte[]))//如果要将value转换成byte[]类型

{

return GetBinary(value);

}

else if (targetType.IsGenericType)//如果目标类型是泛型

{

return GetGenericV alueFromObject(value, targetType);

}

else//如果是基本数据类型(包括数值类型、枚举和Guid)

{

return GetNonGenericValueFromObject(value, targetType);

}

}

///

/// 从DataTable中读取复杂数据类型集合

///

/// 要转换的目标数据类型

/// 包含有可以转换成数据类型T的数据集合

///

private static List GetComplexEntities(DataTable dataTable) where T : new()

{

if (!propertyMappings.ContainsKey(typeof(T)))

{

GenerateTypePropertyMapping(typeof(T));

}

List list = new List();

Dictionary properties = propertyMappings[typeof(T)];

T t;

foreach (DataRow row in dataTable.Rows)

{

t = new T();

foreach (KeyValuePair item in properties)

{

//如果对应的属性名出现在数据源的列中则获取值并设置给对应的属性

if (row[item.Key] != null)

{

item.Value.SetValue(t, GetValueFromObject(row[item.Key], item.Value.PropertyType), null);

}

}

list.Add(t);

}

return list;

}

///

/// 从DbDataReader的实例中读取复杂的数据类型

///

/// 要转换的目标类

/// DbDataReader的实例

///

private static List GetComplexEntities(DbDataReader reader) where T : new()

{

if (!propertyMappings.ContainsKey(typeof(T)))//检查当前是否已经有该类与类的可写属性之间的映射

{

GenerateTypePropertyMapping(typeof(T));

}

List list = new List();

Dictionary properties = propertyMappings[typeof(T)];

T t;

while (reader.Read())

{

t = new T();

foreach (KeyValuePair item in properties)

{

//如果对应的属性名出现在数据源的列中则获取值并设置给对应的属性

if (reader[item.Key] != null)

{

item.Value.SetValue(t, GetValueFromObject(reader[item.Key], item.Value.PropertyType), null);

}

}

list.Add(t);

}

return list;

}

///

/// 从DbDataReader的实例中读取简单数据类型(String,ValueType)

///

/// 目标数据类型

/// DbDataReader的实例

///

private static List GetSimpleEntities(DbDataReader reader)

{

List list = new List();

while (reader.Read())

{

list.Add((T)GetV alueFromObject(reader[0], typeof(T)));

}

return list;

}

///

/// 将Object转换成字符串类型

///

/// object类型的实例

///

private static object GetString(object value)

{

return Convert.ToString(value);

}

///

/// 将指定的Object 的值转换为指定枚举类型的值。

///

/// 实现IConvertible 接口的Object,或者为null ///

///

private static object GetEnum(object value, Type targetType)

{

return Enum.Parse(targetType, value.ToString());

}

///

/// 将指定的Object 的值转换为指定枚举类型的值。

///

/// 实现IConvertible 接口的Object,或者为null ///

private static object GetBoolean(object value)

{

if (value is Boolean)

{

return value;

}

else

{

byte byteValue = (byte)GetByte(value);

if (byteValue == 0)

{

return false;

}

else

{

return true;

}

}

}

///

/// 将指定的Object 的值转换为指定枚举类型的值。

///

/// 实现IConvertible 接口的Object,或者为null ///

private static object GetByte(object value)

{

if (value is Byte)

{

return value;

}

else

{

return byte.Parse(value.ToString());

}

}

///

/// 将指定的Object 的值转换为指定枚举类型的值。

///

/// 实现IConvertible 接口的Object,或者为null ///

private static object GetSByte(object value)

{

if (value is SByte)

{

return value;

}

else

{

return SByte.Parse(value.ToString());

}

}

///

/// 将指定的Object 的值转换为指定枚举类型的值。

///

/// 实现IConvertible 接口的Object,或者为null ///

private static object GetChar(object value)

{

if (value is Char)

{

return value;

}

else

{

return Char.Parse(value.ToString());

}

}

///

/// 将指定的Object 的值转换为指定枚举类型的值。

///

/// 实现IConvertible 接口的Object,或者为null ///

private static object GetGuid(object value)

{

if (value is Guid)

{

return value;

}

else

{

return new Guid(value.ToString());

}

}

///

/// 将指定的Object 的值转换为指定枚举类型的值。

///

/// 实现IConvertible 接口的Object,或者为null

///

private static object GetInt16(object value)

{

if (value is Int16)

{

return value;

}

else

{

return Int16.Parse(value.ToString());

}

}

///

/// 将指定的Object 的值转换为指定枚举类型的值。

///

/// 实现IConvertible 接口的Object,或者为null ///

private static object GetUInt16(object value)

{

if (value is UInt16)

{

return value;

}

else

{

return UInt16.Parse(value.ToString());

}

}

///

/// 将指定的Object 的值转换为指定枚举类型的值。

///

/// 实现IConvertible 接口的Object,或者为null ///

private static object GetInt32(object value)

{

if (value is Int32)

{

return value;

}

else

{

return Int32.Parse(value.ToString());

数据库实时同步技术解决方案

数据库实时同步技术解决方案 一、前言 随着企业的不断发展,企业信息化的不断深入,企业内部存在着各种各样的异构软、硬件平台,形成了分布式异构数据源。当企业各应用系统间需要进行数据交流时,其效率及准确性、及时性必然受到影响。为了便于信息资源的统一管理及综合利用,保障各业务部门的业务需求及协调工作,常常涉及到相关数据库数据实时同步处理。基于数据库的各类应用系统层出不穷,可能涉及到包括ACCESS、SQLSERVER、ORACLE、DB2、MYSQL等数据库。目前国内外几家大型的数据库厂商提出的异构数据库复制方案主要有:Oracle的透明网关技术,IBM的CCD表(一致变化数据表)方案,微软公司的出版者/订阅等方案。但由于上述系统致力于解决异构数据库间复杂的交互操作,过于大而全而且费用较高,并不符合一些中小企业的实际需求。 本文结合企业的实际应用实践经验,根据不同的应用类型,给出了相应的数据库实时同步应用的具体解决方案,主要包括: (1) SQLSERVER 到SQLSERVER 同步方案 (2) ORACLE 到SQLSERVER 同步方案 (3) ACCESS 到SQLSERVER/ORACLE 同步方案

二、异构数据库 异构数据库系统是相关的多个数据库系统的集合,可以实现数据的共享和透明访问,每个数据库系统在加入异构数据库系统之前本身就已经存在,拥有自己的DMBS。异构数据库的各个组成部分具有自身的自治性,实现数据共享的同时,每个数据库系统仍保有自己的应用特性、完整性控制和安全性控制。异构数据库的异构性主要体现在以下几个方面: 1、计算机体系结构的异构 各数据库可以分别运行在大型机、小型机、工作站、PC嵌入式系统中。 2、基础操作系统的异构 各个数据库系统的基础操作系统可以是Unix、Windows NT、Linux等。 3、DMBS本身的异构 可以是同为关系型数据库系统的Oracle、SQL Server等,也可以是不同数据模型的数据库,如关系、模式、层次、网络、面向对象,函数型数据库共同组成一个异构数据库系统。 三、数据库同步技术

实验十二 数据库的连接与访问 实验指导

实验十二数据库的连接与访问实验指导 https://www.360docs.net/doc/cf9828480.html,是.NET Framework中的一系列类库,提供了在.NET开发中数据库所需的操作的类。在.NET应用程序开发中,C#可以使用https://www.360docs.net/doc/cf9828480.html,。 可以将https://www.360docs.net/doc/cf9828480.html,看做是一个介于数据源和数据使用者之间的转换器,如图1所示。https://www.360docs.net/doc/cf9828480.html,接收使用者语言中的命令,如连接数据库、返回数据集等,然后将这些命令转换成可以在数据源中正确执行的语句。 图1 https://www.360docs.net/doc/cf9828480.html,的功能示意图 一、https://www.360docs.net/doc/cf9828480.html, 命名空间及其常用类 https://www.360docs.net/doc/cf9828480.html,体系结构的类包含在System.Data命名空间中(命名空间相当于一个容器,它包含一组定义的类或结构,命名空间也可以嵌套在另一个命名空间中。.NET类库提供了很多类,根据类的功能不同,又划分了很多命名空间,而这些命名空间大多数有一个顶级的命名空间System。其中System.Data命名空间提供对表示https://www.360docs.net/doc/cf9828480.html,结构的类的访问),根据功能划分,System.Data又包含了多个子空间。System.Data命名空间及其子空间所包含的常用类如表1所示。 表1 System.Data命名空间及其子空间的常用类

二、https://www.360docs.net/doc/cf9828480.html,数据库访问 下面以一个简单的实例来说明在C#应用程序设计中如可使用https://www.360docs.net/doc/cf9828480.html,来访问数据库。 首先用Visual Studio 2008中的C#设计一个如图2所示的窗体。 图2 学生注册信息管理的窗体设计 建立上述窗体的过程如下: (1)启动Visual Studio 2008,然后文件->新建项目,弹出如图3所示的对话框。

图3 新建项目对话框 在新建项目对话框中,选择左侧的项目类型为“Visual C# --Windows”,右侧的模板中选择“Windows 窗体应用程序”,下面输入项目的名称例如studentmis,并设置好存储路径,然后点击确定,生成如图4所示的Form1窗体。 图4 Form1窗体

7种方法连接数据库

连接数据库的方法小结 1.ODBC API ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。 一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access , MYSQL还是Oracle数据库,均可用ODBC API 进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。 2.MFC ODBC 由于直接使用ODBC API编写应用程序要编制大量代码,开发者往往需要花费很多的精力在非核心代码的维护上,而Visual C++提供了MFC ODBC类,封装了ODBC API,这使得利用MFC ODBC来创建ODBC应用程序非常简便。 3.DAO(Data Access Object) DAO提供了一种通过程序代码创建和操纵数据库的机制,多个DAO构成一个体系结构,在这个体系结构中,各个DAO对象协同工作。MFC DAO是Microsoft提供的用于访问Microsoft jet数据库文件的强有力的数据库开发工具,它通过封装DAO,向程序员提供了DAO操作数据库的手段。 4.OLE DB OLE DB(Object Linking and Embedding, Database, 又称为OLE DB或OLE-DB),一个基于COM的数据存储对象,能提供对所有类型的数据的操作,甚至能在离线的情况下存取数据(比方说,你使用的是你的便携机,你可以毫不费力地看到最后一次数据同步时的数据映像). OLEDB位于ODBC层与应用程序之间. 在你的ASP页面里,ADO是位于OLEDB之上的应用程序. 你的ADO调用先被送到OLEDB,然后再交由ODBC 处理. 你可以直接连接到OLEDB层,如果你这么做了,你将看到服务器端游标(recordset的缺省的游标,也是最常用的游标)性能的提升.

数据库访问技术

7.2 数据库访问技术 访问数据库中的数据对象时,一般可采用两种访问方式:一是登录用户直接借助DBMS 的数据操纵工具,通过图形或SQL命令接口联机访问;另外一种为程序代码通过应用程序编程接口(Application Programming Interface,API)进行数据库连接验证以及数据操作。两种数据库访问方式,可以抽象为图7.5的层次结构,从中可见中间的接口组件是数据库访问的桥梁与核心,本节主要就该部分的通用接口技术(即API访问方式)部分进行介绍。 图7.5 数据库访问结构示意 根据底层数据操作模式的差异,数据库接口可简单分为:本地(Local)数据库接口和客户机/服务器(Client/Server)数据库接口。 1.本地数据库接口 通过DBMS将用户数据请求转换成为简单的磁盘访问命令,并交由操作系统的文件管理系统执行;然后DBMS从文件管理系统得到数据响应并加以处理。由于DBMS数据文件组织结构的差异,本地型DBMS只能够读取特定的数据源。 2.客户机/服务器数据库接口 数据处理工作分散到工作站和服务器上处理。工作站通过特定的数据库通信API,把数据访问请求传给相应的服务器的后端数据驱动程序。由于不同客户机/服务器数据库管理系统通信机制的差异,异构数据库之间也难以实现透明通信互访。 因此,仅依靠特定DBMS提供的数据库访问接口难以支撑透明的、通用的异构数据库访问。后台数据库管理系统的变更或升级,需要程序员对特定API的重新学习,以及对应用程序代码的改写;而市场上DBMS产品众多,必将进一步加大系统开发人员的学习和维护压力,应用程序与数据源间的独立性难以真正实现。为此,建立更为通用的数据访问技术规范,为程序用户提供一套完整、统一的数据库访问接口,得到了数据库业界广泛认同与支持,并由此产生了众多成熟的数据库访问接口应用技术规范。 到目前为止,主流的数据库访问技术包括ODBC、MFC ADO、RDO、OLE DB、ADO、https://www.360docs.net/doc/cf9828480.html,以及JDBC等通用技术标准。这些通用数据库访问技术的出现与发展大大降低了数据库系统开发与维护门槛,改善了数据库系统的移植性、扩展性,极大推动了数据库技术的发展与普及。下面就主流数据库访问技术发展与演化进行介绍。

数据库访问技术简介

数据库访问技术简介 数据库中的数据存放在数据库文件中,我们要从数据库文件中获取数据,先要连接并登陆到存放数据库的服务器。一般来说,访问数据库中的数据有两种方式:一是通过DBMS (Data Base Management System,数据库管理系统)提供的数据库操作工具来访问,如通过SQL Server 2000的查询设计器来提交查询,或者通过SQL Server 2000的企业管理工具来访问。这种方式比较适合DBA对数据库进行管理;二是通过API(Application Programming Interface, 应用编程接口)来访问数据库,这种方式适合在应用程序中访问数据库。 在数据库发展的初期,各个开发商为自己的数据库设计了各自不同的DBMS,因此不同类型的数据库之间数据交换非常困难。为了解决这个问题,Microsoft提出了ODBC(Open Data Base Connectivity,开放数据库互连)技术,试图建立一种统一的应用程序访问数据库接口,使开发人员无需了解程序内部结构就可以访问数据库。 1、Microsoft提出的系列数据库访问技术 1.1、ODBC ODBC是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API。应用程序可以使用所提供的API来访问任何提供了ODBC驱动程序的数据库。ODBC规范为应用程序提供了一套高层调用接口规范和基于动态链接的运行支持环境。ODBC已经成为一种标准,目前所有的关系数据库都提供了ODBC 驱动程序,使用ODBC开发的应用程序具有很好的适应性和可移植性,并且具有同时访问多种数据库系统的能力。这使得ODBC的应用非常广泛,基本可用于所有的关系数据库。 要使用ODBC,先要了解以下概念:ODBC驱动管理器、ODBC驱动程序、数据源。它们都是ODBC的组件。ODBC组件之间的关系如图1所示。

数据库系统的访问

第7章数据库系统的访问 对于那些相对独立的软件供应商而言,经常要为每一个DBMS编写一个版本的应用程序,或者为每个要访问的DBMS编写针对DBMS的代码。这就意味着,大量的资源都耗在了编写和维护DB的访问上,更不用说应用程序了。此时应用程序的评价标准不再是质量,而是它能否在给定的DBMS中访问数据库。 这就需要开放的数据库连接,就是人们需要用一种新的方法来访问不同的数据库。为此,在C/S,B/S系统中必须广泛使用访问接口技术,以隐藏各种复杂性,屏蔽各种系统之间的差异。常见的数据库访问接口的技术有固有调用、ODBC、JDBC、OLE DB、DAO、ADO、https://www.360docs.net/doc/cf9828480.html, 以及基于XML的数据库访问等几种流行的方式。这其中以ODBC技术和JDBC技术应用最广泛,也是目前最为优秀的访问接口方式。 本章主要对几种常见的数据库访问技术(如固有调用、ODBC、JDBC、OLE DB、DAO、ADO、https://www.360docs.net/doc/cf9828480.html,以及基于XML的数据库访问等)进行介绍。 7.1 数据库的访问接口 所谓访问接口是指分布式环境中保证操作系统、通信协议、数据库等之间进行对话、互操作的软件系统。 访问接口的作用是保证网络中各部件(软件和硬件)之间透明地连接,即隐藏网络部件的异构性,尤其保证不同网络、不同DBMS和某些访问语言的透明性,即下面三个透明性。 ⑴网络透明性:能支持所有类型的网络。 ⑵服务器透明性:不管服务器上的DBMS是何种型号(ORACLE、SYBASE、DB2等),一个好的访问接口都能通过标准的SQL语言与不同DBMS上的SQL语言连接起来。 ⑶语言透明性:客户机可用任何开发语言进行发送请求和接受回答,被调用的功能应该像语言那样也是独立的。 应用系统访问数据库的接口方式有多种,本节介绍固有调用、ODBC和JDBC。 7.1.1 固有调用 每个数据库引擎都带有自己的包含用于访问数据库的APl函数的动态链接库DLL,应用程序可利用它存取和操纵数据库中的数据。如果应用程序直接调用这些动态链接库,就说它执行的是“固有调用”,因为该调用对于特定的数据库产品来说是“固有” (专用)的。 固有调用接口的优点是执行效率高,由于是“固有”,编程实现较简单。但它的缺点也是很严重的:不具通用性。对于不同的数据库引擎,应用程序必须连接和调用不同的专用的动态链接库,这对于网络数据库系统的应用是极不方便的。 7.1.2 ODBC ODBC是“开放数据库互连”(Open Database Connectivity)的简称。ODBC是Microsoft 公司提出的、当前被业界广泛接受的应用程序通用编程接口(API)标准,它以X/Open和ISO/IEC的调用级接口(CLI)规范为基础,用于对数据库的访问。我们可以用如下图示来说明ODBC概念。

数据库访问层的实现

系统数据库操作采用ADO技术,在进行代码设计时,把数据库操作的代码单独写在一个自定义的ado.cpp文件里,包括CADODatabase和CADORecordset两个类分别实现对数据库和记录集的操作,并将这些操作封装在两个类中。 (1)引入ado库 #import "C:\Program Files\Common Files\System\ADO\msado15.dll" \ no_namespace rename("EOF", "adoEOF"),rename("BOF","adoBOF") (2)用_ConnectionPtr对象连接数据库 连接数据库操作中LPCTSTR lpstrConnection作为输入参数,在lpstrConnection参数中设置驱动driver={SQL Server},数据源(本地) Server=127.0.0.1,数据库名称DATABASE=QUEStoreDB,数据库用户名UID,数据库用户密码PWD。运用_ConnectionPtr连接数据源。主要代码如下: BOOL CADODatabase::Open(LPCTSTR lpstrConnection) { HRESULT hr = S_OK; if(IsOpen()) Close(); if(strcmp(lpstrConnection, _T("")) != 0) m_strConnection = lpstrConnection; ASSERT(!m_strConnection.IsEmpty()); try { hr = m_pConnection->Open(_bstr_t(m_strConnection), "", "", NULL); return hr == S_OK; } catch(_com_error &e) { dump_com_error(e); } return FALSE; } (3)用_ConnectionPtr对象执行指令 当对数据库进行插入、删除、更新操作时用此方法。String sql为输入参数,传入SQL(Insert,Delete,Update)语句。主要代码如下: BOOL CADODatabase::Execute(LPCTSTR lpstrExec)

sqlHelp数据库操作类

using System; using System.Collections; using System.Collections.Specialized; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace LiTianPing.SQLServerDAL //可以修改成实际项目的命名空间名称 { ///

/// Copyright (C) 2004-2008 LiTianPing /// 数据访问基础类(基于SQLServer) /// 用户可以修改满足自己项目的需要。 /// public abstract class DbHelperSQL { //数据库连接字符串(web.config来配置) // protected static string connectionString = ConfigurationSettings.AppSettings["ConnectionString"]; public DbHelperSQL() { } #region 公用方法 public static int GetMaxID(string FieldName,string TableName) { string strsql = "select max(" + FieldName + ")+1 from " + TableName; object obj = GetSingle(strsql); if (obj == null) { return 1; } else { return int.Parse(obj.ToString()); } } public static bool Exists(string strSql, params SqlParameter[] cmdParms) { object obj = GetSingle(strSql, cmdParms); int cmdresult;

数据库访问类

本文由星野看星贡献 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; namespace Mysqlserver { ///  /// SqlServerDataBase 的摘要说明 ///  public class SqlServerDataBase { private string strError = null; private int intCount = 0; public SqlServerDataBase() { // // TODO: 在此处添加构造函数逻辑 // } ///  /// 公开方法DBConn,返回数据库连接 ///  /// <returns></returns> public SqlConnection DBconn() { string strConn = "Server=(local);Database=GlobalMeetings;Uid=sa;pwd="; try { return new SqlConnection(strConn); } catch (Exception) { return null; } } ///  /// 公开属性ErrorMessage,返回错误信息 ///  public string ErrorMessage { get { return strError; }

HTML5的SQL数据库访问JavaScript数据

HTML5的SQL数据库访问JavaScript数据 HTML5的网页浏览器的推出,它现在可以为Javascript代码,直接在电脑上存储的数据库中存储的数据交互。 对于大多数程序员数据齐头并进,他们创建的应用程序。通常情况下,应用程序将读取数据,允许用户更新或添加信息,然后将其存储的数据。典型的桌面应用程序,将这些数据存储在用户的计算机数据库,但Web应用程序略有不同。 用户的PC上,他们只能存储有限的数据(如饼干),不得不求助于在中央服务器上存储的数据库(例如使用PHP和MySQL)。这是不可能的客户端语言(如JavaScript)数据库(如SQLite)直接沟通和程序员是无法写入代码如: 然而,与HTML5这一切都变了。程序员现在可以存储在用户的计算机上的数据库。应用程序可以创建表进行选择,插入,更新和删除语句。和程序员可以使用标准的SQL查询。 每个Web浏览器的数据库? 在写只有Safari和Chrome都纳入了HTML5的Web SQL数据库(或更正确,WebDatabase的API - 一个流行的SQLite数据库的子集)的时间,目前还不清楚如果其他浏览器将利用这。事实上,它可能是Firefox 将使用IndexedDB数据库,但都没有,到今天为止,产生了一个纳入数据库的浏览器。 这是一个标准的SQL数据库,是不是它? 只是一个小点值得指出有关Web SQL数据库。任何疑问进行了异步不同步。虽然这是令人难以置信的强大的技术,它意味着很多程序员将需要重新思考的方式在他们的方式在他们结构其方案的流动。 适应异步编程 一个Javascript程序员将开始与一个典型的脚本是: <脚本语言=“JAVASCRIPT”> 功能run_query(SQL){ db.transaction(功能(TX){ tx.executeSql(SQL); });

数据库操作类

using System.Data.SqlClient; public class DataConn { public DataConn() { } public static string strconn = ConfigurationManager.ConnectionStrings["xsconstr"].ConnectionString; public static SqlConnection CreateConn() { SqlConnection conn = new SqlConnection(strconn); return conn; } public static SqlDataReader ExecuterRead(string cmdtext, SqlConnection conn) { SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; https://www.360docs.net/doc/cf9828480.html,mandText = cmdtext; SqlDataReader dr = cmd.ExecuteReader(); return dr; } public static SqlDataReader ExecuterRead(string cmdtext, SqlConnection conn, params SqlParameter[] array1) { SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; https://www.360docs.net/doc/cf9828480.html,mandText = cmdtext; foreach (SqlParameter para in array1) cmd.Parameters.Add(para); SqlDataReader dr = cmd.ExecuteReader(); return dr; } public static int ExecuteNonRead(string cmdtext) { SqlConnection conn = CreateConn(); conn.Open(); SqlCommand cmd = new SqlCommand(cmdtext, conn); int i = cmd.ExecuteNonQuery(); conn.Close(); return i; } public static int ExecuteNonRead(string cmdtext, params SqlParameter[] array) { SqlConnection conn = CreateConn(); conn.Open();

VC++实现数据库访问

一、数据库连接 1、标准的访问数据库的技术 ▲ODBC(Open Database Connectivity,开发数据库互联) ODBC为编写关系数据库的客户软件提供了一种统一的接口。ODBC提供了一个单一的API,可用于处理不同数据库的客户应用程序。使用ODBC API的应用程序可以与任何具有ODBC 驱动程序的关系数据库进行通信。现在,绝大多数关系数据库都提供了ODBC驱动程序,那么我们使用ODBC API就可以访问这些数据库。ODBC的体系结构如下: 我们所编写的客户程序直接和ODBC驱动程序管理器打交道,后者利用ODBC驱动程序所提供的API访问数据库。在访问不同数据库时,需要指定相应的ODBC驱动程序,而后者又由ODBC程序管理器去调用,它会将客户的请求转换为相应的ODBC驱动,传递给数据库。 ▲DAO(Data Access Object,数据访问对象) DAO就是一组Microsoft Access/Jet数据库引擎的COM自动化接口。DAO不像ODBC那样是面向C/C++程序员的,它是微软提供给Visual Basic开发人员的一种简单的数据访问方法,用于操作Access数据库。该技术很少使用,将逐渐退出历史的舞台。 ▲RDO(Remote Data Object,远程数据对象) 由于RDO直接调用ODBC API(而不是像DAO那样通过Jet引擎),因此,可以为使用关系数据库的应用程序提供更好的性能。 ▲OLE DB(对象链接与嵌入数据库) OLE DB在两个方面对ODBC进行了扩展。首先,OLEDB提供了一个数据库编程的COM 接口;第二,OLEDB提供了一个可用于关系型和非关系型数据源的接口,而ODBC只能访问关系型数据库。通常我们所说的数据库都是指关系型和非关系型数据源的接口,而ODBC 只能访问关系型数据库。通常我们所说的数据库都是指关系型数据库。但是数据库的概念,从广义上来说,除了关系型数据库以外,还包括其他格式的数据源,包括电子表格、文本文件。OLE DB的两个基本结构式OLE DB提供程序和OLE DB用户程序。OLEDB的功能非常强大,但是它对自动化的支持不是很好。OLE DB的体系结构如下:

实验:数据库的连接与访问

实验一数据库的连接与访问(分两次实验完成)实验目的: 1)掌握https://www.360docs.net/doc/cf9828480.html,的常用对象 2)掌握常用https://www.360docs.net/doc/cf9828480.html,的程序编写方法 3)能够实现简单的查询和数据更新功能 注意:注意查看红色字体部分内容。 https://www.360docs.net/doc/cf9828480.html,是.NET Framework中的一系列类库,提供了在.NET开发中数据库所需的操作的类。在.NET应用程序开发中,C#可以使用https://www.360docs.net/doc/cf9828480.html,。 可以将https://www.360docs.net/doc/cf9828480.html,看做是一个介于数据源和数据使用者之间的转换器,如图1所示。https://www.360docs.net/doc/cf9828480.html,接收使用者语言中的命令,如连接数据库、返回数据集等,然后将这些命令转换成可以在数据源中正确执行的语句。 图1 https://www.360docs.net/doc/cf9828480.html,的功能示意图 一、https://www.360docs.net/doc/cf9828480.html, 命名空间及其常用类 https://www.360docs.net/doc/cf9828480.html,体系结构的类包含在System.Data命名空间中(命名空间相当于一个容器,它包含一组定义的类或结构,命名空间也可以嵌套在另一个命名空间中。.NET类库提供了很多类,根据类的功能不同,又划分了很多命名空间,而这些命名空间大多数有一个顶级的

命名空间System。其中System.Data命名空间提供对表示https://www.360docs.net/doc/cf9828480.html,结构的类的访问),根据功能划分,System.Data又包含了多个子空间。System.Data命名空间及其子空间所包含的常用类如表1所示。 表1 System.Data命名空间及其子空间的常用类

二、https://www.360docs.net/doc/cf9828480.html,数据库访问 实验内容: 一、设计如下图所示窗体

图2 学生注册信息管理的窗体设计 建立上述窗体的过程如下: (1)启动Visual Studio 2008,然后文件->新建项目,弹出如图3所示的对话框。

C#打造自己通用的数据库访问类

C#打造自己通用的数据库访问类 using System; using System.Collections.Generic; using System.Data; using https://www.360docs.net/doc/cf9828480.html,mon; namespace NetSkycn.Data { ///

/// 通用数据库访问类,封装了对数据库的常见操作 /// 作者:周公 /// 创建日期:2011-07-18 /// 修改日期:2012-04-12 /// 新浪微博地址:https://www.360docs.net/doc/cf9828480.html,/zhoufoxcn /// public sealed class DbUtility { public string ConnectionString { get; set; } private DbProviderFactory providerFactory; /// /// 构造函数 /// /// 数据库连接字符串 /// 数据库类型枚举,参见 public DbUtility(string connectionString, DbProviderType providerType) { ConnectionString = connectionString; providerFactory = ProviderFactory.GetDbProviderFactory(providerType); if (providerFactory == null) { throw new ArgumentException("Can't load DbProviderFactory for given value of providerType"); } } /// /// 对数据库执行增删改操作,返回受影响的行数。 /// /// 要执行的增删改的SQL语句 /// 执行增删改语句所需要的参数 /// public int ExecuteNonQuery(string sql, IList parameters) {

第七讲 VB访问SQL Server2000数据库的方法

第七讲 VB访问SQL Server2000数据库的方法 一、ODBC数据源设置 1、ODBC简介 ODBC Open DatabaseConnectivity开放式数据库互连)是Mircosoft公司有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API Application应用程序编程接口)。这些API利用SQL来完成大部分的任务。ODBC本身提供对SQL语言的支持,用户可以直接将SQL送给ODBC一个基于ODBC的应用程序对数据库操作不依赖于任何DBMS,不直接与DBMS打交道,所有数据库操作由ODBC驱动程序完成。 2、ODBC数据源的创建(建立ODBC数据源) 前台系统Windows 2000 professional系统,后台Windows 2000 Server系统。以Windows 2000 professional为例: (1)单击“开始”/设置/控制面板/管理工具/数据源ODBC,打开“ODBC数据源管理器”,选择“用户DSN or 系统DSN”,单击【添加】按钮,打开“创建用户数据源”对话框,选择“SQL Server”,单击【完成】按钮。

(2)打开“创建新的数据源到SQL Server”窗口: ○1你想用什么名称命名数据源:在名称框中输入xn。 ○2服务器:为网络中数据库服务器(默认是本地服务器Local,可选远程服务器IP)。 ○3登陆ID:xn密码:xn(取决于安装SQL时所指定的密码)。特别注意此处为确保数据库安全起见,数据库管理员可以给用户指定一个用户名及密码。这里为简便起见使用管理员用户名及密码。 ○4更改数据库为:aa(所要使用的数据库)。

数据库访问技术课程期末考试卷(B)

期末考试卷(B) (时间:120分钟) 年级课号课程名称数据库访问技术卷页___考试方式闭卷 专业班级学生姓名_____ _ 学号_ ___ _成绩__ __ 注意:所有解答都做在答卷纸上,并请写清学号、姓名和有关题号。 一、单选题(每空1分,共30分) 1. 在https://www.360docs.net/doc/cf9828480.html, 中,为访问DataTable对象从数据源提取的数据行。可使用DataTable 对象的_______ 属性。 A.Rows B.Columns C.Constraints D.DataSet 2. 为了在程序中使用ODBC .NET 数据提供程序,应在源程序工程中添加对程序集______ 的引用。 A. System.Data.dll B. System.Data.SQL.dll C. System.Data.OleDb.dll D. System.Data.Odbc.dll 3. 参考下列C#语句: SqlConnection Conn1 = new SqlConnection( ); Conn1.ConnectionString = "Integrated Security=SSPI; Initial Catalog=northwind"; Conn1.Open( ); SqlConnection Conn2 = new SqlConnection( ); Conn2.ConnectionString = "Initial Catalog=northwind; Integrated Security=SSPI"; Conn2.Open( ); 请问:上述语句将创建_____个连接池来管理这些SqlConnection 对象?A.1 B.2 C.0 4. 打开SQL Connection 时返回的SQL Server 错误号为4 060,该错误表示: A. 连接字符串指定的服务器名称无效 B. 连接字符串指定的数据库名称无效 C. 连接超时 D. 连接字符串指定的用户名或密码错误 5. 为创建在SQL Server 2000 中执行Select 语句的Command 对象,可先建立到SQL Server 2000 数据库的连接,然后使用连接对象的_______方法创建SqlCommand 对象。 A. Open B. OpenSQL C. CreateCommand D. CreateSQL 6. 变量名为conn 的SqlConnection 对象连接到本地SQL Server 2000 的Northwind 实例。该实例中包含表Orders。为了从Orders 表查询所有CustomerID 等于“tom”的订单数据,请用正确的字符串sqlstr 的赋值语句替换下列第一行语句。 string sqlstr="本字符串需要你用正确的SQL语句替换": conn.Open(); SqlCommand cmd = conn.CreateCommand(); https://www.360docs.net/doc/cf9828480.html,mandText = sqlstr; https://www.360docs.net/doc/cf9828480.html,mandType = CommandType.Text; SqlParameter p1 = cmd.Parameters.Add("@CustomerID",SqlDbType.VarChar,5); p1.Value = "tom"; SqlDataReader dr = cmd.ExecuteReader(); A. string sqlstr="Select * From Orders where CustomerID=?"; B. string sqlstr="Select * From Orders where CustomerID=CustomerID "; C. string sqlstr="Select * From Orders where CustomerID=@CustomerID "; D. string sqlstr="Select * From Orders"; 7. Oracle 数据库实例MyOra1 中存储过程CountProductsInCategory 的定义如下(过程体略):

基于Java语言实现数据库的访问_谷庆华

基于Java语言实现数据库的访问 谷庆华,李成贵 (北京航空航天大学仪器科学与光电工程学院,北京100083) 数据库查询的Java实现 下面介绍利用JDBC—ODBC桥实现对Microsoft Access数据库的SQL查询的方法。 2.1数据库建立和数据源设置 Microsoft Access具备完善的数据库功能,可以作 为独立的DBMS使用,是PC机上开发客户机/服务器 型数据库应用的优秀工具。它将若干个相互关联的表 (table)组成一个数据库(*.mdb)。这里作为例子使 用的数据库dbinfor包括2个表:tbinformation1与tbin- formation2,其结构分别如表1、表2所示。 表1tbinformation1表结构 id name phone address email 表2tbinformation2表结构 id userid department score trial 在这2个数据表之间建立了一个关系,即在表 tbinformation1的id字段与表tbinformation2的userid 字段之间,它们内容相同。数据库制好后,打开Win- dows的“开始”菜单,选择“设置”菜单下的“控制面 板”,从中启动微软的ODBC数据源,设置与数据库相 应的微软ODBC驱动器和数据源。 ODBC是用C语言写的在多种不同的DBMS中存 取数据的标准应用程序接口。目前应用最广的是微软 的ODBC,它几乎可将所有平台的所有数据库连接起 来。ODBC在应用程序与特定数据库之间插入一个驱 动程序管理器,每种数据库引擎都需要向驱动程序管 理器注册它自己的ODBC驱动程序,驱动程序管理器 将与ODBC兼容的SQL请求从应用程序传给ODBC 驱动程序,并由ODBC驱动程序把SQL请求翻译为对 数据库的固有调用,从而达到应用程序访问操作数据 库的目的。JDBC采用JDBC-ODBC桥接方式在Java 应用程序中使用ODBC。 2.2访问数据库的Java应用程序的编写 用JDBC编写访问、操作数据库的Java应用程序 一般完成下面4件事[4]: (1)加载JDBC-ODBC桥驱动程序。 为了与特定的数据源相连,JDBC必须加载相应的

实验8-jdbc数据库访问(优.选)

实验8 JDBC访问数据库 一、实验目的 1. 掌握使用传统的方法访问数据库; 2. 掌握使用数据源的方法访问数据库。 二、实验原理 数据库应用是Web应用开发的一个重要应用。Web应用程序访问数据库有两种方法:传统的方法和使用JNDI数据源的方法。 传统方法访问数据库的步骤是:①加载数据库驱动程序;②建立连接对象;③创建语句对象;④获得结果集;⑤关闭有关连接对象。 使用数据源访问数据库的步骤是:①配置数据源(局部数据源或全局数据源);②通过JNDI机制查找命名数据源;③通过数据源对象创建连接对象;④其他与传统方法一致。 三、实验内容与步骤 (一)使用传统方法通过JSP页面访问数据库 【步骤1】创建数据库。假设在PostgreSQL建立了一个名为bookstore的数据库,在其中建立books表,代码如下: CREATE TABLE books ( bookid character(5) PRIMARY KEY, --书号 title varchar2(80), --书名 author character varying(20), --作者 publisher character varying (40), --出版社 price real --价格 ); 向books表中插入几条记录,代码如下: INSERT INTO books V ALUES ('204','Head First Servlets & JSP', 'Bryan Basham', '中国电力出版社',98.00); INSERT INTO books V ALUES ('201', 'Servlets 与JSP 核心教程', 'Hall Marty','清华大学出版社',45); INSERT INTO books V ALUES ('202', 'Tomcat与Java Web 开发技术祥解', '孙卫琴', '机械工业出版社',45); INSERT INTO books V ALUES ('203', 'JSP 应用开发技术', '柳永坡','人民邮电出版社',52); INSERT INTO books V ALUES ('205', 'J2EE 1.4 编程指南', 'Spielman Sue','电子工业出版社',68); 注意:需要将数据库的JDBC驱动程序安装到应用程序的WEB-INF\lib目录中。 【步骤2】使用下面JSP页面displayBooks.jsp访问books表中的数据。 <%@ page contentType="text/html; charset=gb2312" %> <%@ page import="java.sql.*"%> Database Access Test

数据库访问方法

第9章 VB数据库编程技术 9.1数据库设计基础 9.1.1 VB中的数据访问 VB提供的数据库引擎叫Jet。VB提供了两种与Jet数据库引擎接口的方法:Data控件(Data Control)和数据访问对象(DAO)。Data控件只提供了有限的不需编程就能访问现存数据库的功能,而DAO模型则是全面控制数据库的完整编程接口。这两种方法不是互斥的,实际上,它们可以同时使用。 VB中的数据库编程就是创建数据访问对象,这些数据访问对象对应于被访问的物理数据库的不同部分,如Database(数据库)、Table(表)、Field(字段)和Index(索引)对象。用这些对象的属性和方法来实现对数据库的操作。VB通过DAO和Jet引擎可以识别三类数据库: 1. VB数据库:也称为本地数据库,这类数据库文件使用与Microsoft Access相同的格式。Jet引擎直接创建和操作这些数据库并且提供了最大程度的灵活性和速度。 2. 外部数据库:VB可以使用几种比较流行的“索引顺序访问文件方法(ISAM)”数据库,包括:dDase III、dBase IV、FoxPro 2.0和2.5以及Paradox 3.x和 4.x。在VB中可以创建和操作所有这些格式的数据库,也可以访问文本文件数据库和Excel或Lotus l-2-3电子表格文件。 3. ODBC数据库:包括符合ODBC标准的客户机/服务器数据库,如Microsoft SQL Server。如果要在VB中创建真正的客户机/服务器应用程序,可以使用ODBC Direct直接把命令传递给服务器处理。 9.1.2 VB数据库体系结构 VB提供了基于Microsoft Jet数据库引擎的数据访问能力,Jet引擎负责处理存储、检索、更新数据的结构,并提供了功能强大的面向对象的DAO编程接口。 1.VB数据库应用程序的组成 VB数据库应用程序包含三部分,如图9.1所示。 图9.1 VB数据库应用程序的组成 185

相关文档
最新文档