我正在尝试使用C#上的文本框更新数据库Oracle中的最后一个序列号。当我尝试执行程序时,收到错误消息 {“ ORA-01036:非法变量名称/数字”} 我正在尝试纠正此问题,但是我没有找到解决方法。我是#C和Oracle数据库的新手。这里有人可以帮助我解决这个问题吗? 先感谢您 这是我的代码
private void IDHEADER()
{
var result7 = new StringBuilder();
using (var connectio1n = new OracleConnection(@"Data Source=mcf;Persist Security Info=True;User ID=tmci38001;Password=tmci38001;"))
{
string CommandText2 = "SELECT LAST_NUMBER FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'TMCI_SEQ_BC_AJU_HEADER'";
OracleCommand command2 = new OracleCommand(CommandText2, connectio1n);
connectio1n.Open();
using (OracleDataReader dr = command2.ExecuteReader())
{
while (dr.Read())
{
String a = dr[0].ToString();
ID_HEADER.Text = a;
}
}
}
}
private void btnUpd_Click(object sender, EventArgs e)
{
Cursor = Cursors.WaitCursor;
DialogResult result = MessageBox.Show("Update Sequence ?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
if (string.IsNullOrEmpty(ID_HEADER.Text))
{
MessageBox.Show("Please Fill in all necessary fields",
"Incomplete Input", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
else
{
String HEADER = ID_HEADER.Text.Trim();
OracleConnection db = new OracleConnection("Data Source=mcf;Persist Security Info=True;User ID=tmci38001;Password=tmci38001;");
db.Open();
OracleCommand cmd8 = new OracleCommand("ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY LPAD(TO_NUMBER(:HEADER),0); SELECT TMCI_SEQ_BC_AJU_HEADER.NEXTVAL FROM DUAL; ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY 1 ", db);
cmd8.BindByName = true;
cmd8.Parameters.Add(":HEADER", HEADER);
OracleDataReader oraReader8 = null;
oraReader8 = cmd8.ExecuteReader();
oraReader8.Close();
db.Close();
db.Dispose();
IDHEADER();
Cursor = Cursors.Default;
MessageBox.Show("BC Sequence Successfully updated...");
}
}
}
作为附加信息,在 oraReader8 = cmd8.ExecuteReader();
中引发的错误行答案 0 :(得分:0)
由于您的查询有多个语句(2条ALTER
语句和1条SELECT
语句)应立即执行,因此您必须将它们包装在匿名块中,并在{{之前使用OPEN ... FOR
1}}这样的语句:
ALTER
如果上面的查询不起作用,请对OracleCommand cmd8 = new OracleCommand(@"BEGIN
OPEN :1 FOR ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY LPAD(TO_NUMBER(:HEADER),0);
SELECT TMCI_SEQ_BC_AJU_HEADER.NEXTVAL FROM DUAL;
OPEN :2 FOR ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY 1;
END;", db);
语句使用EXECUTE IMMEDIATE
并连接参数值,因为您无法执行DDL语句(ALTER
,CREATE
或{ {1}})作为块中的静态SQL:
ALTER
然后在DROP
中使用不带冒号(OracleCommand cmd8 = new OracleCommand(@"BEGIN
EXECUTE IMMEDIATE 'ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY LPAD(TO_NUMBER(' || :HEADER || '),0)';
SELECT TMCI_SEQ_BC_AJU_HEADER.NEXTVAL FROM DUAL;
EXECUTE IMMEDIATE 'ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY 1';
END;", db);
)前缀的参数名称:
:
万不得已,如果上述解决方案不起作用,请在以下条件下分别使用OracleCommand.Parameters
中的每个语句:
1)// standard
cmd8.Parameters.Add("HEADER", HEADER);
// alternative
cmd8.Parameters.AddWithValue("HEADER", HEADER);
语句必须使用OracleCommand
2)ALTER
语句必须使用ExecuteNonQuery()
相关问题: