OracleCommand.BindByName = True 的确切含义是什么?

5

我正在使用.NET应用程序,并尝试更新数据库表格。下面的更新查询语句是否有效?如果我将BindByName设置为True,.NET是否也会将null和SYSDATE作为参数考虑?顺便说一句,这是一个简化的查询语句,实际查询语句有些复杂,因此在尝试之前想要确认一下。

cmd.Parameters.Clear()
cmd.CommandText = "UPDATE TBL_xxx_xxx SET NEXT=null, ACTIONDATE=SYSDATE, comments=:pcomments, STATUS=11 WHERE ACTIONDATE IS NULL AND WFID=:pwid AND ACTIONBY=:pactionby"
cmd.CommandType = CommandType.Text
cmd.BindByName = True

cmd.Parameters.Add(New OracleParameter(":pcomments", OracleDbType.Varchar2)).Value = somevalue
cmd.Parameters.Add(New OracleParameter(":pwid", OracleDbType.Int64)).Value = somevalue
cmd.Parameters.Add(New OracleParameter(":pactionby", OracleDbType.Varchar2)).Value = somevalue

cmd.ExecuteQuery()
1个回答

10
cmd.BindByName = False的相反是“按位置绑定”。当你设置cmd.BindByName = True时,你可以以任何顺序添加参数pcommentspwidpactionby。因此,在你的情况下,这个也应该有效:cmd.BindByName = False
cmd.Parameters.Add(New OracleParameter(":pwid", OracleDbType.Int64)).Value = somevalue
cmd.Parameters.Add(New OracleParameter(":pactionby", OracleDbType.Varchar2)).Value = somevalue
cmd.Parameters.Add(New OracleParameter(":pcomments", OracleDbType.Varchar2)).Value = somevalue

如果您设置cmd.BindByName = False(这是默认值),则必须按照它们在CommandText中出现的顺序添加参数。
关于您的第二个问题,可以使用
cmd.CommandText = "UPDATE TBL_xxx_xxx SET NEXT=null, ACTIONDATE=SYSDATE"
cmd.ExecuteQuery()

或者

cmd.CommandText = "UPDATE TBL_xxx_xxx SET NEXT= :next, ACTIONDATE= :actDate"
cmd.Parameters.Add(New OracleParameter(":next", OracleDbType.Int64)).Value = DBNull.Value
cmd.Parameters.Add(New OracleParameter(":actDate", OracleDbType.Date)).Value = CType(DateTime.Now, Oracle.DataAccess.Types.OracleDate)

cmd.ExecuteQuery()

1
嗨Wernfried。感谢您的回复......next=null和action=sysdate会有任何问题吗?next和action的值是否会正常更新? - ssuhas76

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接