1

MS Access 2007 データベースに画像を挿入しようとしています。私が選んだデータ型は「OLEObject」で、フィールド名は「Image」です。ボタンが押されたときに実行される次のコードを試しました。

Private Sub ButtonPress()

    Dim cmd As New OleDbCommand
    Dim MemStream As New IO.MemoryStream
    Dim DataPic_Update As Byte()
    Dim strImage As String

    If Not IsNothing(PictureBox1.Image) Then

        PictureBox1.Image.Save(MemStream, Imaging.ImageFormat.Png)
        DataPic_Update = MemStream.GetBuffer
        MemStream.Read(DataPic_Update, 0, MemStream.Length)
        strImage = "?"
        MemStream.Close()

    Else
        DataPic_Update = Nothing
        strImage = "NULL"
    End If

    con.Open()

    cmd.CommandText = "INSERT INTO Inventory([Image])" + "VALUES(@Image)"

    cmd.Parameters.Add("@Image", OleDbType.Binary).Value = DataPic_Update
    cmd.Connection = con
    cmd.ExecuteNonQuery()
    con.Close()

End Sub

コマンド「ExecuteNonQuery」の実行中に、次のエラーが発生します。

「条件式のデータ型が一致しません。」

このエラーを解決できません。既存のコードに必要な提案や変更を手伝ってもらえますか? 画像を挿入して、アクセス データベースから取得したい。

4

2 に答える 2

0

cmd.CommandText を連結する必要はありません。"([Image])" と "VALUES(@Image)" の間にスペースがないため、結果のクエリは次のようになります。

"INSERT INTO Inventory([画像])VALUES(@画像)"

それ以外の

"INSERT INTO Inventory([画像]) VALUES(@画像)"

フィールドにはスペースが含まれておらず、予約済みのキーワードでもないため、「画像」を囲む括弧は必要ありません。

Access にバイナリ ファイルを埋め込むために必要なすべての依存関係があることを確認します。この依存関係は、あまり明確でない場合があります。たとえば、Access XP を搭載した Windows XP では、これを実現するには Paintbrush をインストールする必要があったことを覚えています。

于 2013-09-02T13:14:42.443 に答える
0

Access データベースでテストした以下のコードを使用することをお勧めします。

Private Function ReadFile(sPath As String) As Byte()
    'Initialize byte array with a null value initially.
    Dim data As Byte() = Nothing

    'Use FileInfo object to get file size.
    Dim fInfo As New FileInfo(sPath)
    Dim numBytes As Long = fInfo.Length
    'Open FileStream to read file
    Dim fStream As New FileStream(sPath, FileMode.Open, FileAccess.Read)
    'Use BinaryReader to read file stream into byte array.
    Dim br As New BinaryReader(fStream)
    'When you use BinaryReader, you need to supply number of bytes to read from file.
    'In this case we want to read entire file. So supplying total number of bytes.
    data = br.ReadBytes(CInt(numBytes))
    fStream.Close()
    fStream.Dispose()
    Return data
End Function

画像をMS Accessデータベースに保存するコード

 Dim logo() As Byte = ReadFile("E:\logo.jpg")
    ' Update(23373, logo)
    Try
        Dim CN As New OleDbConnection(Str_Conn)
        CN.Open()
        Dim cmd As New OleDbCommand("Update TblInventory Set Image=@img Where Image_ID=@id", CN)
        cmd.Connection = CN

        cmd.Parameters.Add(New OleDbParameter("@finger", DirectCast(logo, Object)))

        cmd.Parameters.AddWithValue("@id", 51384)
        cmd.ExecuteNonQuery()
        CN.Close()
    Catch ex As Exception
        MessageBox.Show("Error Occured while Registering Finger Prints, Try Again" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.[Error])
    End Try

重要な注意: クエリで言及したのと同じシーケンスでパラメーターを渡す必要があります。

于 2015-08-10T17:11:14.330 に答える