使用下面的代码,我在调用ExecuteReader时会得到“ORA-01036: 非法变量名/数字”的错误:
我希望您能够用查询结果填充列表。在DevArt的文档(或谷歌)中,我没有看到任何相关示例。使用Oracle的ODP组件,可以实现该功能:
我收到的错误消息被附加为注释,出现在它们发生的行下面。
cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);
cmd.Parameters["cur"].Direction = ParameterDirection.Output;
Devart.Data.Oracle.OracleCursor oraCursor =
(Devart.Data.Oracle.OracleCursor)cmd.Parameters["cur"].Value;
Devart.Data.Oracle.OracleDataReader odr = cmd.ExecuteReader();
while (odr.Read()) {
ACurrentUserRoles.Add(odr.GetString(0));
}
我希望您能够用查询结果填充列表。在DevArt的文档(或谷歌)中,我没有看到任何相关示例。使用Oracle的ODP组件,可以实现该功能:
OracleDataReader odr = cmd.ExecuteReader();
while (odr.Read())
{
ACurrentUserRoles.Add(odr.GetString(0));
}
...但是找不到与 DotConnect 组件并行工作的方法。
更新:
好的,这里是整个方法(ACurrentUserRoles 是一个字符串列表):
public void PopulateCurrentUserRoles(String AUserName, List<String> ACurrentUserRoles) {
_UserName = AUserName;
String query = "select roleid from ABCrole where ABCid = :ABCID";
Devart.Data.Oracle.OracleCommand cmd = new Devart.Data.Oracle.OracleCommand(query, con);
cmd.CommandType = CommandType.Text;
int _ABCID = GetABCIDForUserName();
cmd.Parameters.Add("ABCID", _ABCID);
cmd.Parameters["ABCID"].Direction = ParameterDirection.Input;
cmd.Parameters["ABCID"].DbType = DbType.String;
cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);
cmd.Parameters["cur"].Direction = ParameterDirection.Output;
//cmd.ExecuteNonQuery(); blows up: "illegal variable name/number"
//cmd.ExecuteCursor(); " "
//cmd.ExecuteReader(); " "
Devart.Data.Oracle.OracleCursor oraCursor =
(Devart.Data.Oracle.OracleCursor)cmd.Parameters["cur"].Value;
Devart.Data.Oracle.OracleDataReader odr = oraCursor.GetDataReader(); // "Object reference not set to an instance of an object"
while (odr.Read()) {
ACurrentUserRoles.Add(odr.GetString(0));
}
}
我收到的错误消息被附加为注释,出现在它们发生的行下面。
cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);
和cmd.Parameters["cur"].Direction = ParameterDirection.Output;
,然后重新启用带有 ExecuteReader() 的那一行代码。 - Steve