【问题标题】:C# Query commands SQL with quotesC# 查询命令 SQL 带引号
【发布时间】:2015-07-03 09:51:32
【问题描述】:

我想用 c# 从 Oracle 数据库中获取数据。问题是名为“DATE”和“HOUR”的两列是 SQL/Oracle 表达式。

这是我的查询命令:

command.CommandText = @"SELECT BOXID, PUMP_BIT, DATE, HOUR, RUN_DURATION, POWER_ONS FROM PUMP_AGG_HOURLY WHERE BOXID = " + tb_BoxIDAktuell.Text + " AND PUMP_BIT = " + BitPumpe1 + " ORDER BY DATE, HOUR";

为了测试,我为 DATE 和 HOUR 列加上引号,并且 SQL 语句在 Oracle SQL Developer 中运行:

SELECT BOXID, PUMP_BIT, "DATE", "HOUR", RUN_DURATION, POWER_ONS FROM PUMP_AGG_HOURLY WHERE BOXID = '4' AND PUMP_BIT = '1' ORDER BY "DATE", "HOUR";

在 C# 中,我添加了双引号,但语句给了我错误

command.CommandText = @"SELECT BOXID, PUMP_BIT, ""DATE"", ""HOUR"", RUN_DURATION, POWER_ONS FROM TPT2000_PUMP_AGG_HOURLY WHERE BOXID = " + tb_BoxIDAktuell.Text + " AND PUMP_BIT = " + BitPumpe1 + " AND DATE BETWEEN to_date('" + Start + "','dd/mm/yyyy hh24:mi:ss') and to_date('" + Ende + "','dd/mm/yyyy hh24:mi:ss') ORDER BY ""DATE"", ""HOUR""";

ORA-00936 缺少表达式

我认为这是因为 ORDER BY DATE, HOUR 是 SQL 表达式。我试过ORDER BY PUMP_AGG_HOURLY.DATE, PUMP_AGG_HOURLY.HOUR,但得到了同样的错误。

我该如何解决这个问题?谢谢

【问题讨论】:

  • 首先这些不是连接字符串,而是sql命令。
  • 你试过把列名放在方括号里吗? [列](并删除“)
  • 只要你有 2 个" " " " 试试这个\"\"DATE\"\", \"\"HOUR\"\"
  • @GuruprasadRao 给我错误ORA-01741: illegal zero-length identifier
  • @WraithNath 也给了我ORA-00936 missing expression

标签: c# sql database oracle


【解决方案1】:

这个语法对我有用:

using (connection)
{
    OracleCommand command = new OracleCommand();
    command.Connection = connection;
    command.CommandType = CommandType.Text;
    command.BindByName = true;
    command.CommandText =
        "SELECT BOXID, PUMP_BIT, \"DATE\", \"HOUR\", RUN_DURATION, POWER_ONS " +
        "  FROM PUMP_AGG_HOURLY " +
        "  WHERE BOXID = :BoxID AND PUMP_BIT = :BitPumpe " +
        "    AND \"DATE\" BETWEEN to_date(:Date1,'dd/mm/yyyy hh24:mi:ss') " +
        "                     and to_date(:Date2,'dd/mm/yyyy hh24:mi:ss')" +
        "  ORDER BY \"DATE\", \"HOUR\"";
    command.Parameters.Add("BoxID", '1');
    command.Parameters.Add("BitPumpe", '4');
    command.Parameters.Add("Date1", "30/01/2015 01:00:00");
    command.Parameters.Add("Date2", "30/01/2015 18:00:00");
    OracleDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(reader.GetString(0) + ", " + reader.GetString(1));
        Console.WriteLine(reader.GetDateTime(2));
    }
}

Oracle 测试表定义和示例数据:

create table PUMP_AGG_HOURLY (boxid varchar2(2), pump_bit varchar2(2), 
  "DATE" date, "HOUR" varchar2(5), run_duration number(5), power_ons number(5));

insert into PUMP_AGG_HOURLY 
  values ('1', '4', to_date('2015-01-30 03:45', 'yyyy-mm-dd hh24:mi'), null, null, null);

【讨论】:

  • 太棒了!谢谢!还发现ORDER BY ColumnID 也在工作:command.CommandText = @"SELECT BOXID, PUMP_BIT, ""DATE"", ""HOUR"", RUN_DURATION, POWER_ONS FROM TPT2000_PUMP_AGG_HOURLY WHERE BOXID = " + tb_BoxIDAktuell.Text + " AND PUMP_BIT = " + BitPumpe1 + " AND \"DATE\" BETWEEN to_date('" + Start + "','dd/mm/yyyy hh24:mi:ss') and to_date('" + Ende + "','dd/mm/yyyy hh24:mi:ss') ORDER BY 3, 4";
  • ORDER BY 3, 4 可用,但不被视为最佳实践,因为它的可读性不好,如果您在选定列的首位添加列,您很容易忘记应该更改的 ORDER BYORDER BY 4, 5
【解决方案2】:

here已经回答了这个问题

简短的回答是:Oracle 似乎使用双引号(“,例如“table”)并且显然需要正确的大小写

【讨论】:

  • 在上面的 cmets 中给出错误ORA-00936 missing expression
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
相关资源
最近更新 更多