Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#到OracleCommand的SQL命令给出无效字符错误_C#_Sql_Oracle - Fatal编程技术网

从C#到OracleCommand的SQL命令给出无效字符错误

从C#到OracleCommand的SQL命令给出无效字符错误,c#,sql,oracle,C#,Sql,Oracle,下面是我试图在C代码中使用oracle连接字符串运行的命令,一切正常(相同的查询在toad中平稳运行)。但是,在填充数据集时,会出现错误ORA-00911:无效字符。我不明白为什么,请帮忙 OracleCommand cmd = new OracleCommand( "SELECT DSAT.ORGANIZATION_ID, APPS.DAW_INV_ORG_NAME(DSAT.ORGANIZATION_ID) ORGANIZATION_NAME,APPS.DAW_CA

下面是我试图在C代码中使用oracle连接字符串运行的命令,一切正常(相同的查询在toad中平稳运行)。但是,在填充数据集时,会出现错误ORA-00911:无效字符。我不明白为什么,请帮忙

 OracleCommand cmd = new OracleCommand(
            "SELECT DSAT.ORGANIZATION_ID, APPS.DAW_INV_ORG_NAME(DSAT.ORGANIZATION_ID) ORGANIZATION_NAME,APPS.DAW_CAT_NAME(MC.SEGMENT4) PRODUCT,TRUNC(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE)) TRANSACTION_DATE,"
            +"TO_CHAR(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE),'MM-YYYY') MONTH,DSAT.ITEM_SEGMENTS ITEM_CODE, DSAT.ITEM_DESCRIPTION,"
            +"DSAT.CURRENT_FORECAST_QUANTITY PLAN_QTY FROM APPS.DAW_SCPDB_ASCP_TPP_V   DSAT,APPS.MTL_ITEM_CATEGORIES   MIC,"
            +"APPS.MTL_CATEGORIES      MC"
        + " WHERE NVL(SCH_END_DATE,SCH_START_DATE) BETWEEN TO_DATE(@vfrom,'dd/mm/yyyy') AND TO_DATE(@vto,'dd/mm/yyyy')"+
            " AND  MIC.CATEGORY_SET_ID=1100000061 AND  MC.CATEGORY_ID=MIC.CATEGORY_ID AND  DSAT.INVENTORY_ITEM_ID=MIC.INVENTORY_ITEM_ID"
            +" AND  DSAT.ORGANIZATION_ID=MIC.ORGANIZATION_ID"
            +" AND DSAT.FORECAST_SET IN (@vForecastSetDPL1,@vForecastSetDPL2,@vForecastSetURIL)"
            +" AND APPS.DAW_CAT_NAME(MC.SEGMENT4) ='MICRO WAVE OVEN';", con);
        cmd.Parameters.Add("@vfrom",OracleDbType.Varchar2).Value= vfrom;
        cmd.Parameters.Add("@vto",OracleDbType.Varchar2).Value= vto;
        cmd.Parameters.Add("@vForecastSetDPL1", OracleDbType.Varchar2).Value=vForecastSetDPL1;
        cmd.Parameters.Add("@vForecastSetDPL2",OracleDbType.Varchar2).Value=vForecastSetDPL2;
        cmd.Parameters.Add("@vForecastSetURIL",OracleDbType.Varchar2).Value= vForecastSetURIL;

        cmd.CommandType = CommandType.Text;

所有使用的变量都是字符串类型,因此我必须使用date来表示日期。其余参数应该是字符串类型。

我们可以先生成查询,然后执行它,而不是发送参数。在您的代码中,
“微波炉”中不需要分号;“

编辑 对代码的更改。我没有使用真实数据进行测试

OracleCommand cmd = new OracleCommand(
            "SELECT DSAT.ORGANIZATION_ID, APPS.DAW_INV_ORG_NAME(DSAT.ORGANIZATION_ID) ORGANIZATION_NAME,APPS.DAW_CAT_NAME(MC.SEGMENT4) PRODUCT,TRUNC(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE)) TRANSACTION_DATE,"
            +"TO_CHAR(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE),'MM-YYYY') MONTH,DSAT.ITEM_SEGMENTS ITEM_CODE, DSAT.ITEM_DESCRIPTION,"
            +"DSAT.CURRENT_FORECAST_QUANTITY PLAN_QTY FROM APPS.DAW_SCPDB_ASCP_TPP_V   DSAT,APPS.MTL_ITEM_CATEGORIES   MIC,"
            +"APPS.MTL_CATEGORIES      MC"
        + " WHERE NVL(SCH_END_DATE,SCH_START_DATE) BETWEEN TO_DATE(:vfrom,'dd/mm/yyyy') AND TO_DATE(:vto,'dd/mm/yyyy')"+
            " AND  MIC.CATEGORY_SET_ID=1100000061 AND  MC.CATEGORY_ID=MIC.CATEGORY_ID AND  DSAT.INVENTORY_ITEM_ID=MIC.INVENTORY_ITEM_ID"
            +" AND  DSAT.ORGANIZATION_ID=MIC.ORGANIZATION_ID"
            +" AND DSAT.FORECAST_SET IN (:vForecastSetDPL1,:vForecastSetDPL2,:vForecastSetURIL)"
            +" AND APPS.DAW_CAT_NAME(MC.SEGMENT4) ='MICRO WAVE OVEN'", con);
        cmd.Parameters.Add("vfrom",OracleDbType.Varchar2).Value= vfrom;
        cmd.Parameters.Add("vto",OracleDbType.Varchar2).Value= vto;
        cmd.Parameters.Add("vForecastSetDPL1", OracleDbType.Varchar2).Value=vForecastSetDPL1;
        cmd.Parameters.Add("vForecastSetDPL2",OracleDbType.Varchar2).Value=vForecastSetDPL2;
        cmd.Parameters.Add("vForecastSetURIL",OracleDbType.Varchar2).Value= vForecastSetURIL;

        cmd.CommandType = CommandType.Text;

发布错误如果这些解决方案不适用于您

您的问题是在查询中使用“@”,但对于Oracle,您需要使用“:”


要使用存储过程,您需要创建返回sys_refcursor的输出参数,一切都应该正常

这里有一个想法…为什么不将其转换为存储过程,这样您就不必担心所有这些问题
动态构建混乱
首先要做的事情:使用参数化SQL,而不是包含direc值@DJKRAZE:只使用参数化SQL(可能还有逐字字符串文字)在这里会有很大的不同。@DJKRAZE:这是我第一次尝试,但在花了几个小时来解决“如何读取c#中的引用游标输出”问题后,我决定放弃存储过程并使用查询。@user1451836-这不是用新代码测试的--
(“@vForecastSetDPL1”,“@vForecastSetDPL2”,“@vForecastSetURIL”)
应该是
(@vForecastSetDPL1、@vForecastSetDPL2、@vForecastSetURIL)
如果查询参数化正确。我确实在存储过程和参数中添加了refcursor,但我无法将数据存储在数据集中。如果使用ODP.NET,使用ODP.NET对象检索游标并填充数据集或数据表应该不会有问题。
OracleCommand cmd = new OracleCommand(
            "SELECT DSAT.ORGANIZATION_ID, APPS.DAW_INV_ORG_NAME(DSAT.ORGANIZATION_ID) ORGANIZATION_NAME,APPS.DAW_CAT_NAME(MC.SEGMENT4) PRODUCT,TRUNC(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE)) TRANSACTION_DATE,"
            +"TO_CHAR(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE),'MM-YYYY') MONTH,DSAT.ITEM_SEGMENTS ITEM_CODE, DSAT.ITEM_DESCRIPTION,"
            +"DSAT.CURRENT_FORECAST_QUANTITY PLAN_QTY FROM APPS.DAW_SCPDB_ASCP_TPP_V   DSAT,APPS.MTL_ITEM_CATEGORIES   MIC,"
            +"APPS.MTL_CATEGORIES      MC"
        + " WHERE NVL(SCH_END_DATE,SCH_START_DATE) BETWEEN TO_DATE(:vfrom,'dd/mm/yyyy') AND TO_DATE(:vto,'dd/mm/yyyy')"+
            " AND  MIC.CATEGORY_SET_ID=1100000061 AND  MC.CATEGORY_ID=MIC.CATEGORY_ID AND  DSAT.INVENTORY_ITEM_ID=MIC.INVENTORY_ITEM_ID"
            +" AND  DSAT.ORGANIZATION_ID=MIC.ORGANIZATION_ID"
            +" AND DSAT.FORECAST_SET IN (:vForecastSetDPL1,:vForecastSetDPL2,:vForecastSetURIL)"
            +" AND APPS.DAW_CAT_NAME(MC.SEGMENT4) ='MICRO WAVE OVEN'", con);
        cmd.Parameters.Add("vfrom",OracleDbType.Varchar2).Value= vfrom;
        cmd.Parameters.Add("vto",OracleDbType.Varchar2).Value= vto;
        cmd.Parameters.Add("vForecastSetDPL1", OracleDbType.Varchar2).Value=vForecastSetDPL1;
        cmd.Parameters.Add("vForecastSetDPL2",OracleDbType.Varchar2).Value=vForecastSetDPL2;
        cmd.Parameters.Add("vForecastSetURIL",OracleDbType.Varchar2).Value= vForecastSetURIL;

        cmd.CommandType = CommandType.Text;
 BETWEEN TO_DATE(@vfrom,'dd/mm/yyyy') - incorrect 
 BETWEEN TO_DATE(:vfrom,'dd/mm/yyyy') - correct