如何使用ADO修剪来防止从VB6到Oracle的参数

时间:2016-06-23 17:11:40

标签: oracle plsql vb6 ado adodb

我有一个VB6应用程序,它调用Oracle(12)PL / SQL存储过程。它使用ADODB连接对象。

从app传递的字符串参数可能有尾随空格。当Oracle收到它们时,任何尾随空格都消失了。

我希望保留尾随空格。我已经到处搜索,无法在线查找VB,ADO或Oracle的行为,其中说尾随空格是应该在参数中修剪。

在Oracle中,存储过程的参数定义为varchar2。 在VB6中,我使用CreateParameter()将params添加为adVarChar(我已尝试过其他字符串类型但它没有帮助)。该调用指定了名称,类型,方向,大小和值。

在执行调用之前,我可以检查Command.Parameters集合并验证是否存在任何尾随空格。

Oracle引用明确声明使用varchar2数据类型,尾随空格被忽略。

有人可以描述VB或数据库中是否有选项导致此问题,并且可以关闭吗?

2 个答案:

答案 0 :(得分:0)

如果你附加一个null,它是否有效,即。 chr(0)到包含空格的字符串的末尾?

你能展示传递参数的代码吗?你为串的长度传递了什么 - 即。你在做len()之前做过修剪吗?

答案 1 :(得分:0)

现在仍然没有足够的观点来添加评论,因为我扩展了它,因此它有资格作为解决方案。

Oracle Objects for OLE(OO4O)是与现代数据库版本兼容的最佳选择。添加对oip12.dll的引用并试用它。我的快速测试案例显示,如果我发送' abc' (这是3个空格)作为参数,sproc确实保留了尾随空格。我实际上使用的是oip10.dll,但数据库是12c。我使用的快速Oracle示例。

CREATE TABLE TEMPTestTrailingSpace
 (F1  VARCHAR2(30) NOT NULL
 ,F2   NUMBER(12,0) NOT NULL
 ,DATEIN     DATE NOT NULL
 ) ;

create public synonym TEMPTestTrailingSpace for trace_owner.TEMPTestTrailingSpace;
grant SELECT on TEMPTestTrailingSpace to "TRACE_USER";

Insert into TEMPTestTrailingSpace values ('abc',1,sysdate);
Insert into TEMPTestTrailingSpace values ('abc      ',2,sysdate);
Insert into TEMPTestTrailingSpace values ('abc   ',3,sysdate);
Insert into TEMPTestTrailingSpace values ('abc     ',4,sysdate);
Insert into TEMPTestTrailingSpace values ('abd',5,sysdate);
Insert into TEMPTestTrailingSpace values ('abd   ',6,sysdate);
Insert into TEMPTestTrailingSpace values ('abd    ',7,sysdate);

Create or Replace Procedure getTestRecord
(
  P_PN IN VARCHAR2,
  p_rec OUT number
)
IS
BEGIN
     SELECT f2
     INTO   p_rec
     FROM  TEMPTestTrailingSpace 
     WHERE  f1 = p_pn;
END;
/

create public synonym getTestRecord for trace_owner.getTestRecord;
grant execute on getTestRecord to "TRACE_USER";

我在数据库访问中使用了一个包装器,因此分享一个示例并不容易。这至少可以让你联系起来。

Public ooSession As Object
Public ooDB As Object

Dim ConnStr As String
Set ooSession = New OracleInProcServer.OraSessionClass
ConnStr = userID & "/" & password
Set ooDB = ooSession.OpenDatabase(dataSource, ConnStr, 0&) 'dataSource = Oracle SID or alias in TNSNames.ora file