简体   繁体   中英

Passing Binding Parameters to PL SQL Update Statements

I have done this numerous times with SELECT statements with no problems. I also understand that DML PL SQL statements don't allow binded parameters in "some" instances but I have gotten UPDATE statements to work. It has by no means been consist though. I don't know what else to do with my statements. Below I have taken part of my code that deals with the UPDATE statements. I am basically passing parameters to my statements (in particular the sampleID and testID variable both are declared as integers) but the statement contains zeros in the places of the variables. Which means it is not recognizing the values that have been assigned to the sampleID and testID variables. I don't understand what I am doing wrong here. The first update command (ucommand) works but the last two don't. I'm at a lost here.

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的命令(注意零)

After messing around with this I figured out that I really didn't need to pass parameters for my last two update statements. I just built the string statements based off the values that were already collected. So I recreated the code block as the following and it worked, thanks @Steve for time:

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.");
                                    }
                                }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM