知识大全 在.Net中使用Oracle的表类型和对象类型
Posted 类型
篇首语:针越用越明,脑越用越灵。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在.Net中使用Oracle的表类型和对象类型相关的知识,希望对你有一定的参考价值。
在.Net中使用Oracle的表类型和对象类型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在一般的数据存取操作过程中 如果要对一个主表和对应的子表进行插入操作 那么我们最常见的写法就是写两个存储过程或者SQL语句 一个负责主表数据插入 一个负责子表数据插入 然后在一个事务中实现主表和子表数据的插入
现在遇到一个问题是 能否在一个存储过程中实现主表和子表数据的插入呢?那么就需要将一对多的数据作为存储过程的参数传入 这种情况下就需要使用表类型 下面以一个学生和班级的例子来说明
先建立一个班级表和一个学生表 一个班级里面有多个学生
CREATE TABLE CLASS
(
CLASSID NUMBER ( ) PRIMARY KEY
CLASSNAME VARCHAR ( BYTE) NOT NULL
)
CREATE TABLE STUDENT
(
STUID NUMBER( ) PRIMARY KEY
CLASSID NUMBER( ) NOT NULL
STUNAME NVARCHAR ( ) NOT NULL
STUGENDER CHAR( BYTE)
STUBIRTHDAY DATE
DESCRIPTION NVARCHAR ( )
)
CREATE SEQUENCE CLASSID
CREATE SEQUENCE STUDENTID
首先我们需要在Oracle中创建一个学生的对象类型 这个对象类型中就是学生的属性
CREATE OR REPLACE type StudentType as object
(
StuName nvarchar ( )
StuGender char( )
StuBirthday date
StuDescription nvarchar ( )
);
接下来是将这个学生类型创建成表类型
CREATE OR REPLACE type StuList as table of StudentType;
接下来就是写我们的一个插入存储过程 将班级和学生列表作为参数传入 具体脚本为
CREATE OR REPLACE PROCEDURE ZY AddClassStudent(
ClassName in varchar
Students in StuList
) IS
BEGIN
insert into Class values(classid nextval ClassName);
insert into Student(StuID ClassID StuName Stugender Stubirthday Description)
select studentid nextval classid currval StuName StuGender StuBirthday studescription
from TABLE(Students);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
RAISE;
END AddClassStudent;
现在Oracle服务器上的各个对象已经创建完成 接下来就是要编写C#代码 连接到Oracle数据库 插入数据了
在C#项目中添加Oracle DataAccess的引用 这是Oracle为 Net开发的类库 可以从官网下载 添加引用后 再添加命名空间
using Oracle DataAccess Types;
using Oracle DataAccess Client;
然后再创建Student对应的类
public class Student : IOracleCustomType
#region IOracleCustomType Members
public void FromCustomObject(Oracle DataAccess Client OracleConnection con IntPtr pUdt)
if (StudentName != null)
OracleUdt SetValue(con pUdt STUNAME StudentName);
else
throw new NullReferenceException( STUNAME is null );
OracleUdt SetValue(con pUdt STUGENDER Gender);
OracleUdt SetValue(con pUdt STUBIRTHDAY Birthday);
OracleUdt SetValue(con pUdt STUDESCRIPTION Description);
public void ToCustomObject(Oracle DataAccess Client OracleConnection con IntPtr pUdt)
StudentName = (String)OracleUdt GetValue(con pUdt STUNAME );
Gender = (String)OracleUdt GetValue(con pUdt STUGENDER );
Birthday = (DateTime)OracleUdt GetValue(con pUdt STUBIRTHDAY );
Description = (String)OracleUdt GetValue(con pUdt STUDESCRIPTION );
#endregion
[OracleObjectMappingAttribute( STUNAME )]
public String StudentName get; set;
[OracleObjectMapping( STUGENDER )]
public string Gender get; set;
[OracleObjectMapping( STUBIRTHDAY )]
public DateTime Birthday get; set;
[OracleObjectMapping( STUDESCRIPTION )]
public string Description get; set;
并添加Student类对应Oracle对象类型的映射 通过Attribute来指定
[OracleCustomTypeMappingAttribute( STUDENTTYPE )]
public class StudentFactory : IOracleCustomTypeFactory
#region IOracleCustomTypeFactory Members
public IOracleCustomType CreateObject()
return new Student();
#endregion
现在StudentType类型已经创建完成 接下来就是创建StuList类型对应的类
[OracleCustomTypeMappingAttribute( STULIST )]
public class StudentList_TabFactory : IOracleArrayTypeFactory
#region IOracleArrayTypeFactory Members
public Array CreateArray(int numElems)
return new Student[numElems];
public Array CreateStatusArray(int numElems)
return null;
#endregion
这里可以看到 返回的是Student的数组 现在准备工作都已经完成 接下来就是初始化一点数据 然后调用存储过程了 代码如下
Student s = new Student() StudentName = 张三 Birthday = Convert ToDateTime( / / ) Gender = M Description = HAHA ;
Student s = new Student() StudentName = 李四 Birthday = Convert ToDateTime( / / ) Gender = F Description = A ;
Student s = new Student() StudentName = 王五 Birthday = Convert ToDateTime( / / ) Gender = M Description = B ;
Student s = new Student() StudentName = 小月月 Birthday = Convert ToDateTime( / / ) Gender = F Description = C ;
List<Student> ss = new List<Student>();
ss Add(s );
ss Add(s );
ss Add(s );
ss Add(s );
string conn = Data Source=BRDWDEV;User Id=zy;Password= ; ;
using (OracleConnection oc = new OracleConnection(conn))
oc Open();
OracleCommand cmd = oc CreateCommand();
cmd CommandType = System Data CommandType StoredProcedure;
cmd CommandText = ZY ADDCLASSSTUDENT ;
OracleParameter p = new OracleParameter();
p OracleDbType = OracleDbType Varchar ;
p UdtTypeName = CLASSNAME ;
p Value = 测试班级名 ;
p Direction = ParameterDirection Input;
cmd Parameters Add(p );
OracleParameter p = new OracleParameter();
p OracleDbType = OracleDbType Array;
p Direction = ParameterDirection Input;
p UdtTypeName = STULIST ;//注意这里是类型 而不是参数名
p Value = ss ToArray();//注意这里应该是数组
cmd Parameters Add(p );
int count = cmd ExecuteNonQuery();
Console WriteLine(count);
oc Close();
cha138/Article/program/Oracle/201311/16524
相关参考
Oracle中构造包含数组的表 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 面向对象数据库中存
查找表的所有索引(包括索引名类型构成列) selectt*iindex_typefromuser_ind_columnstuser_indexesiwheretindex_name=iindex
Oracle中NUMBER类型问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Oracle
Oracle中CHAR类型自动补足空格的问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在O
在.NET程序中正确使用String类型[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb
在.NET程序中正确使用String类型[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb
个人经验总结:在Oracle中恢复被DROP掉的表 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
ORACLE中存取LONG类型字段的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ORAC
知识大全 ORACLE *Graphics中不同类型图形切换的实现
ORACLE*Graphics中不同类型图形切换的实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
用JSP处理Oracle中CLOB类型的字段 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! CL