c# - 如何插入 BLOB 数据类型

标签 c# mysql blob

我正在使用以下代码插入 blob 字段:


MySql.Data.MySqlClient.MySqlConnection conn;
MySql.Data.MySqlClient.MySqlCommand cmd;

conn = new MySql.Data.MySqlClient.MySqlConnection();
cmd = new MySql.Data.MySqlClient.MySqlCommand();

string SQL;
int FileSize;
byte[] rawData;
FileStream fs;

conn.ConnectionString = "server=192.168.1.104;uid=root;" +
        "pwd=root;database=cady234;";

fs = new FileStream(@"d:\Untitled.gif", FileMode.Open, FileAccess.Read);
FileSize = (int)fs.Length;

rawData = new byte[FileSize];
fs.Read(rawData, 0, FileSize);
fs.Close();

conn.Open();

string strFileName = "test name";
SQL = "INSERT INTO file (file_name, file_size, file) VALUES ('" + strFileName + "', "+FileSize+", '"+rawData+"')";

cmd.Connection = conn;
cmd.CommandText = SQL;

cmd.ExecuteNonQuery();
conn.Close();

插入没问题,但使用“在查看器中打开值”时图像未显示:

enter image description here

最佳答案

当您使用字符串连接时,二进制数据未正确传递到您的插入 - 您将得到 rawData.ToString() 可能只是打印出 TypeName(因此您的二进制数据与 > 3000 字节的文件大小相比,长度为 13 个字节);试试这个:

byte[] rawData = File.ReadAllBytes(@"d:\Untitled.gif");
FileInfo info = new FileInfo(@"d:\Untitled.gif");

int fileSize = Convert.ToInt32(info.Length);

using(MySqlConnection connection = new MySqlConnection("server=192.168.1.104;uid=root;pwd=root;database=cady234;"))
{
    using(MySqlCommand command = new MySqlCommand())
    {
        command.Connection = connection;
        command.CommandText = "INSERT INTO file (file_name, file_size, file) VALUES (?fileName, ?fileSize, ?rawData);";
        MySqlParameter fileNameParameter = new MySqlParameter("?fileName", MySqlDbType.VarChar, 256);
        MySqlParameter fileSizeParameter = new MySqlParameter("?fileSize", MySqlDbType.Int32, 11);
        MySqlParameter fileContentParameter = new MySqlParameter("?rawData", MySqlDbType.Blob, rawData.Length);

        fileNameParameter.Value = "test name";
        fileSizeParameter.Value = fileSize;
        fileContentParameter.Value = rawData;

        command.Parameters.Add(fileNameParameter);
        command.Parameters.Add(fileSizeParameter);
        command.Parameters.Add(fileContentParameter);

        connection.Open();

        command.ExecuteNonQuery();

    }
}

我在这里为您介绍了几个概念;首先,如果您要一次加载所有二进制数据,只需使用静态方法 File.ReadAllBytes - 代码少了很多。

其次,无需每次都使用完全限定的命名空间 - 使用 using directive

第三,(有点令人困惑)还有一个 using statement在 C# 中。这确保了任何实现 IDisposable 的对象自己被正确清理。在连接的情况下,如果您的命令成功或失败,它将显式调用 Close 和 Dispose。

最后,我已将您的查询参数化。参数有用的原因有很多;它们有助于防止 SQL Injection ,并且在这种情况下,他们还应确保正确处理您的数据类型。您可以阅读更多关于 SqlParameter 的信息(与 MySqlParameter 一样,它是特定于数据库的实现,但使用相同的原理)。

经测试可与 MySQL 5.5.15、MySQL Connector 5.2.7 在 .Net 4 下运行

关于c# - 如何插入 BLOB 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13208349/

相关文章:

c# - 如何将此 sql 转换为 Linq C#

c# - Asp.Net 中并发用户访问的字典对象

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

php - 从 db 查询 blob 时,如何在查询中将 blob 转换为文本?

c# - 强制 Etag 检查 Blob 创建

c# - 使用 HierarchicalDataTemplate 展开/折叠数据绑定(bind) TreeView 项目

c# - 通用 with where 子句需要显式转换

android - 如何将 GCM 注册 ID 唯一存储到 MySQL 中

python - 使用 mycli 时出错

Delphi、TBlobField 和 UTF8