2016-03-22 22 views
0

私はいくつかのレコードを含むデータテーブルを持っています。データテーブルの各行には、ピクチャを格納するフィールドがあります。データテーブルの行をループしてデータベースのテーブルに挿入すると、その行のすべてのフィールドが正しく保存されます。すべてのレコードに対して、データテーブルの最初の行のピクチャが保存されます。私はコードをトレースし、アクセス可能な行に当たって、データテーブルの各行にピクチャを保存しようとします。私はVB.NETを使用しており、データベースはMS Accessです。データテーブルからMS Accessデータベース、VB.NETに画像のリストを挿入

私のコードは次のようになります。

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 

答えて

1

コードはあなたが求める正確に何が行われます。

あなたのループでは、各のためにこれを行うために、すべてのフィールドは、データセットの行の値以下の変化しています:画像のための除くdr(thefield)

は、あなただけのこの操作を行うため:img それは、このように常に同じ画像です。

あなたはdr(image)のようなものを持っている必要があります(私はそれが単に仕事を疑う)

+0

To Thomas G. imgは、次の行の文によって値が提供されるはずのパラメータです。 'cmd.Parameters.Add(img、OleDb.OleDbType.Binary).Value = dr( "Photo" ) ' バイト配列データなので、値のlilstに直接dr( "Photo")を使用することはできません。コマンドテキストのすべての要素は、String型でなければなりません。 –

0

私は答え自分自身を見つけます。問題はやや微妙です。 OleDbCommandsでは、パラメータの名前は付けられません。パラメータは? (疑問符)。私の質問のコードスニペットでは、変数imgの値は、ループの前にステートメントによって割り当てられていますか?パラメタの値は、出現順に指定しなければならない(MUST)。 I私の場合、一つのパラメータのみと私は声明で、単一のパラメータを提供がされています

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

しかし、ループの各反復では、別のパラメータが追加されます。 2番目のレコードの場合、パラメータの実際の値は2番目のパラメータになり、3番目のレコードは3番目のレコードになります.OleDbCommandsでは、パラメータの値はその順序で識別され、私の場合は、最初に提供された画像(つまり、最初のレコードの画像)が常に使用されます。 したがって、質問は「どのように私は、各反復で単一のパラメーターを提供することができますか?」に沸くそして答えは、この貴重なステートメントを含めることによって、各反復で追加されたパラメータで削除することです:の最後の文として

cmd.Parameters.Clear() 

をループ。 長らくの説明を申し訳ありません。

関連する問題