[英]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.");
}
}
解决了这个问题之后,我发现我确实不需要为最后两个更新语句传递参数。 我只是基于已收集的值构建了字符串语句。 因此,我按照以下方式重新创建了代码块,并且该代码块可以正常工作,感谢@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.