Linq to Oracle 存储过程使用(使用 MS ADO.NET Provider)
2011-04-26 11:48 麦舒 阅读(958) 评论(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();