【问题标题】:Odac ORA-00911: invalid characterOdac ORA-00911: 无效字符
【发布时间】:2012-12-16 11:37:18
【问题描述】:

我正在编写一个连接到 ODAC 的 C# 代码。我认为我的查询没有错误,但我收到此错误,我不知道如何解决。

这是我的查询

comm.CommandText = "SELECT * FROM ZAEDBA WHERE USER_ID = '" + login_id + 
                   "' AND APPID = '" + app_id + "' ;"; 

谁能弄清楚这里出了什么问题?

【问题讨论】:

  • 错误是什么? (顺便说一句,强制引用Little Bobby Tables。)
  • 在标题中,这是我的错误 ORA-00911: invalid character
  • login_id 和/或app_id 可能包含破坏(或滥用)您的查询的字符。 不要以这种方式构建查询。使用查询参数,而不是字符串连接。
  • 看来你的sql没有任何错误。您可以尝试获取 comm.CommandText 的文本,然后在 sqldeveloper 中尝试查询。
  • 我怎样才能使它成为参数方式?它是sql吗?还是odac有别的方法?

标签: c# sql odac oraclecommand


【解决方案1】:

您的查询容易受到名为 SQL injection! 的安全问题的影响!

您永远不应该使用字符串连接来从字符串(一些 SQL,一些参数)构建查询...始终使用参数化查询...

示例代码:

comm.BindByName = true;
comm.CommandText = "SELECT * FROM ZAEDBA WHERE USER_ID = :login_id AND APPID = :app_id";
comm.Parameters.AddWithValue ("login_id", login_id);
comm.Parameters.AddWithValue ("app_id", app_id);

【讨论】:

  • 我只是想看数据,然后我会参数化,我现在只想检查数据,测试 porposes
  • @X.L.Ant 它提供了 OP 工作代码......以及一些关于当前代码有什么问题的提示(即安全问题)......
  • 我会测试它并回复你
  • 它没有用,它给了我这个错误异常详细信息:System.IndexOutOfRangeException: Invalid index -1 for this OracleParameterCollection with Count=0..
【解决方案2】:

为什么你的sql命令中有;?试试这个;

comm.CommandText = "SELECT * FROM ZAEDBA WHERE USER_ID = '" + login_id + "' AND APPID = '" + app_id "';

顺便说一句,您应该始终使用参数化查询。这显然对 sql 注入开放。对于您的查询,请像这样使用;

string commandText = "SELECT * FROM ZAEDBA WHERE USER_ID = @login_id " + AND
        + "WHERE APPID  = @app_id;";

command.Parameters.Add("@login_id", SqlDbType.Int);
command.Parameters["@login_id"].Value = login_id;

command.Parameters.Add("@app_id", SqlDbType.Int);
command.Parameters["@app_id"].Value = app_id;

【讨论】:

  • 不,这是错误的,因为在 ODAC 中您将使用 : 而不是 @,并且在 addwithvalue 中您不应该添加 @
  • 是的,我假设这些是Int 的类型,它们曾经也使用Add() 方法。已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 2023-03-23
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多