使用C#将图像文件插入Filemaker容器

时间:2013-03-21 20:41:05

标签: c# sql odbc filemaker

我尝试将图片(.bmp)插入Filemaker中的容器字段中。我设法让它插入正常,但它将其保存为.dat文件。我想知道是否有办法指定将其保存为哪种文件类型?

        try
        {
            Bitmap tempImage = new Bitmap("C:\\temp\\black.bmp");
            System.IO.MemoryStream stream = new System.IO.MemoryStream();
            tempImage.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] image = stream.ToArray();

            OdbcConnection connection = new OdbcConnection("DSN=Filemaker;UID=admin");
            connection.Open();


            OdbcCommand command = new OdbcCommand("INSERT INTO TestDatabase (LocatorNum, FileName, SampleSet, Image) VALUES (" + 
                                                                                                                        "'003'" + ", " + 
                                                                                                                        "'003'" + ", " + 
                                                                                                                        "'003'" + ", " +
                                                                                                                        "?" + ")");

            command.Connection = connection;
            command.Parameters.AddWithValue("?", OdbcType.VarBinary).Value = image;
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

1 个答案:

答案 0 :(得分:2)

FileMaker容器有多个流。每个流都标识有四个字符的标识符:'FNAM'是文件名,'SIZE'是图像维度,'FILE'是文件数据。如果您希望容器显示为图像,则可以使用支持的图像流,例如'JPEG''PDF '(请注意尾随空格),等等。

在您的情况下,您需要将数据放入其中一个流中。我不知道FileMaker是否支持BMP作为图像格式,至少我找不到它的流代码,但至少你把它作为'FILE'。 FileMaker文档说您需要使用PutAs()函数:

PutAs( column, type )

我不确定它是如何使用的,现在无法测试,但据我所知,它必须在列名中:

INSERT INTO TestDatabase
       (LocatorNum, FileName, SampleSet, PutAs(Image, 'FILE'))
VALUES ('003', '003', '003', ?)

也许你可以用这种方式编辑多个流,即:

INSERT INTO TestDatabase
       (..., PutAs(Image, 'FILE'), PutAs(Image, 'JPEG'), ...)

'FILE''JPEG'和其他类似的流是二进制的,因此您需要声明?占位符,然后使用参数绑定查询,就像现在这样做。我不确定'FNAM'流;我怀疑它可以简单地设置为一个字符串。我不知道如何传递'SIZE',但我认为FileMaker可以自己计算这个。

更新:BMP流代码为'BMPf'