Linq to Oracle 存储过程使用(使用 MS ADO.NET Provider)

点击这里返回目录

完整的 Sample 位于 ALinq 的安装目录下的子目录 Samples\CSharpe\OracleSamples.zip 或 Samples\VB\OracleSamples.zip 。

Sample 的使用:打开该工程,然后运行 Sample3_StoreProcedure ,然后点击 Create Procedure 按钮创建存储过程,在创建之存储过程之后,还需要对储存过程进行编译。

Linq to Oracle 存储过程使用(使用 MS ADO.NET Provider)_第1张图片

 

示例一

步骤一:在 Oracle 数据库中创建以下存储过程

  
  
PROCEDURE ADD_CATEGORY(CATEGORY_ID IN INT , CATEGORY_NAME IN VARCHAR ,
CATEGORY_DESCRIPTION IN VARCHAR )
IS
BEGIN
INSERT INTO CATEGORIES (CategoryID,CategoryName, Description)
Values (category_id, category_name, category_description);
END ADD_CATEGORY;

步骤二:将存储过程影射到 DataContext 实体类中的方法函数。

  
  
[Function(Name = " ADD_CATEGORY " )]
public void AddCategory(
[Parameter(Name
= " CATEGORY_ID " )] int id,
[Parameter(Name
= " CATEGORY_NAME " )] string name,
[Parameter(Name
= " CATEGORY_DESCRIPTION " )] string description)
{
ExecuteMethodCall(
this , (MethodInfo)MethodBase.GetCurrentMethod(), id, name, description);
}

由于存储过程有三个参数,因此该方法函数也必须有三个参数。

步骤三:调用方法函数

  
  
var db = CreateDatabaseInstance();
var categoryID
= db.Categories.Max(o => o.CategoryID) + 1 ;
db.AddCategory(categoryID, txtCategoryName.Text,
" Description " );

 

示例二:

步骤一:在 Oracle 数据库中创建以下存储过程

  
  
PROCEDURE GET_CATEGORIES_COUNT(RETURN_VALUE OUT INT )
IS
BEGIN
SELECT COUNT ( * ) INTO RETURN_VALUE
FROM CATEGORIES;
END GET_CATEGORIES_COUNT;

步骤二:将存储过程影射到 DataContext 实体类中的方法函数。

  
  
[Function(Name = " GET_CATEGORIES_COUNT " )]
public void GetCategoriesCount(
[Parameter(Name
= " RETURN_VALUE " )] out int count)
{
count
= 0 ;
var result
= ExecuteMethodCall( this , (MethodInfo)MethodBase.GetCurrentMethod(), count);
count
= ( int )result.GetParameterValue( 0 );
}

由于对应的存储过程的参数只有一个,并且是用于返回值的(RETURN_VALUE OUT INT)。因此,对应的函数参数也要标记为 out 。

步骤三:调用方法函数

  
  
var db = CreateDatabaseInstance();
int count;
db.GetCategoriesCount(
out count);

 

示例三:

步骤一:在 Oracle 数据库中创建以下存储过程

  
  
PROCEDURE GET_CATEGORY_NAME(CATEGORY_ID INT , RETURN_VALUE OUT VARCHAR )
IS
BEGIN
SELECT CATEGORYNAME INTO RETURN_VALUE
FROM CATEGORIES
WHERE CATEGORYID = CATEGORY_ID;
END GET_CATEGORY_NAME;

步骤二:将存储过程影射到 DataContext 实体类中的方法函数。

  
  
[Function(Name = " GET_CATEGORY_NAME " )]
public void GetCategoryName(
[Parameter(Name
= " CATEGORY_ID " , DbType = " INTEGER " )] int id,
[Parameter(Name
= " RETURN_VALUE " , DbType = " VARCHAR(30) " )] out string name)
{
name
= null ;
var result
= ExecuteMethodCall( this , (MethodInfo)MethodBase.GetCurrentMethod(), id, name);
name
= ( string )result.GetParameterValue( 1 );
}

步骤三:调用方法函数

  
  
var categoryID = Convert.ToInt32(txtCategorID.Text);
var db
= CreateDatabaseInstance();
string categoryName;
db.GetCategoryName(categoryID,
out categoryName);

 

示例四:

步骤一:在 Oracle 数据库中创建以下 Package 以及存储过程

  
  
PACKAGE PKG1 IS
TYPE MYTYPE
IS REF CURSOR ;
PROCEDURE GET_ALL_CATEGORIES(MYCS OUT MYTYPE);
END PKG1;

                  

  
  
PACKAGE BODY PKG1 IS
PROCEDURE GET_ALL_CATEGORIES(MYCS OUT MYTYPE) IS
BEGIN
OPEN MYCS FOR SELECT CATEGORYID, CATEGORYNAME, DESCRIPTION
FROM CATEGORIES;
END GET_ALL_CATEGORIES;
END PKG1;

该存储过程用来获取 Categories 表中的全部数据。

步骤二:将存储过程影射到 DataContext 实体类中的方法函数。

  
  
[Function(Name = " PKG1.GET_ALL_CATEGORIES " )]
public ISingleResult < Category > GetAllCategories(
[Parameter(Name
= " MYCS " , DbType = " REF CURSOR " )] out object myrc)
{
myrc
= null ;
var result
= ExecuteMethodCall( this , (MethodInfo)MethodBase.GetCurrentMethod(), myrc);
return (ISingleResult < Category > )result.ReturnValue;
}

注意: 如果存储函数参数为游标类型,DbType 不能省略,并且 CLR 类型为 Object 类型。

步骤三:调用方法函数

  
  
var db = CreateDatabaseInstance();
object mycs;
var categories
= db.GetAllCategories( out mycs);

  

示例五:

步骤一:在 Oracle 数据库中创建以下 Package 以及存储过程

这存储过程用来获取数据库中的所有 Categories 和 Products 。

  
  
PACKAGE BODY PKG3 IS
PROCEDURE GET_CATEGORIES_AND_PRODUCTS(MYCS1 OUT MYTYPE1, MYCS2 OUT MYTYPE2) IS
BEGIN
OPEN MYCS1 FOR SELECT CATEGORYID, CATEGORYNAME, DESCRIPTION
FROM CATEGORIES;
OPEN MYCS2 FOR SELECT PRODUCTID, PRODUCTNAME
FROM PRODUCTS;
END GET_CATEGORIES_AND_PRODUCTS;
END PKG3;

步骤二:将存储过程影射到 DataContext 实体类中的方法函数。

  
  
[Function(Name = " PKG3.GET_CATEGORIES_AND_PRODUCTS " )]
[ResultType(
typeof (Category))]
[ResultType(
typeof (Product))]
public virtual IMultipleResults GetCategoriesAndProducts(
[Parameter(Name
= " MYCS1 " , DbType = " CURSOR " )] out object myrc1,
[Parameter(Name
= " MYCS2 " , DbType = " CURSOR " )] out object myrc2)
{
myrc1
= null ;
myrc2
= null ;

var result
= ExecuteMethodCall( this , (MethodInfo)MethodBase.GetCurrentMethod(), myrc1, myrc2);
return (IMultipleResults)result.ReturnValue;
}

  

步骤三:调用方法函数

   
   
var result = db.GetCategoriesAndProducts( out cursor1, out cursor2);
var categories
= result.GetResult < Category > ().ToArray();
var products
= result.GetResult < Product > ().ToArray();

点击这里返回目录

 

你可能感兴趣的:(Provider)