0

VB.NET で次のコードを使用して、OLE OBJECT タイプのイメージ フィールドを持つ MS ACCESS データベースから特定のユーザー イメージを取得します。

                 Dim strSql As String = ""
                'For Image
                strSql = "Select pic from emp_tb WHERE userid='" + textbox1.Text + "'"

                Dim sqlCmd As New OleDbCommand(strSql, con)

                'Get image data from DB
                Dim imageData As Byte() = DirectCast(sqlCmd.ExecuteScalar(), Byte())

                'Initialize image variable 
                Dim newImage As Image = Nothing

                If Not imageData Is Nothing Then
                    'Read image data into a memory stream 
                    Using ms As New MemoryStream(imageData, 0, imageData.Length)
                        ms.Write(imageData, 0, imageData.Length)
                        'Set image variable value using memory stream. 
                        newImage = Image.FromStream(ms, True)

                    End Using

                End If

でピクチャーボックスに取り出します

picturebox1.image=newImage

私のエラー: ここに画像の説明を入力

行番号300は

newImage = Image.FromStream(ms, True)

しかし、 「Perameterが無効です」というエラーメッセージが表示されます。sqlインジェクションを回避するためにパラメーターを使用する方法と、このエラーを解決する方法を教えてください........

4

3 に答える 3

1

RE: 画像を読み込もうとすると「パラメータが無効です」というエラーが表示される

Access でデータベース ファイルを開き、表示する画像を含むテーブルを開きます。

Photos.png

  • 画像列に説明Long binary dataが表示されている場合、画像は未加工のバイナリ データ (「BLOB」と呼ばれることもあります) として保存されており、既存のコード (またはそれに非常に近いもの) を使用して PictureBox に入力できるはずです。

  • ただし、画像列に「ビットマップ画像」や「パッケージ」などの説明が表示されている場合、画像は OLE 埋め込みオブジェクトとして保存されています。生のバイナリ データを (コードのように) 抽出し、それを画像に直接変換しようとすると、バイナリ データには実際の画像データを囲む OLE "ラッパー" が含まれているため、エラーが発生します。(詳細については、こちらの回答を参照してください。)

OLE「ラッパー」を削除して生の画像データを取得する方法については、非常に多くの議論がありましたが、残念ながらOLEは非常に複雑で、(明らかに)特に十分に文書化されていません. 何十ものスレッドを読んだ後、コンセンサスは次のようです。

  1. Access 自体から画像を保存および取得したい場合は、Access に「任せて」、OLE の複雑さをすべて処理してもらいます。

  2. 他のアプリケーションから画像を取得する場合は、画像を生のバイナリ データとして保存してください (つまり、Access 自体から画像を保存しないでください)。

  3. 上記の使用例の両方をカバーしようとすると、非常に面倒な場合があります。1つだけに固執するのが最善です。

  4. Access データベースから OLE の「ラップされた」オブジェクトを抽出する必要がある場合は、Stephen Lebans のOLEtoDiskユーティリティが非常に役立つことがわかります。

RE: パラメータ化されたクエリを使用して SQL インジェクション (およびその他の頭痛の種) から保護する

簡単だ。コードを次のように変更するだけです...

strSql = "Select pic from emp_tb WHERE userid=?"

Dim sqlCmd As New OleDbCommand(strSql, con)
sqlCmd.Parameters.AddWithValue("?", textbox1.Text)

'Get image data from DB
Dim imageData As Byte() = DirectCast(sqlCmd.ExecuteScalar(), Byte())
于 2013-06-29T11:03:06.223 に答える