【问题标题】:Handle Oracle Database Connection in Dapper在 Dapper 中处理 Oracle 数据库连接
【发布时间】:2020-01-15 18:00:13
【问题描述】:

我正在尝试连接到 Oracle 数据库并尝试执行查询。

下面是我的模型类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;

namespace TestAPI.Models
{
public class TestAPIModel
{
    [Key]
    public int PRIO_CATEGORY_ID { get; set; }
    public int LANG_ID { get; set; }
    public System.DateTime REC_DATE { get; set; }
    public int REC_USER { get; set; }
    public Nullable<int> RFCH_ID { get; set; }
    public string DESCR { get; set; }
    public string COL_DESCR { get; set; }
    public string ROW_DESCR { get; set; }
    public string ABBR { get; set; }
}
}

DBContext 类是

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace TestAPI.Models
{
public class TestAPIContext: DbContext
{
        public DbSet<TestAPIModel> details { get; set; }
}
}

现在尝试使用 Dapper 创建控制器,现在问题出在大多数论坛中,它试图连接到 SQL 数据库。我正在尝试访问 Oracle DB 并以 JSON 格式返回结果。所以如果我给了

using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Newtonsoft.Json;
using System.Web.Http.Description;
using TestAPI.Models;
using Dapper;

namespace TestAPI.Controllers
 {
  public class TestAPIModelsController : ApiController
   {
     // GET: api/TestAPIModels
    public IQueryable<TestAPIModel> Getdetails(int id)
    {
      OracleConnection dbConn = new OracleConnection("DATA SOURCE=AX;PASSWORD=CM;PERSIST SECURITY INFO=True;USER ID=AB");
      dbConn.Open();
      var strQuery = @"Select PRIO_CATEGORY_ID as PRIO,LANG_ID as LANG, REC_DATE as REC, REC_USER as RECUSER, DESCR,COL_DESCR AS COL,ROW_DESCR as DROW,ABBR from STCD_PRIO_CATEGORY_DESCR where REC_USER =  " +id;
      retrun dbConn.Query<TestAPIModel>();
      dbConn.Close();
  }
 }
}

它抛出一个错误,说 dbconn.Query 不在上下文中,我也尝试了 TestAPIContext.Init,即使它抛出了错误。谁能建议我如何处理 Oracle 与 Dapper 的连接。我是 ASP.NET 和创建服务的新手。有点卡住了,非常感谢任何帮助。

【问题讨论】:

  • 可能不是问题,但“rerun”应该改为“return”

标签: asp.net asp.net-mvc asp.net-web-api dapper


【解决方案1】:

您没有通过 SQL。此外,不需要显式关闭。您可以将代码包装在一个 using as 在 SqlConnection.Dispose() 调用 SqlConnection.Close() 的底层。

也许这是一个错字,但“rerun”应该是“return”。 Connectionstring 应该从 app.config 读取而不是硬编码,我也会考虑将 'id' 作为参数。

using (var dbConn = new OracleConnection("DATA SOURCE=AX;PASSWORD=CM;PERSIST SECURITY INFO=True;USER ID=AB"))
{
      dbConn.Open();
      var strQuery = @"Select PRIO_CATEGORY_ID as PRIO,LANG_ID as LANG, REC_DATE as REC, REC_USER as RECUSER, DESCR,COL_DESCR AS COL,ROW_DESCR as DROW,ABBR from STCD_PRIO_CATEGORY_DESCR where REC_USER = " +id;
      return dbConn.Query<TestAPIModel>(strQuery);
}

【讨论】:

  • 谢谢威廉姆斯。但是代码在 var queryResult = dbConn.Query(); 中抛出错误错误当前上下文中不存在名称“queryReult”。同样在返回查询 Result as Error 方法 'Query' 没有重载。那是因为类中的类型不是字符串而是 public IQueryable Getdetails(int id)
  • 对,原样返回。
【解决方案2】:

我可以通过以下解决方案处理这个问题:

1. 从 nuget 安装 Oracle.ManagedDataAccess.Core 包。
2. 编写 ConnectionString 如下:

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521))(CONNECT_DATA=(SID=sidName))); User Id=*****; Password=******;

PORT=1521 => Oracle 的默认端口是 1521,您可以使用您的 Oracle 服务器端口更改它
0.0.0.0 => Oracle 服务器 IP 或名称
sidName => oracle 服务器的 SidName

3. C# sn-p 代码:

protected IDbConnection GetChargingOracleDbConnection
{
    get
    {
        var oracleConnection = new OracleConnection("OracleConnectionString");
        oracleConnection.Open();
        return oracleConnection;
    }
}

var query = "SELECT Id, Name FROM Service";
using (var dbConnection = GetChargingOracleDbConnection)
{
    return dbConnection.Query<MyModel>(query).ToList();
}

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多