【问题标题】:Passing Binding Parameters to PL SQL Update Statements将绑定参数传递给 PL SQL 更新语句
【发布时间】:2018-10-04 23:30:34
【问题描述】:

我已经用 SELECT 语句做了很多次,没有任何问题。我也明白 DML PL SQL 语句在“某些”实例中不允许绑定参数,但我已经让 UPDATE 语句工作。但它绝不是组成。我不知道我的陈述还能做什么。下面我采用了处理 UPDATE 语句的部分代码。我基本上是将参数传递给我的语句(特别是 sampleID 和 testID 变量都被声明为整数),但语句在变量的位置包含零。这意味着它无法识别已分配给 sampleID 和 testID 变量的值。我不明白我在这里做错了什么。第一个更新命令 (ucommand) 有效,但后两个无效。我在这里迷路了。

if(!row["field_result"].ToString().Equals(""))
{
    //Build SQL commands to address the field result
    string ucommand = "UPDATE CC_MSD_LIMS_STAGING SET FIELD_RESULT = '" + @locfield + "', CREATEDDT = SYSDATE"
        + " WHERE MONITORING_ID = " + @locmon_ID + " AND IPACS_SAMPLE_ID = " + @locipacs_ID + " AND FACILITY_ID = "
        + @locfacil_ID + " AND POLLUTANT = '" + @locpoll + "'";
    string idcmd = "SELECT SAMPLEID FROM LIM_SAMPLE WHERE SAMPLENUMBER = (SELECT PRIM_SAM_KEY FROM CC_MSD_LIMS_STAGING "
        + "WHERE MONITORING_ID = " + @locmon_ID + " AND IPACS_SAMPLE_ID = " + @locipacs_ID + " AND FACILITY_ID = "
        + @locfacil_ID + " AND POLLUTANT = '" + @locpoll + "')";
    string testcmd = "SELECT TESTID FROM LIM_TESTGROUPTESTS WHERE TESTGROUPID = (SELECT TESTGROUPID FROM LIM_TESTGROUP WHERE "
        + "TESTGROUPNAME = '" + @locpoll + "' AND ACTIVE = 1 AND PUBLISHED = 1)";
    string upd1cmd = "UPDATE LIM_SAMPLETESTRUNRESULT SET SAMPLETESTRUNRESULTRAW = '" + @locfield + "', SAMPLETESTRUNRESULTCALC "
        + "= '" + @locfield + "', SAMPLETESTRUNRESULTREPORT = '" + @locfield + "', SAMPLETESTRUNRESULTSTATUS = 3, EDITEDDT "
        + "= SYSDATE, EDITEDBY = 128 WHERE SAMPLEID = " + @sampleID + " AND TESTID = " + @testID;
    string upd2cmd = "UPDATE LIM_SAMPLETESTRESULTPROCESSES SET PROCESSSTATUS = 3.3, PROCESSCOMPLETEDT = SYSDATE, PROCESSCOMPLETEBY "
        + "= 128 WHERE SAMPLEID = " + @sampleID + " AND TESTID = " + @testID;

    //Execute commands
    try
    {
        using (OracleCommand cmd = new OracleCommand(ucommand, conn))
        {
            cmd.Parameters.Add("@locmon_ID", locmon_ID);
            cmd.Parameters.Add("@locfacil_ID", locfacil_ID);
            cmd.Parameters.Add("@locipacs_ID", locipacs_ID);
            cmd.Parameters.Add("@locpoll", locpoll);
            cmd.Parameters.Add("@locfield", locfield);
            cmd.ExecuteNonQuery();
            cmd.CommandText = "COMMIT WORK";
            cmd.ExecuteNonQuery();
            cmd.CommandText = idcmd;
            sampleID = int.Parse(cmd.ExecuteScalar().ToString());
            cmd.CommandText = testcmd;
            testID = int.Parse(cmd.ExecuteScalar().ToString());
        }

        using (OracleCommand cmd1 = new OracleCommand(upd1cmd, conn))
        {
            cmd1.Parameters.Add("@sampleID", sampleID);
            cmd1.Parameters.Add("@testID", testID);
            cmd1.CommandText = upd1cmd;
            cmd1.ExecuteNonQuery();
            cmd1.CommandText = "COMMIT WORK";
            cmd1.ExecuteNonQuery();
            cmd1.CommandText = upd2cmd;
            cmd1.ExecuteNonQuery();
            cmd1.CommandText = "COMMIT WORK";
            cmd1.ExecuteNonQuery();
        }

    }
    catch (Exception f)
    {
        //Log.Error("Problems with the field results.");
    }
}

【问题讨论】:

  • 去掉参数占位符周围的引号
  • string ucommand = "UPDATE CC_MSD_LIMS_STAGING SET FIELD_RESULT = @locfield, CREATEDDT = SYSDATE WHERE MONITORING_ID = @locmon_ID AND IPACS_SAMPLE_ID = @locipacs_ID AND FACILITY_ID = @locfacil_ID + AND POLLUTANT = @locpoll";
  • 如果我删除引号,我会收到错误“无法将 int 转换为字符串”。 sampleID 和 testID 参数都是整数。 u 命令有效。是 updcmd1 和 updcmd2 不起作用。
  • 对不起,我没有关注。除了 sampleID 和 testID 之外,所有参数都传递了各自的值。这两个也在字符串语句 updcmd1 和 updcmd2 中。所以我不确定你的最后一句话是什么意思@Steve
  • 我已经删除了我之前的评论。但是,我不明白您从哪里得到该错误消息。当您编写参数化查询时,您不会在命令文本内插入字段值。您只需在命令文本中放置参数的占位符。它们只是文本而不是变量。然后每个命名占位符@something 都应该将其参数值添加到命令参数集合中。并且每个参数还应该指定其类型。使用 cmd.Parameters.Add("@name", OracleDbType.XXXX).Value = value 顺便说一下oracle中参数的前缀是:

标签: c# sql dml


【解决方案1】:

在搞砸了这个之后,我发现我真的不需要为最后两个更新语句传递参数。我只是根据已经收集的值构建了字符串语句。所以我重新创建了如下代码块并且它工作了,感谢@Steve的时间:

if (!row["field_result"].ToString().Equals(""))
                                {
                                    //Build SQL commands to address the field result
                                    string ucommand = "UPDATE CC_MSD_LIMS_STAGING SET FIELD_RESULT = '" + @locfield + "', CREATEDDT = SYSDATE"
                                        + " WHERE MONITORING_ID = " + @locmon_ID + " AND IPACS_SAMPLE_ID = " + @locipacs_ID + " AND FACILITY_ID = "
                                        + @locfacil_ID + " AND POLLUTANT = '" + @locpoll + "'";
                                    string idcmd = "SELECT SAMPLEID FROM LIM_SAMPLE WHERE SAMPLENUMBER = (SELECT PRIM_SAM_KEY FROM CC_MSD_LIMS_STAGING "
                                        + "WHERE MONITORING_ID = " + @locmon_ID + " AND IPACS_SAMPLE_ID = " + @locipacs_ID + " AND FACILITY_ID = "
                                        + @locfacil_ID + " AND POLLUTANT = '" + @locpoll + "')";
                                    string testcmd = "SELECT TESTID FROM LIM_TESTGROUPTESTS WHERE TESTGROUPID = (SELECT TESTGROUPID FROM LIM_TESTGROUP WHERE "
                                        + "TESTGROUPNAME = '" + @locpoll + "' AND ACTIVE = 1 AND PUBLISHED = 1)"; 

                                    //Execute commands
                                    try
                                    {
                                        using (OracleCommand cmd = new OracleCommand(ucommand, conn))
                                        {
                                            cmd.Parameters.Add("@locmon_ID", locmon_ID);
                                            cmd.Parameters.Add("@locfacil_ID", locfacil_ID);
                                            cmd.Parameters.Add("@locipacs_ID", locipacs_ID);
                                            cmd.Parameters.Add("@locpoll", locpoll);
                                            cmd.Parameters.Add("@locfield", locfield);
                                            cmd.ExecuteNonQuery();
                                            cmd.CommandText = "COMMIT WORK";
                                            cmd.ExecuteNonQuery();
                                            cmd.CommandText = idcmd;
                                            sampleID = int.Parse(cmd.ExecuteScalar().ToString());
                                            cmd.CommandText = testcmd;
                                            testID = int.Parse(cmd.ExecuteScalar().ToString());
                                        }

                                        string upd1cmd = "";

                                        using (OracleCommand cmd1 = new OracleCommand(upd1cmd,conn))
                                        {
                                            upd1cmd = "UPDATE LIM_SAMPLETESTRUNRESULT SET SAMPLETESTRUNRESULTRAW = '" + locfield + "', SAMPLETESTRUNRESULTCALC "
                                            + "= '" + locfield + "', SAMPLETESTRUNRESULTREPORT = '" + locfield + "', SAMPLETESTRUNRESULTSTATUS = 3, EDITEDDT "
                                            + "= SYSDATE, EDITEDBY = 128 WHERE SAMPLEID = " + sampleID + " AND TESTID = " + testID + " AND RUNID = 1";

                                            string upd2cmd = "UPDATE LIM_SAMPLETESTRESULTPROCESSES SET PROCESSSTATUS = 3.3, PROCESSCOMPLETEDT = SYSDATE, PROCESSCOMPLETEBY "
                                            + "= 128 WHERE SAMPLEID = " + sampleID + " AND TESTID = " + testID + " AND RUNID = 1";

                                            cmd1.CommandText = upd1cmd;
                                            cmd1.ExecuteNonQuery();
                                            cmd1.CommandText = "COMMIT WORK";
                                            cmd1.ExecuteNonQuery();
                                            cmd1.CommandText = upd2cmd;
                                            cmd1.ExecuteNonQuery();
                                            cmd1.CommandText = "COMMIT WORK";
                                            cmd1.ExecuteNonQuery();
                                        }

                                    }
                                    catch (Exception f)
                                    {
                                        //Log.Error("Problems with the field results.");
                                    }
                                }

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 2011-08-07
    • 2020-11-24
    • 1970-01-01
    • 2023-04-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多