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的脚本丢失原始缩进格式。
具体解决步骤
修改文本获取逻辑,保留制表符
替换原代码中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的脚本中保留原始的制表符缩进。
验证脚本内容
在执行cmd.Execute前,添加调试代码确认制表符是否保留:Debug.Print strSql可以在VB6的立即窗口中查看输出内容,确认制表符存在。
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,设置制表符的显示长度或禁用自动转换。
- 提交脚本后,通过Oracle视图确认存储过程源文本:
内容的提问来源于stack exchange,提问作者Suryaputhiran04
相关产品推荐
相关产品推荐

