当前位置: 首页 > 知识库问答 >
问题:

如何在Insert工作时更新BLOB列,错误ORA-00932

白昊乾
2023-03-14
using Oracle.DataAccess.Client;//needs reference to Oracle.DataAccess.dll
using Oracle.DataAccess.Types; //OracleBlob


public static bool StoreBlobImage(OracleConnection conn, string ArtNr, byte[] bImageJpg)
{
    bool Ok = false;
#if true // this is what I need, but does not work
    string Sql = "update MyTable set Image = :Image where ArtNr = :ArtNr";
#else // this works
    string Sql = "insert into MyTable (ArtNr, Image) values (:ArtNr, :Image)";
#endif
    using (OracleCommand cmd = new OracleCommand(Sql, conn))
    {
        //cmd.Connection = conn;
        //cmd.CommandType = CommandType.Text;
        cmd.Parameters.Add("ArtNr", OracleDbType.Varchar2, 8).Value = ArtNr;
#if false // tried method 1
        cmd.Parameters.Add("Image", OracleDbType.Blob).Value = bImageJpg;
#else // now trying method 2
        OracleParameter blobParameter = new OracleParameter();
        blobParameter.OracleDbType = OracleDbType.Blob;
        blobParameter.ParameterName = "Image";
        blobParameter.Value = bImageJpg;
        blobParameter.Direction = ParameterDirection.Input;
        blobParameter.IsNullable = true;
        cmd.Parameters.Add(blobParameter);
#endif
        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();  // ORA-00932: inconsistent datatypes: expected - got BLOB
        }
        catch (Exception TheException)
        {
        }// debug breakpoint
    }
    return Ok;
}

共有1个答案

暨宸
2023-03-14

当我读到你的帖子时,我真的觉得你在胡思乱想。出于好奇,我试了一下,惊讶于这个错误真的发生了。

有个好消息。我到处找了找,发现了这个:

如何使用>>准备好的查询<<使用ODP(oracle.dataaccess)更新CLOB字段中的数据?

public static bool StoreBlobImage(OracleConnection conn, string ArtNr, byte[] bImageJpg)
{
    bool Ok = false;
    string Sql = "update MyTable set Image = :Image where ArtNr = :ArtNr";

    using (OracleCommand cmd = new OracleCommand(Sql, conn))
    {
        cmd.Parameters.Add("Image", OracleDbType.Blob).Value = bImageJpg;
        cmd.Parameters.Add("ArtNr", OracleDbType.Varchar2, 8).Value = ArtNr;

        try
        {
            cmd.ExecuteNonQuery();
        }
        catch (Exception TheException)
        {
        }
    }
    return Ok;
}

--编辑--

根据OP的建议,有另一个修复,根据上面提到的同一线程,可以防止重新排列参数的必要性。我猜想,如果您正在更新多个LOB,这可能也会派上用场。

切换bindbyname属性似乎也可以解决此问题:

cmd.BindByName = true;
 类似资料:
  • 问题内容: 我有一个带有单个主键的表。当我尝试执行插入操作时,尝试插入具有现有键的行可能会导致冲突。我要允许插入更新所有列吗?有什么简单的语法吗?我试图让它“ upsert”所有列。 我正在使用PostgreSQL 9.5.5。 问题答案: 该语法 要求 显式命名目标列。避免这种情况的可能原因: 您有很多列,只是想缩短语法。 除了唯一列,您不 知道 列名。 必须以匹配顺序和匹配数据类型表示 “目标

  • 我使用的是oracle数据库10g速成版。最近我经常面临ORA-12516错误。它说--“java.sql.sqlException:Listener拒绝连接,出现以下错误:ORA-12516,TNS:Listener无法找到具有匹配协议栈的可用处理程序。客户端使用的连接描述符是://127.0.0.1:1521/xe”

  • 我有一个只有一个主键的表。当我试图插入时,可能会因为试图用现有键插入一行而引起冲突。我想允许插入更新所有列?有什么简单的语法吗?我试图让它“向上插入”所有列。 我使用PostgreSQL 9.5.5。

  • 有时代号为One的团队表示修复将在几周内到来,而其他时候他们表示已经修复。这种不透明性显然与云服务器的更新有关,但我不清楚是否只是云服务器&插件,还是我遗漏了什么。为什么没有一个单独的更新过程? 我真的想要一个更明确的答案,比如代号一是如何工作的?为了这个。

  • 我在迁移(模式)和模型中添加了时间戳 我创建了一个包含数据库所有字段的数组,并将其插入到数据库中。 在表中,它更新除updated_at、created_at时间戳之外的所有字段 我有另一个(默认)用户模型,它更新时间戳。在那个模型中,我使用-

  • 我做了一些研究,有一个建议可以使用双重 但是现在我得到了ORA-06502/ORA-06512错误: ORA-06502:PL/SQL:erreur numérique ou erreur sur une valeur ORA-06512:àsys.xmltype“,ligne 272 ORA-06512:àligne 1 06502。00000-“PL/SQL:数值或值错误%s” *原因:出现算