长期以来 我一直用的是 MS SQL Server / Access 数据库 通过 NET 访问 MS 自家的东西几乎没碰到过什么麻烦 最近项目中要用 Oracle 作为数据库 学习研究了一些 NET 访问 Oracle 的东西 发现问题倒真的不少 System Data OracleClient 和 System Data OleDb 命名空间 虽然通过这两个命名空间的类都可以访问 Oracle 数据库 但和 SQL Server 类似的(System Data SqlClient 命名空间的类效率要比 System Data OleDb 命名空间中的类高一些) System Data OracleClient 命名空间中的类要比 System Data OleDb 命名空间的类效率高一些(这一点我没有亲自验证 但大多数地方都会这么说 而且既然专门为 Oracle 作的东西理论上也应该专门作过针对性的优化) 当然还有另一点就是从针对性上说 System Data OracleClient 要更好一些 比如数据类型 System Data OleDb OleDbType 枚举中所列的就没有System Data OracleClient OracleType 枚举中的那些有针对性 另外 Oracle 的 Number 类型如果数字巨大 超出 NET 数据类型范围的情况中 就必须使用 System Data OracleClient 中的专门类 OracleNumber 类型 好了 不再赘述这两个的比较 下面主要讨论 System Data OracleClient 命名空间中的类型 即 ADO NET for Oracle Data Provider (数据提供程序) 数据库连接 无论是 System Data OleDb 还是 System Data OracleClient 访问 Oracle 都需要在 NET 运行的机器(ASP NET 中就是 Web 服务器)安装 Oracle 客户端组件 (这一点是和 MS 的两种数据库不同的 MS 的东西安装 MDAC: Microsoft Data Access Component 以上版本后 就无须再安装 SQL Server 客户端或者 Office 软件 就能访问 ) System Requirements ( )如用 System Data OracleClient 访问 Oracle 客户端组件版本应在 Oracle i Client Release ( )以上版本 MS 只确保访问 Oracle Oracle Oracle i 服务器时的情况 MDAC 以上 ( )如用 System Data OleDb 访问 Oracle 客户端组件版本 以上或 以上 MDAC 以上 如服务器为 Oracle i 以上 客户端组件版本应为 c 在 NET 运行的机器中 安装 Oracle 客户端 然后打开 Net Manager (Oracle i) / Easy Config (Oracle i) 按你以前的经验设置本地服务的映射(这里的服务名将用于数据库连接串) System Data OracleClient 中访问 Oracle 数据库的连接串是 User ID=用户名; Password=密码; Data Source=服务名 (上述为一般的连接串 详细的连接串项目可以在 System Data OracleClient OracleConnection ConnectionString 属性的文档中找到 ) System Data OleDb 中的访问 Oracle 数据库的连接串是 Provider=MSDAORA ; User ID=用户名; Password=密码; Data Source=服务名 Oracle 中的数据类型 Oracle 的数据类型和 SQL Server 相比 要 奇怪 一些 SQL Server 的大多数据类型很容易找到 NET 中比较接近的类型 Oracle 中的类型就离 NET 类型远了许多 毕竟 Oracle 是和 Java 亲近的数据库 number: 数字类型 一般是 Number(M N) M是有效数字 N是小数点后的位数(默认 ) 这个是按十进制说的 nvarchar : 可变长字符型(Unicode) 这个比较像 SQL Server 的 nvarchar(但不知 Oracle 为什么加了个 ) (去掉 n 为非 Unicode 的 下同 ) nchar: 定长字符型(Unicode) nclob: 写作文 的字段 存储大量字符(Unicode)时用 date: 日期类型 比较接近 SQL Server 的 datetime Oracle 中字段不能是 bit 或者 bool 之类的类型 一般是 number( ) 代替的 和 SQL Server 一样在 SQL 命令中 字符类型需要用单引号( )隔开 两个单引号( )是单引号的字符转义(比如 I m fat 写入一个 SQL 命令是 UPDATE SET = I m fat ) 比较特殊的是日期类型 比如要写入 : : 这个时刻需要如下写 UPDATE SET = TIMESTAMP : : 注意这里使用了 TIMESTAMP 关键字 并使用单引号隔开 另外请注意日期格式 上面的格式是可识别的 Oracle 识别的格式没有 SQL Server 那般多 这是和 SQL Server 不同的地方 顺便提一句 Access 中的日期类型是用井号(#)隔开的 UPDATE SET = # : : # 访问 Oracle 过程/函数( ) SQL Server 作程序时经常使用存储过程 Oracle 里也可以使用过程 还可以使用函数 Oracle 的过程似乎是不能有返回值的 有返回值的就是函数了(这点有些像 BASIC 函数/过程区分的很细致 SQL Server 存储过程是可以有返回值的)
NET 访问 Oracle 过程/函数的方法很类似于 SQL Server 例如 OracleParameter[] parameters = { new OracleParameter( ReturnValue OracleType Int ParameterDirection ReturnValue true DataRowVersion Default Convert DBNull ) new OracleParameter( 参数 OracleType NVarChar ) new OracleParameter( 参数 OracleType DateTime) new OracleParameter( 参数 OracleType Number ) }; parameters[ ] Value = test ; parameters[ ] Value = DateTime Now; parameters[ ] Value = ; // 也可以是 new OracleNumber( ); OracleConnection connection = new OracleConnection( ConnectionString ); OracleCommand mand = new OracleCommand( 函数/程名 connection); mand CommandType = CommandType StoredProcedure; foreach(OracleParameter parameter in parameters) mand Parameters Add( parameter ); connection Open(); mand ExecuteNonQuery(); int returnValue = parameters[ ] Value; //接收函数返回值 connection Close(); Parameter 的 DbType 设定请参见 System Data OracleClient OracleType 枚举的文档 比如 Oracle 数据库中 Number 类型的参数的值可以用 NET decimal 或 System Data OracleClient OracleNumber 类型指定 Integer 类型的参数的值可以用 NET int 或 OracleNumber 类型指定 等等 上面例子中已经看到函数返回值是用名为 ReturnValue 的参数指定的 该参数为 ParameterDirection ReturnValue 的参数 访问 Oracle 过程/函数 ( ) 不返回记录集(没有 SELECT 输出)的过程/函数 调用起来和 SQL Server 较为类似 但如果想通过过程/函数返回记录集 在 Oracle 中就比较麻烦一些了 在 SQL Server 中 如下的存储过程 CREATE PROCEDURE GetCategoryBooks ( @CategoryID int ) AS SELECT FROM Books WHERE CategoryID = @CategoryID GO 在 Oracle 中 请按以下步骤 *** 作 ( )创建一个包 含有一个游标类型 (一个数据库中只需作一次) CREATE OR REPLACE PACKAGE Test AS TYPE Test_CURSOR IS REF CURSOR; END Test; ( )过程 CREATE OR REPLACE PROCEDURE GetCategoryBooks ( p_CURSOR out Test Test_CURSOR 这里是上面包中的类型 输出参数 p_CatogoryID INTEGER ) AS BEGIN OPEN p_CURSOR FOR SELECT FROM Books WHERE CategoryID=p_CatogoryID; END GetCategoryBooks; ( ) NET 程序中 OracleParameters parameters = { new OracleParameter( p_CURSOR OracleType CURSOR ParameterDirection Output true DataRowVersion Default Convert DBNull) new OracleParameter( p_CatogoryID OracleType Int ) }; parameters[ ] Value = ; OracleConnection connection = new OracleConnection( ConnectionString ); OracleCommand mand = new OracleCommand( GetCategoryBooks connection); mand CommandType = CommandType StoredProcedure; foreach(OracleParameter parameter in parameters) mand Parameters Add( parameter ); connection Open(); OracleDataReader dr = mand ExecuteReader(); while(dr Read()) { // 你的具体 *** 作 这个就不需要我教吧? } connection Close(); 另外有一点需要指出的是 如果使用 DataReader 取得了一个记录集 那么在 DataReader 关闭之前 程序无法访问输出参数和返回值的数据 lishixinzhi/Article/program/Oracle/201311/17063
枚举与下拉列表主要用在某些状态值获取等,一般是数据量小,不需要在数据库中进行维护的数据集。
枚举变量只能针对无符号整型数据U32,U16,U8,而下拉列表则可以包括扩展精度,双精度,单精度,64位、长、双字节、单字节整型以及各种无符号整型。
枚举类型在使用中有以下规定:
1枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值: sun=5;mon=2;sun=mon; 都是错误的。
2 枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1, …,sat值为6。
数据库事务简介 数据库事务是由一组 SQL 语句组成的一个逻辑工作单元 您可以把事务看作是一组不可分的 SQL 语句 这些语句作为一个整体永久记录在数据库中或一并撤销 比如在银行帐户之间转移资金 一条 UPDATE语句将从一个帐户的资金总数中减去一部分 另一条 UPDATE语句将把资金加到另一个帐户中 减 *** 作和加 *** 作必须永久记录在数据库中 或者必须一并撤销 — 否则将损失资金 这个简单的示例仅使用了两条 UPDATE 语句 但一个更实际的事务可能包含许多 INSERT UPDATE和 DELETE 语句 要永久记录一个事务中的 SQL 语句的结果 您可以通过 MIT 语句来执行提交 要撤销 SQL 语句的结果 您可以使用 ROLLBACK 语句来执行回滚 这会把所有的行重设为它们原来的状态 只要您事先没有与数据库断开 则您在执行回滚之前所做的任何修改都将被撤销 您还可以设置一个保存点 以便将事务回滚至该特定的点 同时保持事务中的其他语句原封不动 使用数据库事务(主要针对)您可以使用 OracleTransaction 类的一个对象来表示一个事务 OracleTransaction 类包含多个属性 其中的两个为 Connection(指定与事务关联的数据库连接)和 IsolationLevel(指定事务隔离级别)Connection 指定与该事务关联的OracleConnection对象 IsolationLevel 指定该事务的IsolationLevel 枚举类型 用于对事物的锁定 取值有Chaos ReadCommited ReadUnmited RepeatableRead Serializable Unspecified 应用程序通过针对OracleConnection对象调用 BeginTransaction 来创建OracleTransaction对象 对OracleTransaction对象执行与该事务关联的所有后续 *** 作(例如提交或中止该事务) Commit:提交SQL数据库事务 Rollback :从挂起状态回滚事务 您还可以使用 Save() 在事务中设置一个保存点 下面的示例创建一个 OracleConnection 和一个 OracleTransaction 它还演示了如何使用 BeginTransaction Commit 和 Rollback 方法 (这是MSDN里的范例)需要注意的是 这些 *** 作需要引入命名空间: Oracle DataAcess ClientOracle DataAccess Client 命名空间是 ODP NET 的一部分 它包含许多类 其中有 OracleConnection OracleCommand 和 OracleTransaction 示例程序就用到了这些类 事务 *** 作 Public Sub RunOracleTransaction()Sub RunOracleTransaction(myConnString As String) Dim myConnection As New OracleConnection(myConnString) myConnection Open() Dim myCommand As OracleCommand = myConnection CreateCommand() Dim myTrans As OracleTransaction Start a local transaction myTrans = myConnection BeginTransaction(IsolationLevel ReadCommitted) Assign transaction object for a pending local transaction myCommand Transaction = myTrans Try myCommand CommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( TECHNOLOGY DENVER ) myCommand ExecuteNonQuery() myCommand CommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( ENGINEERING KANSAS CITY ) myCommand ExecuteNonQuery() myTrans Commit() Console WriteLine( Both records are written to database ) Catch e As Exception myTrans Rollback() Console WriteLine(e ToString()) Console WriteLine( Neither record was written to database ) Finally myConnection Close() End Try End Sub
在 NET 程序中设置事务保存点 正如本文前面所提到的那样 您可以设置一个保存点 以便将事务回滚至该特定的点 同时保持事务中的其他语句原封不动 您可以使用 OracleTransaction 类的 Save() 方法在事务中设置保存点 如果您有一个非常长的事务并且希望能够仅回滚到某个特定的时间点 那么您可能要使用保存点 例如 您可能想对 个产品做一些更改 然后设置一个保存点 然后再对另 个产品做更改 如果您在进行第二批更改时出现了错误 那么您可以回滚至保存点 使您的第一批更改原封不动 使用OracleTransaction对象需要注意的几点 )你需要在你整个事务执行中只能有唯一OracleConnection OracleCommand
OracleTransaction 也就是说如果你事务处理过程中如果需要与数据库的 *** 作都只能在这唯一的Command中执行 类似于:
imgCommand CommandText = sSQLimgCommand ExecuteNonQuery()或其他 *** 作若你新建一个连接执行其他数据库 *** 作的话 整个事务过程就会抛出异常 )如果你需要在你SQL语句中加入参数 则你必须在你执行完提交或相关数据库 *** 作之后将其Command的参数清空 下边举一个实际的项目里的事务函数 事务函数 <summary> 保存热点文本文件信息到数据库 </summary> Private Function SaveTextFile()Function SaveTextFile() As Boolean Dim sSQl As String sSQl = select type_id from sys_file_type where file_extname= TXT Try imgCommand CommandText = sSQl Dim typeID As Int = Convert ToInt (imgCommand ExecuteScalar()) 文件类型 读取文本信息 Dim Textblob() As Byte = GetText() sSQl = insert into t_watch_textcontent(image_id text_content type_id) values(:imageid :textcontent :typeid) 增添SQL参数 Dim Param As OracleClient OracleParameter Param = New OracleClient OracleParameter( imageid sNewImageID) imgCommand Parameters Add(Param) Param = New OracleClient OracleParameter( textcontent Textblob) imgCommand Parameters Add(Param) Param = New OracleClient OracleParameter( typeid typeID) imgCommand Parameters Add(Param) 提交信息 imgCommand CommandText = sSQl If imgCommand ExecuteNonQuery() > Then bResult = True 关键是这里 需要你手动清除参数 imgCommand Parameters Clear() End If Catch ex As Exception Me ExceptionMessage = ex bResult = False End Try Return bResult End Function lishixinzhi/Article/program/net/201311/12778
1、选中该表右键点击Design。
2、随便选中一个字段右键点击CheckConstraints,即可看到该表所有有枚举值的字段。。
3、在General处即可编辑枚举值,即可实现新增或者删除枚举值。
以上就是关于.NET访问Oracle数据库相关全部的内容,包括:.NET访问Oracle数据库相关、枚举与下拉列表主要用在什么场合、VB.NET使用OracleTransaction处理事务等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)