【问题标题】:Not all Variables Bound Oracle REST Web API并非所有变量都绑定 Oracle REST Web API
【发布时间】:2020-06-21 19:59:29
【问题描述】:

我得到 Not all variables Bound.

这是我的代码的样子。

public IEnumerable<VaultService> Get(string Branch_Desg)
{
    OracleConnection con = new OracleConnection(constr);
    con.Open();
    DataTable dt = new DataTable();
    //string sql = "select * from wemadummyvaulttable where branch_desg = " + Branch_Desg + "";
    string sql = "select BRANCH_ID ,BRANCH_NAME ,BRANCHID_NUMBER ,BRANCH_ACCOUNTNO ,BRANCH_DESG ,CURRENCY ,BRANCH_BALANCE from wemadummyvaulttable where Branch_Desg =" + ":Branch_Desg";

  OracleDataAdapter da = new OracleDataAdapter(sql, con);
    da.Fill(dt);
    List<VaultService> vr = new List<Models.VaultService>(dt.Rows.Count);
    if (dt.Rows.Count > 0)
    {
        foreach (DataRow vaultrecord in dt.Rows)
        {
            vr.Add(new ReadVaultBal(vaultrecord));
        }
    }
    return vr;
}

由于某种原因,它无法正常工作。

截图如下:

现在我的更新代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WEMAVaultREST.Models;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
using System.Data;

namespace WEMAVaultREST.Controllers
{
    public class VaultServiceController : ApiController
    {
        string constr = "User ID=system; Password=admin1234; Data Source=SAM;";
        // GET api/<controller>
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/<controller>/5
        public string Get(int id)
        {
            return "value";
        }

        // GET api/<controller>/5
        /* public VaultService Get(string Branch_Desg)
         {
             OracleConnection con = new OracleConnection(constr);
             con.Open();
             DataTable dt = new DataTable();

             string sql = "select * from wemadummyvaulttable where branch_desg = '"+Branch_Desg+"'";
             OracleDataAdapter da = new OracleDataAdapter(sql,con);
             da.Fill(dt);
             if (dt.Rows.Count > 0)
             {
                 return new ReadVaultBal(dt.Rows[0]);
             }
             throw new Exception("Account not found");
         }*/

        public IEnumerable<VaultService> Get(string Branch_Desg)
        {
            OracleConnection con = new OracleConnection(constr);
            con.Open();
            DataTable dt = new DataTable();
            //string sql = "select * from wemadummyvaulttable where branch_desg = " + Branch_Desg + "";
            string sql = "select BRANCH_ID ,BRANCH_NAME ,BRANCHID_NUMBER ,BRANCH_ACCOUNTNO ,BRANCH_DESG ,CURRENCY ,BRANCH_BALANCE from wemadummyvaulttable where Branch_Desg =" + ":Branch_Desg";

            var command = new OracleCommand(sql, con);
            command.Parameters.Add("Branch_Desg", Branch_Desg);
            OracleDataAdapter da = new OracleDataAdapter(command);
            da.Fill(dt);
            List<VaultService> vr = new List<Models.VaultService>(dt.Rows.Count);
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow vaultrecord in dt.Rows)
                {
                    vr.Add(new ReadVaultBal(vaultrecord));
                }
            }
            return vr;
        }


        // POST api/<controller>
        public void Post([FromBody]string value)
        {
        }

        // PUT api/<controller>/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/<controller>/5
        public void Delete(int id)
        {
        }
    }
}

这就是我现在所拥有的。如您所见,它在 Sqldeveloper 中返回。在代码中,它没有。我不知道从这里到哪里去。

如果我像这样运行 REST api:

http://localhost:7177/api/VaultService?Branch_Desg=Branch01

它返回这个

【问题讨论】:

  • 这是什么意思?我得到的不是所有变量都绑定
  • 它以 Exception.Oracle Exception 的形式返回
  • 能否提供完整的例外情况
  • @viveknuna Oracle.ManagedDataAccess.Client.OracleException: 'ORA-01008: 并非所有变量都绑定'
  • 这能回答你的问题吗? REST Calls return empty List From Oracle Database

标签: c# oracle rest


【解决方案1】:

换行试试

 OracleDataAdapter da = new OracleDataAdapter(sql, con);

 var command = new OracleCommand(sql, con);
    command.Parameters.Add("Branch_Desg", branchDesg);
    OracleDataAdapter da = new OracleDataAdapter(command);

似乎没有办法直接将绑定参数添加到OracleDataAdapter,所以我们必须先从SQL字符串创建一个OracleCommand,为参数:Branch_Desg添加一个值,然后创建来自命令的适配器。

最后,我能否建议所有 Oracle 资源(连接、命令和数据适配器)都被正确处理,通过在 using 块中创建它们,例如

使用 (OracleConnection con = new OracleConnection(constr))
{
    // 使用数据库连接'con'的代码
}

【讨论】:

  • 返回 [] 空集?你觉得Oracle数据库中的存储过程能用吗??
  • 如果它返回一个空集,那么 (a) 你传递了一个不在数据库中的 Branch_Desg 值,(b) 你已经使用这个表插入了一个合适的值诸如 SQLPlus 或 SQL Developer 之类的工具,但您尚未提交它,或者 (c) 您没有连接到您认为的数据库。如果您使用 SQLPlus 或 SQL Developer 等开发人员工具运行查询,您会得到预期的结果吗?
  • 我可以截取数据库并向您展示,以便您查看并让我找到正确的方向。请告知我是否应该这样做
  • 我使用 Sql 开发者,一旦我运行代码我得到结果,如果我在 Oracle 中发送,我什么也看不到
  • 我不确定是否有必要查看数据库的屏幕截图。了解BRANCH_DESG 列的类型(例如CHAR(...)VARCHAR2(...))会很有用,因为这似乎是导致问题的原因。
猜你喜欢
  • 2022-07-08
  • 2021-12-11
  • 2011-01-11
  • 2012-09-05
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
相关资源
最近更新 更多