столбцы таблицы - System.DBNull после вставки их в базу данных - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть таблица, которая выглядит следующим образом:

CREATE TABLE largeObject(
  fileName varchar2(50) primary key,
  fileContent blob,
  encrypthedFileContent blob
);

И это мой класс:

public class Blob
{
    public string FileName { get; private set; }
    public byte[] Binary { get; private set; }
    public byte[] EncryptedBinary { get; private set; }
    public Blob(string fileName, byte[] binary, byte [] encryptedBinary)
    {
        this.FileName = fileName;
        this.Binary = binary;
        this.EncryptedBinary = encryptedBinary;
    }

    public Blob(string FileName)
    {
        this.FileName = FileName;
    }

    public override string ToString()
    {
        return FileName;
    }

}

Используя этот код, я добавляю и загружаю значения таблицы из моей базы данных:

    private static byte[] encrypth(byte[] input)
    {
        PasswordDeriveBytes pdb = new PasswordDeriveBytes("mycoolpassword", new byte[] { 0x43, 0x87, 0x23, 0x72 });
        MemoryStream ms = new MemoryStream();
        Aes aes = new AesManaged();
        aes.Key = pdb.GetBytes(aes.KeySize / 8);
        aes.IV = pdb.GetBytes(aes.BlockSize / 8);
        CryptoStream cs = new CryptoStream(ms,
          aes.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(input, 0, input.Length);
        cs.Close();
        return ms.ToArray();
    }

    public static Blob ConvertToBlob(string filePath)
    {

        FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); //A stream of bytes that represnts the binary file
        BinaryReader reader = new BinaryReader(fs);  //The reader reads the binary data from the file stream
        byte[] binary = reader.ReadBytes((int)fs.Length);  //Bytes from the binary reader stored in BlobValue array

        fs.Close();
        reader.Close();
        return new Blob(filePath, binary,encrypth(binary));
    }

    public static void SaveToDb(string filePath)
    {
        Blob blob = ConvertToBlob(filePath);

        OleDbCommand cmd = new OleDbCommand("insert into largeObject values(:fileName, :fileContent, :encrypthedFileContent)", conn);

        cmd.Parameters.Add(new OleDbParameter(":fileName", Path.GetFileName(blob.FileName)));
        cmd.Parameters.Add(new OleDbParameter(":fileContent", blob.Binary));
        cmd.Parameters.Add(new OleDbParameter(":encrypthedFileContent", blob.EncryptedBinary));

        cmd.ExecuteNonQuery();
    }

Теперь вот проблема.После того, как я добавляю два файла в базу данных, другие файлы, которые я пытаюсь добавить, - System.DBNull, и я не знаю почему.После добавления второго-третьего файла я добавляю следующий файл, ничего не происходит (без ошибок и т. Д.).Но после того, как я пытаюсь получить файлы, я получаю сообщение об ошибке, что они System.DBNull.

Откуда я знаю, что они System.DBNull?Я попытался получить каждый файл (largeobject) из базы данных и добавил оператор if, если byte [] имеет значение null: if ((reader["fileContent"] != System.DBNull.Value) && (reader["encrypthedFileContent"] != System.DBNull.Value)).Оказывается, я был прав.Единственными файлами (большими объектами), которые я получил, были файлы, которые я добавил первым.(потому что они не сохраняются как System.DBNull)

Что я делаю не так?

...