【问题标题】:Insert command works in MS with Oracle Linked Server but not in Visual Basic 6插入命令适用于 MS 与 Oracle 链接服务器,但不适用于 Visual Basic 6
【发布时间】:2016-09-29 00:07:13
【问题描述】:

当我运行 SQL 插入命令从 Oracle 链接服务器中的表中获取图像和其他数据并将其插入 SQL 服务器时,它可以工作。当我在 Visual Basic 6 程序中运行完全相同的查询时,插入也可以工作,但没有插入图像。

链接服务器部分正在工作,因为我可以成功进行多个查询。

我正在运行的插入是下面的插入。请注意,在这两种情况下,插入都不会引发错误;他们在 VB 和 Management Studio 中工作,但是,当通过 VB 运行时,只是图像没有出现。

INSERT INTO Employees
 (
   PhotoEmployee,
   TheID,
   Name
 )
 VALUES
 (
   (Select FOTO_Humanus From OPENQUERY(ORACLE_LinkedServer, 'Select FOTO.pesFoto FOTO_Humanus FROM Pessoa_Foto1 FOTO WHERE FOTO.pesCodPessoa = 32892')),
   '900397',
   'MARCELO ROCHA'
 )

我搜索了很多,但找不到有类似问题的人。

接收图像的 SQL-Server 字段来自 IMAGE 类型。

在 Oracle 中,图像存储在 LONG RAW 类型的字段中。

你能帮忙吗?

编辑:(添加更多细节)

连接正常...我很确定。此外,当我执行 SQL 命令或连接到数据库时没有错误:一切工作正常,除了这个图像.. 没有插入到目标数据库中。所有其他字段都插入没有问题。所有字段都在同一个表中。

我正在使用的 Visual Basic 6 代码如下。

1 - O 使用我需要的确切查询填充数组

2 - 不久之后,我在这个数组中进行迭代,执行 SQL 查询。

这是VB代码:

SQLOracleTemp = "Select FOTO.pesFoto FOTO_Humanus FROM Pessoa_Foto1 FOTO WHERE FOTO.pesCodPessoa = 32892"

NomeLinkedServer = "ORACLE_LinkedServer"

SQL_InsertColab = "INSERT INTO Employees" & vbCrLf
SQL_InsertColab = SQL_InsertColab & " (" & vbCrLf
SQL_InsertColab = SQL_InsertColab & "   funFotoColaborador," & vbCrLf
SQL_InsertColab = SQL_InsertColab & "   TheID," & vbCrLf
SQL_InsertColab = SQL_InsertColab & "   Name" & vbCrLf
SQL_InsertColab = SQL_InsertColab & " )" & vbCrLf
SQL_InsertColab = SQL_InsertColab & " VALUES" & vbCrLf
SQL_InsertColab = SQL_InsertColab & " (" & vbCrLf


SQL_InsertColab = SQL_InsertColab & "   (Select FOTO_Humanus From OPENQUERY(" & NomeLinkedServer & ", '" & SQLOracleTemp & "'))," & vbCrLf

SQL_InsertColab = SQL_InsertColab & "   " & aColabs_Insert(UBound(aColabs_Insert)).IDOAS & "," & vbCrLf
SQL_InsertColab = SQL_InsertColab & "   " & aColabs_Insert(UBound(aColabs_Insert)).Nome & vbCrLf
SQL_InsertColab = SQL_InsertColab & " )" & vbCrLf

aSQL(UBound(aSQL)) = SQL_InsertColab
ReDim Preserve aSQL(UBound(aSQL) + 1)



For ContaSQL = 0 To UBound(aSQL)

    if aSQL(ContaSQL) <> "" then
        gConexao_Banco.Execute aSQL(ContaSQL)
    enf if

Next

【问题讨论】:

  • 请告诉我们失败的VB6代码
  • 您好,感谢您的发帖。我已经编辑了问题并添加了 VB 代码。 VB 代码创建了我在问题开头发布的确切查询。如果我停止 VB,以调试模式获取查询并在 Management Studio 中手动运行。它可以工作。如果我让 vb 运行.. 他执行查询,插入工作...但是 .. 图像没有出现。当我检查时,图像字段为 NULL。当我手动进行时..当我检查时..我可以在字段中看到图像数据,它也出现在我的应用程序中
  • 你用什么模式打开连接?调用 Execute 后是否检查过连接错误集合?
  • 嗨 Jac,我正在使用 OLEDB 连接到 SQL-Server。连接中没有错误..我可以毫无问题地对其进行查询

标签: sql-server oracle image vb6 linked-server


【解决方案1】:

这可能不是确切的答案,但我不知道如何在评论中显示代码格式。 在aSQL(UBound(aSQL)) = SQL_InsertColab 之后有ReDim Preserve aSQL(UBound(aSQL) + 1)。听起来很奇怪,但根据您的逻辑,这可能是正确的。现在,在此之后,您在 for 循环中执行一个 sqlstatement 数组。因此,数组中仍然为空的最后一项在 for 循环中执行,显然它失败了。无论如何尝试下面。在循环中最后一个数组项不执行。检查您的方案并进行相应更新。

For ContaSQL = 0 To UBound(aSQL)-1
    gConexao_Banco.Errors.Clear
    gConexao_Banco.Execute aSQL(ContaSQL)
    If gConexao_Banco.Errors.Count > 0 Then
        For i = 0 To gConexao_Banco.Errors.Count
            Debug.Print gConexao_Banco.Error(i).Number 
            Debug.Print gConexao_Banco.Error(i).Source 
            Debug.Print gConexao_Banco.Error(i).Description
        Next i
    End If
Next

【讨论】:

  • 您认为数组上的最后一个位置为空白是正确的。并且可能会显示错误。但是,事实上,我确实处理了这个问题,并在那之后使用了 ReDim Preserve aSQL(UBound(aSQL) - 1) 。我忘了把它放在代码中..因为我在代码中做了一些清理以使其更简单..对读者来说。但在实际代码中......有一条线可以处理这个问题。而且,插入执行没有问题。我遇到的问题是,在成功插入后......只有 1 个字段留下 NULL :我知道的图像在源中,应该在目标字段中
  • 我没有得到,只剩下 1 个字段为 NULL。您的意思是插入中只有 1 列为空,其余的列正确插入?
  • 嗨,Makul,正是这样!插入运行并且插入的记录在那里......但是......但 Photo 字段为空。如果我运行完全相同的插入,但不是通过 VB 运行,而是使用 Management Studio 运行它......插入运行没有错误,这一次......图像在那里。
  • 你能检查一下 UBound(aColabs_Insert)-1 吗?此外,请在查询中循环或静态更改此值,因为 ubound 将始终相同
  • 嗨 Makul,很抱歉这么久才回答。这个变量 (aColabs_Insert) 是我创建的一个类型的数组。事实上,这整个代码在循环中迭代......这个 aColabs_Insert 中的值不断变化。但是,我已经检查过了,它很好:那里没有错误(我总是在这个数组中有值,而我面临的问题的字段不是来自这个数组)。我使用 ubound 是因为我刚刚用正确的数据填充了这个数组,就在我在这里发布的代码之前。我没有发布所有代码以使其更简单,我希望。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多