2016-03-22 11 views
0

Ich habe eine Datentabelle mit mehreren Datensätzen. Jede Zeile der Datentabelle hat ein Feld, das ein Bild speichert. Wenn ich die Dataret-Zeilen durchlaufen habe, um sie in eine Tabelle einer Datenbank einzufügen, wird jedes Feld der Zeile korrekt gespeichert; aber für jeden Datensatz wird das Bild in der ersten Zeile der Datentabelle gespeichert. Ich verfolgte den Code und es traf die Zeilen, die darauf zugreifen und versuchen, die Bilder in jeder Zeile der Datentabelle zu speichern. Ich benutze VB.NET und die Datenbank ist MS Access.Liste der Bilder aus Datentabelle in MS Access-Datenbank einfügen, VB.NET

Mein Code sieht wie folgt aus:

For Each dr As DataRow In dt.Rows 
    cmd.CommandText = "INSERT INTO Table1 (" & _ 
      "[ID], " & _ 
      "[Name], " & _ 
      "[BDate], " & _ 
      ……. 
      "[TelNo], " & _ 
      "[Photo]) " & _ 
     " VALUES(" & _ 
      dr("ID") & ", '" & _ 
      dr("Name") & "', " & _ 
      dr("BDate") & ", '" & _ 
      ……. 
      dr("TelNo") & "', " & _ 
      img & ")" 

    cmd.Parameters.Add(img, OleDb.OleDbType.Binary).Value = dr("Photo") 
    cmd.ExecuteNonQuery() 
Next 

Antwort

1

Der Code macht genau das, was Sie fragen:

In der Schleife, alle Felder Verändern der Werte im Dataset Folge nach, weil Sie dies tun, für jeden : dr(thefield)

außer für das Bild, weil Sie dies nur tun: img Es ist also immer das gleiche Bild.

Sie sollten so etwas wie dr(image) haben (aber ich bezweifle es so einfach funktionieren)

+0

Zu Thomas G. img ist ein Parameter, dessen Wert von der Anweisung in der nächsten Zeile angegeben werden soll: 'cmd.Parameters.Add (img, OleDb.OleDbType.Binary) .Wert = dr ("Photo") ' Wir können dr ("Photo") nicht direkt in den Werten verwenden, da es sich um Byte-Array-Daten handelt. Alle Elemente im Befehlstext müssen String-Typ sein. –

0

Ich finde die Antwort selbst. Das Problem ist eher subtil. In OleDbCommands werden Parameter nicht benannt. Parameter werden durch? (das Fragezeichen). Im Codeausschnitt meiner Frage hat die Variable img den Wert von?, Der durch eine Anweisung vor der Schleife zugewiesen wird. Der Wert von Parametern MUSS in der Reihenfolge ihres Auftretens angegeben werden. Ich meinen Fall gibt es nur einen Parameter und bietet mir einen einzelnen Parameter durch die Aussage:

cmd.Parameters.Add(img, OleDb.OleDbType.Binary).Value = dr("Photo") 

jedoch in jeder Iteration der Schleife, wird ein anderer Parameter hinzugefügt werden. Für den zweiten Datensatz ist der tatsächliche Wert des Parameters der zweite Parameter, der dritte Datensatz hat seinen Wert an der dritten Stelle usw. Da in OleDbCommands Werte für Parameter durch ihre Reihenfolge identifiziert werden, und da es nur einen Parameter gibt In meinem Fall wird immer das zuerst bereitgestellte Bild (dh das des ersten Datensatzes) verwendet. Daher kocht die Frage nach unten zu ‚Wie kann ich einen einzelnen Parameter in jeder Iteration zur Verfügung stellen?‘ Und die Antwort ist, die Parameter von jeder Iteration, indem diese wertvolle Anweisung hinzugefügt zu entfernen:

cmd.Parameters.Clear() 

als letzte Anweisung in die Schleife. Entschuldigung für die langwierige Erklärung.

Verwandte Themen