You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB6通过ODBC执行Oracle存储过程时如何保留制表符缩进

VB6通过ODBC执行Oracle存储过程时保留制表符缩进的解决方案

问题场景

在VB6.0应用中通过ODBC连接Oracle 19c执行存储过程创建脚本时,发现脚本中的制表符被替换为单个空格,导致在SQL Developer中查看存储过程时原始缩进格式丢失。当前使用ADODB组件执行脚本,要求不修改连接字符串添加Provider的前提下解决该问题。

VB6执行代码

Private Sub Command1_Click()
    Dim conn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rs As ADODB.Recordset
    Dim strSql As String

    Set conn = New ADODB.Connection
    Set cmd = New ADODB.Command
    
    conn.ConnectionString = "Data Source=MyDataBase; User ID=username; Password=password;"
    
    conn.Open
    
    If conn.State = adStateOpen Then
        Set cmd.ActiveConnection = conn
        'cmd.CommandType = adCmdText
        strSql = RichTextBox1.Text
        cmd.CommandText = strSql
        cmd.Execute
        '
    End If
    conn.Close
    
    Set cmd = Nothing
    Set conn = Nothing
    End
End Sub

原始存储过程脚本

CREATE OR REPLACE PROCEDURE A_SELECT_PATIENTS
IS
    v_value VARCHAR2(100);
    BEGIN
        SELECT DISTINCT
            PAT.SURNAME
            INTO v_value
        FROM
            PATIENTS PAT
        WHERE
            PAT.PATNT_REFNO = 73917;
            
        DBMS_OUTPUT.PUT_LINE('Surname: ' || v_value);
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.PUT_LINE('No data found.');

    END;

SQL Developer中显示的脚本

create or replace NONEDITIONABLE PROCEDURE A_SELECT_PATIENTS 
IS 
 v_value VARCHAR2(100); 
 BEGIN 
 SELECT DISTINCT 
 PAT.SURNAME 
 INTO v_value 
 FROM 
 PATIENTS PAT 
 WHERE 
 PAT.PATNT_REFNO = 73917; 
 
 DBMS_OUTPUT.PUT_LINE('Surname: ' || v_value); 
 EXCEPTION 
 WHEN NO_DATA_FOUND THEN 
 DBMS_OUTPUT.PUT_LINE('No data found.'); 
 
 END;

解决方案

核心原因

VB6的RichTextBox.Text属性会自动将制表符(ASCII码9)转换为空格,导致提交给Oracle的脚本丢失原始缩进格式。

具体解决步骤

  1. 修改文本获取逻辑,保留制表符
    替换原代码中strSql = RichTextBox1.Text这一行,改用循环读取每个字符,将ASCII码为9的字符还原为制表符:

    Dim strSql As String
    Dim i As Integer
    strSql = ""
    For i = 1 To Len(RichTextBox1.Text)
        Dim c As String
        c = Mid(RichTextBox1.Text, i, 1)
        If Asc(c) = 9 Then
            strSql = strSql & vbTab
        Else
            strSql = strSql & c
        End If
    Next i
    

    这样可以确保提交给Oracle的脚本中保留原始的制表符缩进。

  2. 验证脚本内容
    在执行cmd.Execute前,添加调试代码确认制表符是否保留:

    Debug.Print strSql
    

    可以在VB6的立即窗口中查看输出内容,确认制表符存在。

  3. Oracle端验证与SQL Developer显示调整

    • 提交脚本后,通过Oracle视图确认存储过程源文本:
      SELECT TEXT FROM USER_SOURCE WHERE NAME = 'A_SELECT_PATIENTS' ORDER BY LINE;
      
      若查询结果包含制表符,说明格式已保留。
    • 若SQL Developer仍显示为空格,可调整其显示设置:Tools -> Preferences -> Code Editor -> Format -> Advanced,设置制表符的显示长度或禁用自动转换。

内容的提问来源于stack exchange,提问作者Suryaputhiran04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 07:20:11