簡體   English   中英

將綁定參數傳遞給PL SQL更新語句

[英]Passing Binding Parameters to PL SQL Update Statements

我已經使用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.");
    }
}

傳遞給Oracle的命令(注意零)

解決了這個問題之后,我發現我確實不需要為最后兩個更新語句傳遞參數。 我只是基於已收集的值構建了字符串語句。 因此,我按照以下方式重新創建了代碼塊,並且該代碼塊可以正常工作,感謝@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.");
                                    }
                                }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM