我是使用Oracle on .NET的新手。我以前使用过SQL并且没有遇到过这个问题。 我有一个Oracle服务器,我用这个连接字符串连接:
<add key="Test" value="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=xxx))); User Id=xxxxxxx;Password=xxxxxx;"/>
private OracleConnection Testconnection = new OracleConnection((string)new System.Configuration.AppSettingsReader().GetValue("Test", typeof(string)));
然后,我打开连接,检查它是否被打开(它是)并尝试执行以下oracle命令。
var accountOpenDate = new OracleCommand("select creationDate from tbl_user where id=:userid", this.Testconnection);
getIsbAaccountOpenDate.Parameters.Add(":userid", this.IsbUserId);
string isbAccountOpenDate = getIsbAaccountOpenDate.ExecuteNonQuery().ToString();
Oracle命令是正确的,当我在sql developer中执行它时,它可以工作,但是当我执行代码时,isbAccountOpenDate的值为-1。 我已经尝试了一切,所以不知道该怎么做。
提前致谢
答案 0 :(得分:1)
我不是ODP专家,但我认为这是你的问题: 该
getIsbAaccountOpenDate.Parameters.Add(":userid", this.IsbUserId);
. ^
在SQL语句中使用冒号来标识绑定变量,以便SQL编译器知道不在其范围内查找名为USERID
的内容。但它不是名称的一部分。如果从参数赋值中删除冒号,则代码应该起作用。或者至少因其他原因而失败:)
顺便说一句,您发出的是SELECT语句,为什么要起诉executeNonQuery()
?那不应该是executeScalar()
吗? (对于返回多个记录的查询,它应该是executeReader()
。)
答案 1 :(得分:0)
虽然您必须使用冒号来识别SQL脚本中的参数,但它不是参数名称的一部分。此外,返回数据库标量值的正确方法是ExecuteScalar
。这可以解决您的问题:
var stm = "SELECT creationDate FROM tbl_user WHERE id=:userid;";
var cmd = new OracleCommand(stm, this.Testconnection);
cmd.Parameters.Add("userid", this.IsbUserId);
var result = (string) cmd.ExecuteScalar();
您可以在MSDN中找到有关System.Data.OracleClient
的完整参考:OracleParameterCollection,OracleCommand.ExecuteScalar,OracleCommand.ExecuteNonQuery。