重写Oracle插入命令后的ORA-01036
本文关键字:ORA-01036 命令 Oracle 插入 重写 | 更新日期: 2023-09-27 18:25:44
我正在重新编写遗留代码,并得出以下查询:
sqlDS.InsertCommand = "INSERT INTO SCHEMA.TABLE " +
"(ID, DATUM, ID_STATE, G_AM, G_VON, DATUM_BEW) " +
"VALUES (" + ((strukturen.Login)Session["svar_bew"]).ID_Bew.ToString() +
", TO_DATE('" + _datum + "', 'DD.MM.YYYY HH24:MI:SS'), 2, TO_DATE('" + lbl_bew.Text +
"', 'DD.MM.YYYY'), 'ID" + ((strukturen.Login)Session["svar_bew"]).ID_Bew.ToString() +
"', TO_DATE('" + _datum + "', 'DD.MM.YYYY HH24:MI:SS'))";
这是有效的,但出于可怕的原因,我想把这个可憎的东西改写成一个参数化的格式。
现在这是我迄今为止的进展:
sqlDS.InsertCommand = "INSERT INTO SCHEMA.TABLE (ID, DATUM, ID_STATE, G_AM, G_VON, DATUM_BEW) " +
"VALUES (:Id_Bew, TO_DATE(':Datum', 'DD.MM.YYYY HH24:MI:SS'), 2, TO_DATE(':BewAm', 'DD.MM.YYYY'), 'ID' || :Id_Bew, TO_DATE(':Datum', 'DD.MM.YYYY HH24:MI:SS'))";
sqlDS.InsertParameters.Add("Id_Bew", ((strukturen.Login)Session["svar_bew"]).ID_Bew.ToString());
sqlDS.InsertParameters.Add("Datum", _datum);
sqlDS.InsertParameters.Add("BewAm", lbl_bew.Text);
这是有问题的表格:
COLUMN | TYPE
-----------------------
ID | NUMBER
DATUM | DATE
/* Columns | ommited */
ID_STATE | NUMBER
G_AM | DATE
G_VON | CHAR(10 BYTE)
DATUM_BEW | DATE
变量还没有遵循固定的模式,所以它们是用德语声明的,在这种情况下更不用说了。问题是,这个新代码现在抛出了一个ORA-01036,我怀疑它在这个位置:
'ID" + ((strukturen.Login)Session["svar_bew"]).ID_Bew.ToString()
->'ID' || :Id_Bew
在原始SQL查询中,字符串"ID"与从会话变量中提取的数字ID连接在一起。我的怀疑是,我在参数化查询中以错误的方式插入了它,并搞砸了语法。
问题是:如何解决此错误并将此插入命令转换为正确的格式?
绑定变量应在不嵌入单引号的情况下定义。
':bind_variable'
-->错误(改为纯字符串处理):bind_variable
-->右侧
因此,当您尝试添加绑定参数时,它抛出了ORA-01036:非法变量名称/编号
sqlDS.InsertCommand = "INSERT INTO SCHEMA.TABLE (ID, DATUM, ID_STATE, G_AM, G_VON, DATUM_BEW) " +
"VALUES (:Id_Bew, TO_DATE(:Datum, 'DD.MM.YYYY HH24:MI:SS'), 2, TO_DATE(:BewAm, 'DD.MM.YYYY'), 'ID' || :Id_Bew, TO_DATE(:Datum, 'DD.MM.YYYY HH24:MI:SS'))";
sqlDS.InsertParameters.Add("Id_Bew", ((strukturen.Login)Session["svar_bew"]).ID_Bew.ToString());
sqlDS.InsertParameters.Add("Datum", _datum);
sqlDS.InsertParameters.Add("BewAm", lbl_bew.Text);