c# - 如何在 Oracle 查询“Select-For-Update”中参数化等待时间
问题描述
在我的程序中,我运行“选择更新”-这样的查询:
OracleConnection con = GenerateConnection();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT col1 FROM table1 WHERE col2 = :COL2 AND rownum = 1 FOR UPDATE WAIT 2";
cmd.Parameters.Add(new OracleParameter(":COL2 ", "some value"));
string myValue = Convert.ToString(cmd.ExecuteScalar());
这工作得很好。现在我想参数化等待获得锁的时间(一些集成测试应该等待更长时间,因为测试环境较慢)。
因此,我尝试了这个:
OracleConnection con = GenerateConnection();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT col1 FROM table1 WHERE col2 = :COL2 AND rownum = 1 FOR UPDATE WAIT :WAITFOR";
cmd.Parameters.Add(new OracleParameter(":COL2 ", "some value"));
cmd.Parameters.Add(new OracleParameter(":WAITFOR", 2));
string myValue = Convert.ToString(cmd.ExecuteScalar());
不幸的是我明白了:
ORA-30005: WAIT 间隔丢失或无效
我的问题:
我必须做一个String.Format()
还是我做错了什么?
解决方案
您不能参数化WAIT
,因为它需要整数文字。您可以使用字符串连接或插值构建查询:
int waitfor = 2;
cmd.CommandText = $"SELECT col1 FROM table1 WHERE col2 = :COL2 AND rownum = 1 FOR UPDATE WAIT {waitfor}";
请注意,这种技术是变通方法(用户输入可能的 SQL 注入)。只有在没有其他选项并且参数不能被用户篡改或已正确清理时才应使用它。
推荐阅读
- javascript - $(window).one('scroll' 从页面中间刷新时触发
- reactjs - 当存在重复用户时,为什么我收到错误 400 响应而不是我的预期响应?
- python - 如何使用 beautifulsoup 从页面中抓取数据
- node.js - Uncaught (inpromise)IntegrationError: Invalidvalue for stripe.confirmCardPayment intent secret: value 应该是 client_secret string.u 指定:true
- node.js - 无法链接可执行的“节点”-在 termux 中运行 npm 错误
- r - 哪个是适用于 Windows XP SP3 32 位的最新版本的 R?
- r - 如何将绘图限制在特定范围内
- java - Java 方法没有实现它应该实现的功能
- reactjs - 如何在渲染或更改组件时保持歌曲播放,以及使用 React js 更新底部导航栏中的播放/暂停状态
- android-studio - android studio 更新后不显示 GUI xml 设计