熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

在.Net中使用Oracle的表類型和對象類型

2013-11-13 12:45:22  來源: Oracle 

  在一般的數據存取操作過程中如果要對一個主表和對應的子表進行插入操作那麼我們最常見的寫法就是寫兩個存儲過程或者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 ZYAddClassStudent(

  ClassName in varchar

  Students in StuList

  ) IS

  BEGIN

  insert into Class values(classidnextvalClassName);

  insert into Student(StuIDClassIDStuNameStugenderStubirthdayDescription)

  select studentidnextvalclassidcurrvalStuNameStuGenderStuBirthdaystudescription

  from TABLE(Students);

  EXCEPTION

  WHEN NO_DATA_FOUND THEN

  NULL;

  WHEN OTHERS THEN

  RAISE;

  END AddClassStudent;

  現在Oracle服務器上的各個對象已經創建完成接下來就是要編寫C#代碼連接到Oracle數據庫插入數據了

  在C#項目中添加OracleDataAccess的引用這是Oracle為Net開發的類庫可以從官網下載添加引用後再添加命名空間

  using OracleDataAccessTypes;

  using OracleDataAccessClient;

  然後再創建Student對應的類

  public class Student : IOracleCustomType

  {

  #region IOracleCustomType Members

  public void FromCustomObject(OracleDataAccessClientOracleConnection con IntPtr pUdt)

  {

  if (StudentName != null)

  OracleUdtSetValue(con pUdt STUNAME StudentName);

  else

  throw new NullReferenceException(STUNAME is null);

  OracleUdtSetValue(con pUdt STUGENDER Gender);

  OracleUdtSetValue(con pUdt STUBIRTHDAY Birthday);

  OracleUdtSetValue(con pUdt STUDESCRIPTION Description);

  }

  public void ToCustomObject(OracleDataAccessClientOracleConnection con IntPtr pUdt)

  {

  StudentName = (String)OracleUdtGetValue(con pUdt STUNAME);

  Gender = (String)OracleUdtGetValue(con pUdt STUGENDER);

  Birthday = (DateTime)OracleUdtGetValue(con pUdt STUBIRTHDAY);

  Description = (String)OracleUdtGetValue(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 = ConvertToDateTime(//) Gender = M Description = HAHA };

  Student s = new Student() { StudentName = 李四 Birthday = ConvertToDateTime(//) Gender = F Description = A };

  Student s = new Student() { StudentName = 王五 Birthday = ConvertToDateTime(//) Gender = M Description = B };

  Student s = new Student() { StudentName = 小月月 Birthday = ConvertToDateTime(//) Gender = F Description = C };

  List<Student> ss = new List<Student>();

  ssAdd(s);

  ssAdd(s);

  ssAdd(s);

  ssAdd(s);

  string conn = Data Source=BRDWDEV;User Id=zy;Password=;;

  using (OracleConnection oc = new OracleConnection(conn))

  {

  ocOpen();

  OracleCommand cmd = ocCreateCommand();

  cmdCommandType = SystemDataCommandTypeStoredProcedure;

  cmdCommandText = ZYADDCLASSSTUDENT;

  OracleParameter p = new OracleParameter();

  pOracleDbType = OracleDbTypeVarchar;

  pUdtTypeName = CLASSNAME;

  pValue = 測試班級名;

  pDirection = ParameterDirectionInput;

  cmdParametersAdd(p);

  OracleParameter p = new OracleParameter();

  pOracleDbType = OracleDbTypeArray;

  pDirection = ParameterDirectionInput;

  pUdtTypeName = STULIST;//注意這裡是類型而不是參數名

  pValue = ssToArray();//注意這裡應該是數組

  cmdParametersAdd(p);

  int count = cmdExecuteNonQuery();

  ConsoleWriteLine(count);

  ocClose();

  }

  以此類推其實還可以把班級建立對象類型然後再建立班級列表類型這樣就可在一個存儲過程中插入多個班級每個班級多個學生的數據


From:http://tw.wingwit.com/Article/program/Oracle/201311/16524.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.