C # Двоичное преобразование документа не удается - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь поместить документ со своего компьютера в столбец BLOB в базе данных MySQL.

Я пытался преобразовать файл .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++;
}

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Вы должны добавить 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; }
  }
0 голосов
/ 08 декабря 2018

Это потому, что вам нужно сообщить вашему запросу, что он пишет в поле BLOB-объектов, а вы не просто пытаетесь сохранить ToString() представление fileData.

Я не проверял его, но вы должны быть в состоянии достичь того, что вы пытаетесь сделать, используя параметризованные запросы:

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++;
}
...