Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment mettre à jour une colonne BLOB, erreur ORA-00932, pendant que l'insertion fonctionne

J'ai vraiment pensé que vous imaginiez des choses quand j'ai lu votre message. Par curiosité, j'ai essayé et j'ai été étonné que cette erreur se produise réellement.

Il y a de bonnes nouvelles. J'ai fouiné et j'ai trouvé ceci :

Comment puis-je mettre à jour les données dans les champs CLOB à l'aide d'une>> requête préparée <

Il s'avère que lors de l'utilisation d'une instruction de mise à jour avec un LOB, le LOB doit être déclaré en premier dans les paramètres. Dans cet esprit, j'ai eu la même erreur que vous avez faite avec votre code, mais cela a parfaitement fonctionné :

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;
}

Simplement en changeant les paramètres.

J'ai félicité la question et la réponse de cette question initiale (le même gars, dans ce cas).

Vous avez raison, il y a très peu d'aide sur le Web pour les mises à jour sur les BLOB dans Oracle.

Excellente question. J'ai l'impression d'avoir appris quelque chose aujourd'hui.

-- MODIFIER --

Selon la suggestion d'OP, il existe un autre correctif, selon le même fil référencé ci-dessus, qui peut empêcher la nécessité de réorganiser les paramètres. Je suppose que cela pourrait également être utile si vous mettez à jour plusieurs LOB.

Changer le BindByName La propriété semble également résoudre le problème :

cmd.BindByName = true;