Frage

IBM Informix SDK:

Aussage: Update mytable set myblobcolumn = ? where myid = 1;

using (IfxConnection conn = GetIfxConnection())
using (IfxCommand cmd = new IfxCommand(updateSql, conn))
{
    var param = new IfxParameter("myblobcolumn", IfxType.Blob) { IsNullable = true };
    cmd.Parameters.Add(param).Value = DBNull.Value

    cmd.ExecuteNonQuery(); //ERROR [HY000] [Informix .NET provider][Informix]Illegal attempt to use Text/Byte host variable.
}

Wenn ich es mit einem anderen aktualisiere IfxBlob Objekt Es funktioniert gut, aber wenn ich es mit aktualisiere DBNull.Value Ich bekomme einen Fehler. Weiß jemand, wie man die BLOB -Spalte mit einem parametrisierten Update "verunreinigt" kann?


Aktualisieren:

Ok, ich habe einige Nachforschungen angestellt und die Dinge ein wenig reduziert.

Zunächst stellte ich fest, dass, wenn ich das ausdrücklich erkläre IfxType Bei der Generierung des Parameters hat der .NET -Treiber Probleme beim Konvertieren von DBNULL.Value oder sogar ein Byte [] -Array, wenn Sie von einem Nullwert in der Datenbank hin und her wechseln und einen tatsächlichen IFXBLOB in der Datenbank haben. Grundsätzlich:

  • Wenn die Spalte einen Wert enthält und ich stattdessen Null darin speichern möchte, muss ich meinen Parameter wie folgt typern: UPDATE mytable SET myblobcolumn = ?::byte WHERE myid = 1;. Dadurch kann ich den Wert von speichern DBNull.Value ohne Fehler.
  • Wenn die Spalte einen Nullwert enthält und ich stattdessen einen tatsächlichen Wert darin speichern möchte, muss ich meinen Parameter wie folgt typern: UPDATE mytable SET myblobcolumn = ?::blob WHERE myid = 1;. Dadurch kann ich den IFXBlob -Wert speichern.

Um nun zu vermeiden, was ich die Parameterinitialisierung reduziert habe, um nur die Parameterame -Eigenschaft festzulegen: var param = new IfxParameter { ParameterName = "myblobcolumn" } (Und selbst das ist nur, um sie aus der Sammlung zu verweisen, nichts mehr). Dies ließ mich meine Aussage behalten, ohne meinen Parameter typern zu müssen.

Also ... ich bin mit Folgendem übrig:

Aussage: UPDATE mytable SET myblobcolumn = ? where myid = 1;

using (IfxConnection conn = GetIfxConnection())
using (IfxCommand cmd = new IfxCommand(updateSql, conn))
{
    var param = new IfxParameter { ParameterName = "myblob" }
    cmd.Parameters.Add(param);

    var value = GetSomeValue();

    if (value is Byte[])
        cmd.Paremeters["myblob"].Value = GetIfxBlob(value);
    else
        cmd.Parameters["myblob"].Value = DBNull.Value;

    //...
}

Dies funktioniert einwandfrei, außer dass ich glaube, ich habe einen Fehler im Informix .NET -Treiber (3.50.xc7) ähnlich wie der entdeckt Dieses hier. Grundsätzlich stellte der Link fest, dass ein Fehler entdeckt wurde, der es dem .NET -Treiber nicht ermöglichte, ein Byte [] -Array ordnungsgemäß zu verwenden, um einen Blob bei einem Einsatz zu erstellen. Das wurde darin behoben, dass ich buchstäblich tun kann cmd.Parameters["myblob"].Value = new Byte[] { 0x1, 0x2 }; Bei einem EINFÜGUNG Aussage. Der Fahrer gibt jedoch immer noch eine Ausnahme an, wenn das Byte [] -Array für eine verwendet wird AKTUALISIEREN Aussage. Daher musste ich tatsächlich IFXBlob -Instanzen erstellen und diese anstelle des tatsächlichen Byte -Arrays verwenden.

Wenn dies kein Fehler im Treiber ist, muss diese Frage geöffnet bleiben, um zu sehen, wie die richtige Möglichkeit für Aktualisierungen ein Block -Feld verwendet wird, um ein Byte -Array zu verwenden.

War es hilfreich?

Lösung

Ich dachte, da niemand erklärte, dass das, was ich erlebt habe, kein Fehler ist, werde ich meine Ergebnisse als Antwort veröffentlichen:

  1. Für den Informix .NET -Anbieter (Ver: 3.5.xc7) setzen Sie die nicht explizit ein IfxType oder DbType Beim Generieren von IfxParameter (oder DbParameter). Generieren Sie stattdessen einfach den Parameter und erlauben Sie dem Informix .NET -Anbieter, die richtigen Typen für Sie zuzuordnen. Auf diese Weise müssen Sie sich keine Sorgen machen, Ihre Parameter zu typern (dh vermeiden "? :: Blob" und "? :: byte").

  2. Aufgrund eines Fehlers (Ver: 3.5.xc7) funktioniert das Einfügen eines Byte [] -Array in ein Blob -Feld gut, aber das Aktualisieren dieses BLOB -Feldes mit einem Byte [] -Array führt zu einem 609 -Fehler. Stattdessen an IfxBlob muss erstellt und als Wert festgelegt werden. Dies funktioniert auch bei Einfügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top