2010年8月20日

oracle 导入导出

                      IMP EXP命令

Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用。

    执行环境:可以在SQLPLUS.EXE或者DOS(命令行)中执行,DOS中可以执行时由于在oracle 8i中安装目录\ora81\BIN被设置为全局路径,该目录下有EXP.EXEIMP.EXE文件被用来执行导入导出。

  oraclejava编写,SQLPLUS.EXEEXP.EXEIMP.EXE这两个文件有可能是被包装后的类文件。SQLPLUS.EXE调用EXP.EXEIMP.EXE所包裹的类,完成导入导出功能。

 

下面介绍的是导入导出的实例。

数据导出:

 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp

   exp system/manager@TEST file=d:\daochu.dmp full=y

 2 将数据库中system用户与sys用户的表导出

   exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)

 3 将数据库中的表inner_notifynotify_staff_relat导出

  Exp system/manager@test file=d:\daochu.dmp tables=(inner_notifynotify_staff_relat)

 4 将数据库中的表table1中的字段filed1"00"打头的数据导出

  exp system/manager@TEST file=d:\daochu.dmp tables=(table1)

query=\" where filed1 like '00%'\"

 

 上面是常用的导出,对于压缩,既用winzipdmp文件可以很好的压缩。

 也可以在上面命令后面 加上 compress=y 来实现。

 

 

 

数据的导入

 1 D:\daochu.dmp 中的数据导入 TEST数据库中。

  imp system/manager@TEST  file=d:\daochu.dmp

  imp aichannel/aichannel@HUST full=y file= d:\data\newsmgnt.dmp ignore=y

   上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。

   在后面加上 ignore=y 就可以了。

 2 d:\daochu.dmp中的表table1 导入

 imp system/manager@TEST file=d:\daochu.dmp tables=(table1)

 

 基本上上面的导入导出够用了。不少情况先是要将表彻底删除,然后导入。

 注意:

 操作者要有足够的权限,权限不够它会提示。

 数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上。

 

 

 

 

附录一:

 给用户增加导入数据权限的操作

 第一,启动sql*puls

 第二,以system/manager登陆

 第三,create user 用户名 IDENTIFIED BY 密码 (如果已经创建过用户,这步可以省略)

 第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,

       DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,

       DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字

 第五, 运行-cmd-进入dmp文件所在的目录,

      imp userid=system/manager full=y file=*.dmp

      或者 imp userid=system/manager full=y file=filename.dmp

 

 执行示例:

 F:\Work\Oracle_Data\backup>imp userid=test/test full=y file=inner_notify.dmp

 

屏幕显示

Import: Release 8.1.7.0.0 - Production on 星期四 2 16 16:50:05 2006

(c) Copyright 2000 Oracle Corporation. All rights reserved.

 

连接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production

With the Partitioning option

JServer Release 8.1.7.0.0 - Production

 

经由常规路径导出由EXPORT:V08.01.07创建的文件

已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入

导出服务器使用UTF8 NCHAR 字符集 (可能的ncharset转换)

正在将AICHANNEL的对象导入到 AICHANNEL

正在导入表                  "INNER_NOTIFY"          4行被导入

准备启用约束条件...

成功终止导入,但出现警告。

 

 

附录二:

 Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.

 先建立import9.par,然后,使用时命令如下:imp parfile=/filepath/import9.par

  import9.par 内容如下:

        FROMUSER=TGPMS       

        TOUSER=TGPMS2     (注:把表的拥有者由FROMUSER改为TOUSERFROMUSERTOUSER的用户可以不同)          

        ROWS=Y

        INDEXES=Y

        GRANTS=Y

        CONSTRAINTS=Y

        BUFFER=409600

        file==/backup/ctgpc_20030623.dmp

        log==/backup/import_20030623.log

 

将一个数据库的某用户的所有表导到另外数据库的一个用户下面的例子  

exp userid=system/manager owner=username1 file=expfile.dmp

imp userid=system/manager  fromuser=username1  touser=username2

ignore=y    file=expfile.dmp

 

ORACLE数据库有两类备份方法。第一类为物理备份,该方法实现数据库的完整恢复,但数据库必须运行在归挡模式下(业务数据库在非归挡模式下运行),且需要极大的外部存储设备,例如磁带库;第二类备份方式为逻辑备份,业务数据库采用此种方式,此方法不需要数据库运行在归挡模式下,不但备份简单,而且可以不需要外部存储设备。

 

 

数据库逻辑备份方法

ORACLE数据库的逻辑备份分为三种模式:表备份、用户备份和完全备份。

 

表模式

备份某个用户模式下指定的对象(表)。业务数据库通常采用这种备份方式。

若备份到本地文件,使用如下命令:

exp icdmain/icd rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0

file=exp_icdmain_csd_yyyymmdd.dmp

log=exp_icdmain_csd_yyyymmdd.log

tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo

若直接备份到磁带设备,使用如下命令:

exp icdmain/icd rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0

file=/dev/rmt0

log=exp_icdmain_csd_yyyymmdd.log

tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo

注:在磁盘空间允许的情况下,应先备份到本地服务器,然后再拷贝到磁带。出于速度方面的考虑,尽量不要直接备份到磁带设备。

 

用户模式

备份某个用户模式下的所有对象。业务数据库通常采用这种备份方式。

若备份到本地文件,使用如下命令:

exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0

file=exp_icdmain_yyyymmdd.dmp

log=exp_icdmain_yyyymmdd.log

若直接备份到磁带设备,使用如下命令:

exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0

file=/dev/rmt0

log=exp_icdmain_yyyymmdd.log

注:如果磁盘有空间,建议备份到磁盘,然后再拷贝到磁带。如果数据库数据量较小,可采用这种办法备份。

 

完全模式

备份完整的数据库。业务数据库不采用这种备份方式。备份命令为:

exp icdmain/icd rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0 full=y

file=exp_fulldb_yyyymmdd.dmp(磁带设备则为/dev/rmt0)

log=exp_fulldb_yyyymmdd.log

对于数据库备份,建议采用增量备份,即只备份上一次备份以来更改的数据。增量备份

命令:

exp icdmain/icd rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0 full=y inctype=incremental

file=exp_fulldb_yyyymmdd.dmp(磁带设备则为/dev/rmt0)

log=exp_fulldb_yyyymmdd.log

注:关于增量备份必须满足下列条件:

1. 只对完整数据库备份有效,且第一次需要full=y参数,以后需要inctype=incremental参数。

2. 用户必须有EXP_FULL_DATABASE的系统角色。

3. 话务量较小时方可采用数据库备份。

4. 如果磁盘有空间,建议备份到磁盘,然后再备份到磁带。

业务数据库备份方法及周期

EXP进行备份前,先在SYS用户下运行CATEXP.SQL文件(如果以前已运行该文件,则不要执行这个脚本)。

没有特殊说明,不允许在客户端执行备份命令。

 

备份命令参照表模式下的备份命令。

从磁盘文件备份到磁带

如果首先备份到本地磁盘文件,则需要转储到磁带设备上。

1. 若需查看主机上配置的磁带设备,使用如下命令:

lsdev -Cc tape

显示的结果如下例所示:

rmt0 Available 30-58-00-2,0 SCSI 4mm Tape Drive

rmt1 Defined  30-58-00-0,0 SCSI 4mm Tape Drive

标明Available的设备是可用的磁带设备。

2. 若需查看磁带存储的内容,使用如下命令:

tar -tvf /dev/rmt0

显示的结果如下例所示:

-rw-r--r-- 300 400 8089600 Jan 11 14:33:57 2001 exp_icdmain_20010111.dmp

如果显示类似如下内容,则表示该磁带存储的备份数据是从数据库直接备份到磁带上,而非从本地磁盘转储到磁带的备份文件,因此操作系统无法识别。

tar: 0511-193 An error occurred while reading from the media.

There is an input or output error.

tar: 0511-169 A directory checksum error on media; -267331077 not equal to 25626.

3. 对于新磁带或无需保留现存数据的磁带,使用如下命令:

tar -cvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp

注:A. 该命令将无条件覆盖磁带上的现存数据。

  B. 文件名不允许包含路径信息,如:/backup/exp_icdmain_yyyymmdd.dmp

4. 对于需要保留现存数据的磁带,使用如下命令:

tar -rvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp

注:该命令将文件exp_icdmain_yyyymmdd.dmp追加到磁带的末端,不会覆盖现存的数据。

特别强调:如果备份时是从数据库直接备份到磁带上,则不可再向该磁带上追加复制任何其他文件,否则该备份数据失效。

5. 若需将转储到磁带上的备份文件复制到本地硬盘,使用如下命令:

A. 将磁带上的全部文件复制到本地硬盘的当前目录

tar -xvf /dev/rmt0

B. 将磁带上的指定文件复制到本地硬盘的当前目录

tar -xvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp

备份时间安排

由于备份时对系统I/O有较大影响,所以,建议在晚上11点以后进行备份工作。

业务数据库Oracle版本的恢复,恢复方案需根据备份方案确定。由于业务数据库采用表备份和用户备份相结合的方案,所以业务数据库的恢复需根据实际情况采用表恢复和用户恢复相结合的方案。

 

恢复方案

数据库的逻辑恢复分为表恢复、用户恢复、完全恢复三种模式。

 

表模式

此方式将根据按照表模式备份的数据进行恢复。

A. 恢复备份数据的全部内容

若从本地文件恢复,使用如下命令:

imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=exp_icdmain_csd_yyyymmdd.dmp

log=imp_icdmain_csd_yyyymmdd.log

若从磁带设备恢复,使用如下命令:

imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0

log=imp_icdmain_csd_yyyymmdd.log

B. 恢复备份数据中的指定表

若从本地文件恢复,使用如下命令:

imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=exp_icdmain_cs

d_yyyymmdd.dmp

log=imp_icdmain_csd_yyyymmdd.log

tables=commoninformation,serviceinfo

若从磁带设备恢复,使用如下命令:

imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=/dev/rmt0

log=imp_icdmain_csd_yyyymmdd.log

tables=commoninformation,serviceinfo

 

用户模式

此方式将根据按照用户模式备份的数据进行恢复。

A. 恢复备份数据的全部内容

若从本地文件恢复,使用如下命令:

imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=exp_icdmain_yyyymmdd.dmp

log=imp_icdmain_yyyymmdd.log

若从磁带设备恢复,使用如下命令:

imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0

log=imp_icdmain_yyyymmdd.log

B. 恢复备份数据中的指定表

若从本地文件恢复,使用如下命令:

imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=exp_icdmain_yyyymmdd.dmp

log=imp_icdmain_yyyymmdd.log

tables=commoninformation,serviceinfo

若从磁带设备恢复,使用如下命令:

imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0

log=imp_icdmain_yyyymmdd.log

tables=commoninformation,serviceinfo

 

完全模式

如果备份方式为完全模式,采用下列恢复方法:

若从本地文件恢复,使用如下命令:

imp system/manager rows=y indexes=n commit=y buffer=65536

feedback=100000 ignore=y volsize=0 full=y

file=exp_icdmain_yyyymmdd.dmp

log=imp_icdmain_yyyymmdd.log

若从磁带设备恢复,使用如下命令:

imp system/manager rows=y indexes=n commit=y buffer=65536

feedback=100000 ignore=y volsize=0 full=y

file=/dev/rmt0

log=imp_icdmain_yyyymmdd.log

参数说明

1. ignore参数

Oracle在恢复数据的过程中,当恢复某个表时,该表已经存在,就要根据ignore参数的设置来决定如何操作。

ignore=yOracle不执行CREATE TABLE语句,直接将数据插入到表中,如果插入的记录违背了约束条件,比如主键约束,则出错的记录不会插入,但合法的记录会添加到表中。

ignore=nOracle不执行CREATE TABLE语句,同时也不会将数据插入到表中,而是忽略该表的错误,继续恢复下一个表。

2. indexes参数

在恢复数据的过程中,若indexes=n,则表上的索引不会被恢复,但是主键对应的唯一索引将无条件恢复,这是为了保证数据的完整性。

 

字符集转换

对于单字节字符集(例如US7ASCII),恢复时,数据库自动转换为该会话的字符集(NLS_LANG参数);对于多字节字符集(例如ZHS16CGB231280),恢复时,应尽量使字符集相同(避免转换),如果要转换,目标数据库的字符集应是输出数据库字符集的超集。

 

恢复方法

业务数据库采用表恢复方案。在用IMP进行恢复前,先在SYS用户下运行CATEXP.SQL文件(如果以前已运行该文件,则不要执行这个脚本),然后执行下列命令:

IMP ICDMAIN/ICD FILE=文件名 LOG=LOG文件名 ROWS=Y

COMMIT=Y BUFFER=Y IGNORE=Y TABLES=表名

注:要恢复的表名参照备份的表名

  恢复是在原表基础上累加数据

  没有特殊说明,不允许在客户端执行恢复命令

更多内容请登录:讯驰在线,www.xconnet.com

posted @ 2010-08-20 14:06 hackenliu 阅读(152) 评论(0) 编辑

.net 访问不同数据库之配置参数和参数数据类型

通过提供类型检查和验证,命令对象可使用参数来将值传递给 SQL 语句或存储过程。与命令文本不同,参数输入被视为文本值,而不是可执行代码。这样可帮助抵御“SQL 注入”攻击,这种攻击的攻击者会将命令插入 SQL 语句,从而危及服务器的安全。

参数化命令还可提高查询执行性能,因为它们可帮助数据库服务器将传入命令与适当的缓存查询计划进行准确匹配。有关更多信息,请参见 SQL Server 联机丛书中的 Execution Plan Caching and Reuse(执行计划的缓存和重用)和 Parameters and Execution Plan Reuse(重用参数和执行计划)。除具备安全和性能优势外,参数化命令还提供一种用于组织传递到数据源的值的便捷方法。

DbParameter 对象可以通过使用其构造函数来创建,或者也可以通过调用 DbParameterCollection 集合的 Add 方法以将该对象添加到 DbParameterCollection 来创建。Add 方法将构造函数实参或现有形参对象用作输入,具体取决于数据提供程序。

提供 ParameterDirection 属性

在添加参数时,您必须为输入参数以外的参数提供一个 ParameterDirection 属性。下表显示了可用于 ParameterDirection 枚举的 ParameterDirection 值。

成员名称

说明

Input

该参数为输入参数。这是默认设置。

InputOutput

该参数可执行输入和输出。

Output

该参数为输出参数。

ReturnValue

该参数表示从某操作(如存储过程、内置函数或用户定义的函数)返回的值。

使用参数占位符

参数占位符的语法取决于数据源。.NET Framework 数据提供程序处理命名和指定参数和参数占位符的方式各不相同。此语法是针对某个特定的数据源自定义的,如下表所述。

数据提供程序

参数命名语法

System.Data.SqlClient

@parametername 格式使用命名参数。

System.Data.OleDb

使用由问号 (?) 表示的位置参数标记。

System.Data.Odbc

使用由问号 (?) 表示的位置参数标记。

System.Data.OracleClient

:parmname(或 parmname)格式使用命名参数。

指定参数数据类型

Parameter 的数据类型是 .NET Framework 数据提供程序特定的。如果指定类型,则在向数据源传递 Parameter 的值之前,将该值转换为 .NET Framework 数据提供程序类型。也可以通过通用的方式指定 Parameter 的类型,方法是将 Parameter 对象的 DbType 属性设置为特定的 DbType

Parameter 对象的 .NET Framework 数据提供程序类型是从 Parameter 对象的 Value 的 .NET Framework 类型或从 Parameter 对象的 DbType 来推断的。下表显示了根据作为 Parameter 值传递的对象或指定的 DbType 推断出的 Parameter 类型。

.NET Framework 类型

DbType

SqlDbType

OleDbType

OdbcType

OracleType

bool

Boolean

Bit

Boolean

Bit

Byte

byte

Byte

TinyInt

UnsignedTinyInt

TinyInt

Byte

byte[]

Binary

VarBinary. 如果字节数组大于 VarBinary 的最大大小(8000 字节),此隐式转换将失败。对于大于 8000 字节的字节数组,请显式设置 SqlDbType

VarBinary

Binary

Raw

char

 

不支持从 char 推断 SqlDbType

Char

Char

Byte

DateTime

DateTime

DateTime

DBTimeStamp

DateTime

DateTime

DateTimeOffset

DateTimeOffset

SQL Server 2008 中的 DateTimeOffset。SQL Server 2008 以前的 SQL Server 版本不支持从 DateTimeOffset 推断 SqlDbType



DateTime

Decimal

Decimal

Decimal

Decimal

Numeric

Number

double

Double

Float

Double

Double

Double

float

Single

Real

Single

Real

Float

Guid

Guid

UniqueIdentifier

Guid

UniqueIdentifier

Raw

Int16

Int16

SmallInt

SmallInt

SmallInt

Int16

Int32

Int32

Int

Int

Int

Int32

Int64

Int64

BigInt

BigInt

BigInt

Number

object

Object

Variant

Variant

不支持从 Object 推断 OdbcType。

Blob

string

String

NVarChar。如果字符串大于 NVarChar 的最大大小(4000 个字符),此隐式转换将失败。对于大于 4000 个字符的字符串,请显式设置 SqlDbType

VarWChar

NVarChar

NVarChar

TimeSpan

Time

SQL Server 2008 中的 Time。SQL Server 2008 以前的 SQL Server 版本不支持从 TimeSpan 推断 SqlDbType

DBTime

Time

DateTime

UInt16

UInt16

不支持从 UInt16 推断 SqlDbType

UnsignedSmallInt

Int

UInt16

UInt32

UInt32

不支持从 UInt32 推断 SqlDbType

UnsignedInt

BigInt

UInt32

UInt64

UInt64

不支持从 UInt64 推断 SqlDbType

UnsignedBigInt

Numeric

Number

 

AnsiString

VarChar

VarChar

VarChar

VarChar

 

AnsiStringFixedLength

Char

Char

Char

Char

 

Currency

Money

Currency

不支持从 Currency 推断 OdbcType

Number

 

Date

SQL Server 2008 中的 Date。SQL Server 2008 以前的 SQL Server 版本不支持从 Date 推断 SqlDbType

DBDate

Date

DateTime

 

SByte

不支持从 SByte 推断 SqlDbType

TinyInt

不支持从 SByte 推断 OdbcType

SByte

 

StringFixedLength

NChar

WChar

NChar

NChar

 

Time

SQL Server 2008 中的 Time。SQL Server 2008 以前的 SQL Server 版本不支持从 Time 推断 SqlDbType

DBTime

Time

DateTime

 

VarNumeric

不支持从 VarNumeric 推断 SqlDbType

VarNumeric

不支持从 VarNumeric 推断 OdbcType

Number

说明说明

从小数转换到其他类型是缩窄转换,这种转换会将小数值舍入到最近的接近零的整数值。如果无法以目标类型表示转换结果,则会引发 OverflowException

说明说明

在向服务器发送一个空参数值时,用户必须指定 DBNull,而不是 null(Visual Basic 中的 Nothing)。系统中的 null 值是一个不具有任何值的空对象。DBNull 用于表示 null 值。有关数据库 null 值的更多信息,请参见处理 Null 值 (ADO.NET)

派生参数信息

还可以使用 DbCommandBuilder 类从存储过程派生参数。SqlCommandBuilderOleDbCommandBuilder 类都提供了静态方法 DeriveParameters,该静态方法将自动使用存储过程中的参数信息填充 Command 对象的 Parameters 集合。请注意,DeriveParameters 会覆盖此命令的任何现有参数信息。

说明说明

派生参数信息会影响性能,因为它需要对数据源进行额外的往返访问,以检索信息。如果参数信息在设计时是已知的,则可以通过显式设置参数来提高应用程序的性能。

有关更多信息,请参见使用 CommandBuilder 生成命令 (ADO.NET)

对 SqlCommand 和存储过程使用参数

在数据驱动的应用程序中,存储过程具有许多优势。通过利用存储过程,数据库操作可以包装在单个命令中,为获取最佳性能而进行优化并通过附加的安全性得到增强。尽管通过以 SQL 语句的形式传递存储过程名称后接参数自变量即可调用存储过程,但如果使用 ADO.NET DbCommand 对象的 Parameters 集合,则可以更加显式地定义存储过程参数并访问输出参数和返回值。

说明说明

参数化语句在服务器上通过使用 sp_executesql 执行,sp_executesql 允许重复使用查询计划。sp_executesql 批处理命令中的本地光标或变量对于调用 sp_executesql 的批处理命令是不可见的。数据库上下文中的更改只持续到 sp_executesql 语句的结尾。有关更多信息,请参见 SQL Server 联机丛书。

SqlCommand 使用参数以执行 SQL Server 存储过程时,添加到 Parameters 集合中的参数的名称必须与存储过程中参数标记的名称相匹配。SQL Server 的 .NET Framework 数据访问接口不支持问号 (?)用于将参数传递到 SQL 语句或存储过程的占位符。它将存储过程中的参数视为命名参数,并搜索匹配的参数标记。例如,通过使用名为 @CustomerID 的参数定义 CustOrderHist 存储过程。您的代码在执行该存储过程时,它也必须使用名为 @CustomerID 的参数。

CREATE PROCEDURE dbo.CustOrderHist @CustomerID varchar(5)

示例

此示例演示了如何调用 Northwind 示例数据库中的 SQL Server 存储过程。存储过程的名称为 dbo.SalesByCategory,它具有名为 @CategoryName 的输入参数,其数据类型为 nvarchar(15)该代码在 using 代码块内创建一个新 SqlConnection,以便在过程结束时释放连接。会创建 SqlCommandSqlParameter 对象,并设置其属性。SqlDataReader 会执行 SqlCommand 并从存储过程返回结果集,以在控制台窗口中显示相关输出。

说明说明

您可以选择使用任一重载构造函数在一个语句中设置多个属性,而不是创建 SqlCommandSqlParameter 对象,然后在各个语句中设置属性。


static void GetSalesByCategory(string connectionString,
    string categoryName)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create the command and set its properties.
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "SalesByCategory";
command.CommandType = CommandType.StoredProcedure;

// Add the input parameter and set its properties.
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@CategoryName";
parameter.SqlDbType = SqlDbType.NVarChar;
parameter.Direction = ParameterDirection.Input;
parameter.Value = categoryName;

// Add the parameter to the Parameters collection.
command.Parameters.Add(parameter);

// Open the connection and execute the reader.
connection.Open();
SqlDataReader reader = command.ExecuteReader();

if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}: {1:C}", reader[0], reader[1]);
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
}


对 OleDbCommand 或 OdbcCommand 使用参数

OleDbCommandOdbcCommand 使用参数时,添加到 Parameters 集合中的参数的顺序必须与在存储过程中定义的参数的顺序相匹配。OLE DB .NET Framework 数据提供程序和 ODBC .NET Framework 数据提供程序将存储过程中的参数视为占位符并且按顺序应用参数值。此外,返回值参数必须为添加到 Parameters 集合中的第一批参数。

OLE DB .NET Framework 数据提供程序和 ODBC .NET Framework 数据提供程序不支持在向 SQL 语句或存储过程传递参数时使用命名参数。在此情况下,必须使用问号 (?)占位符,如下面的示例所示。

SELECT * FROM Customers WHERE CustomerID = ?

因此,将 Parameter 对象添加到 Parameters 集合的顺序必须直接与参数的问号 (?) 占位符的位置相对应。

OleDb 示例

OleDbCommand command = new OleDbCommand("SampleProc", connection);
command.CommandType = CommandType.StoredProcedure;

OleDbParameter parameter = command.Parameters.Add(
"RETURN_VALUE", OleDbType.Integer);
parameter.Direction = ParameterDirection.ReturnValue;

parameter = command.Parameters.Add(
"@InputParm", OleDbType.VarChar, 12);
parameter.Value = "Sample Value";

parameter = command.Parameters.Add(
"@OutputParm", OleDbType.VarChar, 28);
parameter.Direction = ParameterDirection.Output;

Odbc 示例

OdbcCommand command = new OdbcCommand( _
  "{ ? = CALL SampleProc(?, ?) }", connection);
command.CommandType = CommandType.StoredProcedure;

OdbcParameter parameter = command.Parameters.Add( _
"RETURN_VALUE", OdbcType.Int);
parameter.Direction = ParameterDirection.ReturnValue;

parameter = command.Parameters.Add( _
"@InputParm", OdbcType.VarChar, 12);
parameter.Value = "Sample Value";

parameter = command.Parameters.Add( _
"@OutputParm", OdbcType.VarChar, 28);
parameter.Direction = ParameterDirection.Output;

posted @ 2010-08-20 10:26 hackenliu 阅读(124) 评论(0) 编辑