zoukankan      html  css  js  c++  java
  • Linq to Oracle 存储过程使用(使用 MS ADO.NET Provider)

    点击这里返回目录

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

    点击这里返回目录

     

  • 相关阅读:
    text-overflow white-space word-break word-wrap word-spacing line-clamp 傻傻分不清楚0.0=>文本超出显示省略号/数字英文字母折行有关css 属性/显示两行,第二行省略号显示css方法
    jq 操作表单中 checkbox 全选 单选
    用 pdf.js兼容部分安卓显示PDF在线预览 时,a标签直接链接参数文件不能含中文的解决办法
    通过form实现enter事件
    小白随笔之数组的方法
    引用类型之Array
    Reset
    js常用事件
    让女朋友能懂的网络技术篇之动态代理
    图论之Dijkstra算法
  • 原文地址:https://www.cnblogs.com/ansiboy/p/2029126.html
Copyright © 2011-2022 走看看