【问题标题】:C# Binary conversion of document failsC# 文档的二进制转换失败
【发布时间】:2019-05-10 00:42:27
【问题描述】:

我正在尝试将我计算机中的文档放入 MySQL 数据库中的 BLOB 列。

我尝试将 .doc 文件转换为 byte[] 数组,但它一直将 [BLOB - 13 B](即 system.byte[] 作为字符串)保存到数据库而不是实际字节。

我不知道哪个部分失败了,我尝试了多种转换方法并坚持使用这种方法,因为:

int curr = 0;
foreach (string path in documenteFinal)
{
    try
    {
        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
        using (BinaryReader br = new BinaryReader(fs))
        {
            byte[] fileData = br.ReadBytes((int)fs.Length);
            connection.Open();
            MySqlCommand cmd = connection.CreateCommand();
            cmd.CommandText = "insert into documents values(null, '" + documenteFinal[curr] + "', '" + fileData + "')";
            cmd.ExecuteNonQuery();
            connection.Close();
        }
    }
    catch (System.ArgumentNullException)
    { break; }

    curr++;
}

【问题讨论】:

  • 你应该使用参数化查询,比如这里:stackoverflow.com/a/12235835/869621
  • 你的连接字符串在哪里?如果失败,代码中的哪一行?
  • @KevinGosse 这就是问题所在!谢谢!我总是这样查询,没有考虑过这样的问题。
  • @jdweng 正如 Kevin 和 BoredomOverload 指出的那样,这是一个错误编写的查询
  • 真正的错误是由于写入二进制数据。您在数据库条约作为字符串而不是字节数组的数据周围添加了双引号。

标签: c# binary byte blob


【解决方案1】:

这是因为您需要告诉您的查询它正在写入 Blob 字段,而您不只是尝试存储 fileDataToString() 表示形式。

我还没有测试过,但你应该能够使用参数化查询来实现你想要做的事情:

int curr = 0;
foreach (string path in documenteFinal)
{
    var fileBytes = File.ReadAllBytes(path);

    connection.Open();

    using (var command = new MySqlCommand(
        "INSERT INTO documents VALUES(null,'" + documenteFinal[curr] + "',@File)", connection))
    {
        command.Parameters.Add("@File", MySqlDbType.VarBinary, fileBytes.Length).Value = fileBytes;
        command.ExecuteNonQuery();
    }

    connection.Close();

    curr++;
}

【讨论】:

  • 成功了!!谢谢!我在尝试MessageBox.show(fileData.toString()) 时犯了错误,我认为文件没有正确读取,没有考虑查询。
【解决方案2】:

您应该在二进制数据之前添加一个0x 并删除单引号,尝试使用此行代替您的:

cmd.CommandText = "insert into documents values(null, '" + documenteFinal[curr] + "', 0x" + fileData + ")";

不过,我建议尝试使用 mysql 原生 LOAD_FILE 函数的更紧凑的源代码:

 foreach (string path in documenteFinal) {
    try {
          connection.Open();
          MySqlCommand cmd = connection.CreateCommand();
          cmd.CommandText = $"insert into documents values(null, '{path}', LOAD_FILE('{path}'))";
          cmd.ExecuteNonQuery();
          connection.Close();
    } catch(Exception) { break; }
  }

【讨论】:

  • 对于0x,我得到了一个MySql异常,(也许我有一个过时的MySql.dll,我大约一年前就有了)并且LOAD_FILE抛出这个:Column 'document' cannot be null.这件事是 .doc 之一是故意损坏的,所以我可以对其进行测试,它会抛出异常,但对其余部分来说就像一个魅力,所以答案实际上非常好,我不知道括号可以做到这一点查询(使我免于大量引用)
  • 是的,它是一个 C# 6 特性,称为“字符串插值”,它是一个非常有用的特性:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2016-06-05
  • 2012-02-11
相关资源
最近更新 更多