我需要制作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();
答案 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();
}