使用odac连接到远程oracle数据库

时间:2015-07-10 06:51:31

标签: c# oracle

我需要制作asmx网络服务。我从here

安装了ODAC

然后,我添加对我的项目的引用: 1)Oracle.DataAccess 2)Oracle.Web

[WebMethod]
public string EaaTest(string r_object_id)
{
    string connString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" +
        "(HOST=my host)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=dcmt)));" +
        "User Id=my id ;Password=my password;"

    using (OracleConnection conn = new OracleConnection(connString))
    {
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = conn;
        cmd.CommandText = string.Format("select DSS_TITLE_RU from DBREP36.DDT_DA_DIRECTION_S where R_OBJECT_ID=0", r_object_id);
        cmd.CommandType = CommandType.Text;
        OracleDataReader dr = cmd.ExecuteReader();
        dr.Read();
        string result = dr.GetString(0);
        return result;
    }
}

现在,我有例外:

  

发生了'System.InvalidOperationException'类型的异常   Oracle.DataAccess.dll但未在用户代码中处理

     

附加信息:此操作必须打开连接

On line: OracleDataReader dr = cmd.ExecuteReader();

1 个答案:

答案 0 :(得分:1)

错误消息根本不清楚

  

此操作必须打开连接

您需要在执行命令之前打开连接。

conn.Open();
OracleDataReader dr = cmd.ExecuteReader();

使用using语句按照您的连接方式处理命令和阅读器。

顺便说一句,您没有在string.Format中指定零索引。您的

where R_OBJECT_ID=0

应该是

where R_OBJECT_ID = {0}

作为更好的选择,请使用parameterized queries。任何类型的字符串连接都可以用于SQL Injection攻击。

由于您只返回第一行的第一列,请使用ExecuteScalar而不是 这是什么。

using(var conn = new OracleConnection(connString))
using(var cmd = conn.CreateCommand())
{
    cmd.CommandText = @"select DSS_TITLE_RU from DBREP36.DDT_DA_DIRECTION_S
                        where R_OBJECT_ID = @id";
    cmd.Parameters.AddWithValue(@id, r_object_id);
    conn.Open();
    return (string)cmd.ExecuteScalar();
}