代码改变世界

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

2011-04-26 11:48  麦舒  阅读(951)  评论(0编辑  收藏  举报

点击这里返回目录

完整的 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();

点击这里返回目录