完整的 Sample 位于 ALinq 的安装目录下的子目录 Samples\CSharpe\OracleSamples.zip 或 Samples\VB\OracleSamples.zip 。
Sample 的使用:打开该工程,然后运行 Sample3_StoreProcedure ,然后点击 Create Procedure 按钮创建存储过程,在创建之存储过程之后,还需要对储存过程进行编译。
示例一
步骤一:在 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();