使用OCIStmtPrepare()
和OCIBindByName()
时,是否有办法按名称进行绑定,然后将该绑定的位置作为int
? OCIStmtGetBindInfo()
似乎没有做到这一点。谢谢!从OCI中的绑定名称获取绑定位置
3
A
回答
2
似乎没有一种简单的方法来做到这一点。我尝试使用无证的绑定手柄使用OCIAttrGet()
(如我找不到它在帮助文档,但它是在oci.h头)OCI_ATTR_HANDLE_POSITION
:
ub4 bpos = 0;
OCIBind *bindp;
OCIAttrGet(bindp, OCI_HTYPE_BIND, &bpos, 0, OCI_ATTR_HANDLE_POSITION, errhp);
不幸的是,这似乎为工作绑定你在位置上绑定的句柄,但对于任何你绑定的名字,返回0。
因此,您似乎必须使用OCIStmtGetBindInfo()
调用来填充绑定变量名称的数组,然后遍历它以找到每个命名绑定的位置,或者通过将绑定名称与绑定变量名数组中的值(其中将大写的值):
sb4 found = 0;
text* bvns[100];
ub1 bvnls[100];
text* invs[100];
ub1 invls[100];
ub1 dupls[100];
OCIBind* bhnds[100];
OCIStmtGetBindInfo(stmthp, errhp, (ub4)100, (ub4)1, &found, bvns, bvnls, invs, invls, dupls, bhnds);
for (unsigned int col = 0; col < found; col++)
{
printf("%p is bound to name: %s", bhnds[col], bvns[col]);
}
一个需要注意在一份声明中多个占位符,有趣的是,它的行为不同,如果你的发言是匿名块或没有。那就是:
insert into foo (bar, baz) values (:bar, :bar)
将填补你found
输出变量2(与2点的绑定信息的阵列),而:
begin insert into foo (bar, baz) values (:bar, :bar); end;
将填补你found
输出变量1(和阵列与1绑定的信息)。 尽管如此,在任何情况下,对OCIBindByName()
的单个呼叫都会绑定。
+0
我认为你是对的,没有办法只在OCI内部进行。谢谢! – Gaius 2011-06-09 08:56:00
相关问题
- 1. 名称绑定和语言绑定
- 2. 获取从FrameworkElementFactory绑定
- 3. 在JAX-WS中定义绑定名称
- 4. 了解GHC错误“绑定位置的合格名称”
- 5. JNDI名称未绑定
- 6. Excel - 绑定系列名称
- 7. TextBox - 绑定属性名称
- 8. 绑定元素名称
- 9. 从两个不同位置获取数据绑定
- 10. 在运行时在ASP.NET中获取绑定字段名称
- 11. 无法在sqlite3中获取绑定参数名称
- 12. 获取templatefield的texbox的绑定列名称
- 13. 如何从解释器堆栈中获取绑定方法的类的名称?
- 14. 如何获取绑定到委托的函数名称
- 15. WPF窗口位置绑定
- 16. 将位置绑定到ActualHeight
- 17. 绑定窗口位置
- 18. ldap在绑定期间获取姓名
- 19. WebSphere Portal:名称空间绑定。如何获取变量?
- 20. 以编程方式获取绑定名称
- 21. 将位置绑定到MVVM中的MapView
- 22. 在回调中绑定/取消绑定
- 23. 如何获取recylerview数据绑定的位置
- 24. 从坐标获取位置名称?
- 25. C++中名称查找与名称绑定的区别
- 26. 如何在Spyne中设置端口的名称和绑定?
- 27. Android从OnClick获取绑定对象
- 28. 从UserControl获取绑定列表
- 29. 如何从method_missing获取绑定?
- 30. 从源代码获取绑定目标?
您可以在一个语句中多次重复一个命名变量,并使用一个'OCIBindByName()'调用为它们全部设置它。所以这可能代表多个位置参数,那么它会使用哪些位置?请参阅[OCI中的绑定概述](http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28395/oci05bnd.htm#i436225) – 2011-06-06 14:20:13