3

我搜索了很多并尝试了各种方法,但无法解决这个问题。我需要将图像保存到 mysql 文件中。

我使用下面的代码将图像保存到数据库中。

try
{
    string location = @"C:\Users\test\Downloads\Photos\batman-greenscreen.jpg";

    FileStream fs = new FileStream(location, FileMode.Open, FileAccess.Read);
    UInt32 fileLength = (UInt32)fs.Length;
    byte[] buffer = new byte[fileLength];
    fs.Read(buffer, 0, (int)fileLength);

    string sqlPhotoQuery = "INSERT INTO tab_photo VALUES('" + photo.PhotoId + "','" + photo.ProjectID + "','" + photo.Day + "','" + photo.Barcode + "','" + photo.Photoname + "','" + photo.PhotoXml + "','" + buffer + "','" + fileLength + "')";
    int result = MySqlHelper.ExecuteNonQuery(connectionString, sqlPhotoQuery);
    if (result > 0)
        return true;
    else
        return false;
}
catch (Exception e)
{
    return false;
}   

在这个文件中图像长度为 12428, 保存价值

我尝试从数据库中检索数据:

Photo photo = new Photo();
try
{
    string sqlQuery = "SELECT * FROM tab_photo where PhotoId='"+photoId+"'";
    MySqlDataReader rdr = MySqlHelper.ExecuteReader(connectionString, sqlQuery);
    while (rdr.Read())
    {
        photo.PhotoId = rdr.GetString("PhotoId");
        photo.ProjectID = rdr.GetString("ProjectID");
        photo.Day = rdr.GetInt32("Day");
        photo.Barcode = rdr.GetString("Barcode");
        photo.Photoname = rdr.GetString("Photoname");
        photo.PhotoXml = rdr.GetString("PhotoXml");

        MemoryStream ms;
        UInt32 FileSize;
        Bitmap outImage;

        int fileSize = rdr.GetInt32(rdr.GetOrdinal("PhotoSize"));
        byte[] rawData = new byte[fileSize];
        rdr.GetBytes(rdr.GetOrdinal("Photo"), 0, rawData, 0, (Int32)fileSize);

        photo.imageByte = rawData;

    }
}
catch (Exception e)
{}

但是当我检索文件时,它只检索前 13 个字节。之后它的值为零并且检索值存在差异

检索值

我已按照使用 Connector/Net 处理 BLOB 数据中提到的说明进行操作。

据此,我已将设置更改如下: MySql 工作台设置

这就是数据保存在数据库中的方式 数据库中的数据

我无法获得正确值的原因是什么?数据保存或数据检索或数据库配置有什么问题吗?

4

3 回答 3

3

您无法在数据库中拥有正确的数据。通过将缓冲区连接到查询字符串中,“System.Byte[]”将被插入到数据库中,因为插入语句基本上看起来像

INSERT INTO tab_photo VALUES(...,'System.Byte[]', ...)";

像在示例中那样使用参数化查询,你应该很好。

不要只是将某个地方的字符串连接到您的 SQL 查询中。(并且不要在这样的方法中捕获和吞下所有异常。这使得在发生故障时很难调试。)

于 2013-04-05T07:06:39.183 回答
2

您将二进制数据放入字符串中以将其写入数据库,这将不起作用。尝试按照您发布的示例 URL 中的方法使用 @parameter 传递数据块。

于 2013-04-05T07:06:45.617 回答
2

您没有INSERT正确读取数据。你的INSERT声明如下:

string sqlPhotoInsert = "INSERT INTO tab_photo VALUES('" + ...

换句话说,您没有使用参数化查询来插入 BLOB 数据 - 这可能无法正常工作。

您必须使用参数化查询。您可以在MySQL 文档中找到工作示例(滚动到C#示例)。

于 2013-04-05T07:06:48.903 回答