【发布时间】:2013-02-02 06:19:24
【问题描述】:
我要生成一个可以生成动态更新sql并执行的c程序。 表名、要更新的列数和 where 子句中的列是已知的 只在运行时。所以我把我的程序分成两个函数:
1)CheckTableExists - 检查用户提供的表是否存在于数据库中。 成功实施。
2)UpdateFunc - 根据用户提供的数据生成sql字符串并执行
查询。
我在第二个函数中遇到问题。我不接受任何列、名称和值 从用户更新。然后我使用 for 循环并将名称和值附加到我的 sql 字符串:
sqlstring = 更新标签名 set colname = colval,colname = colval where
然后我接受 where 子句数据并将其附加到我的字符串中。所以我的最后一个字符串是:
sqlstring = 更新选项卡名 set colname = colval,colname = colval where whcolname = whcolval
但是当我执行它时,我的程序挂起。有人可以告诉我应该是什么
执行第二个功能的理想方法。
【问题讨论】:
-
您的确切 SQL 字符串是什么样的?您可以直接在您的 RDBMS 中运行它吗?除非您的值是 varchars 并且需要撇号,否则上面的任何内容都看起来不正确。
-
Pro*C?为什么要为WHERE子句取参数,只需以string格式进行完整查询并执行EXEC SQL EXECUTE IMMEDIATE :strSQL; -
好吧,我真的怀疑我们是否需要将主机变量传递给 strSQL。所以我的字符串可以像这样 EXEC SQL Update tabname set colname= colval where whcolname = whcolval.以上都是c char arryays
-
我其实是用一个代码来做参考的。该代码动态选择数据。 sqlstring 是使用 sprintf 生成的: sprintf(SqlString.arr,"EXEC SQL SELECT :fname,:last_name,:age from :tab_name where :id = :val"); fname,last_name,age,id 携带列名,tab_name -> 表名。但是所有这些都像结构一样从一个类传递到另一个类。所以这很容易。但我很困惑我应该如何生成那个字符串。
-
将 Oracle 添加到帖子的标记名中。您使用
:的地方称为binding variables。我说的是在.PCproc 文件中没有绑定。如果所有列都是 Varchar/Int,那么您可以在.PC文件/函数之外准备一个有效的 SQL。在上述情况下,strSQL 是没有占位符的有效 SQL 语句。