c# - {"ORA-01036: 非法变量名/编号"} - 更新最后一个数字序列 Oracle 数据库
问题描述
我正在尝试使用 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();中抛出的错误行
解决方案
由于您的查询有多个应该一次执行的语句(2 个ALTER
语句和 1 个语句),因此您必须将它们包装在匿名块中并使用before语句,如下所示:SELECT
OPEN ... FOR
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
forALTER
语句并连接参数值,因为您不能在块内将 DDL 语句(CREATE
或ALTER
)DROP
作为静态 SQL 执行:
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
:
// standard
cmd8.Parameters.Add("HEADER", HEADER);
// alternative
cmd8.Parameters.AddWithValue("HEADER", HEADER);
作为最后的手段,如果上述解决方案不起作用,请在OracleCommand
此条件下单独使用内部的每个语句:
1)ALTER
语句必须使用ExecuteNonQuery()
2)SELECT
语句必须使用ExecuteReader()
相关问题:
推荐阅读
- python - 在 Python 中尝试神经网络
- python - 如何删除行并重命名多索引表
- android - 小部件中的颤振迭代
- javascript - Discord 机器人无法运行
- javascript - 如何停止错误“未捕获的 TypeError”?
- javascript - 使用 node.js 将 HTML 表单转换为 PDF
- r - 如何使用 R 检查 JSON 文件中是否存在对象
- javascript - 使用 Jquery 在 prependTo 之后将列表恢复为先前的顺序
- circleci - 如何在 config.yaml 中获取拉取请求编号?(圈词)
- android - 备份和恢复用户数据的最佳方法?