У меня есть таблица, которая выглядит следующим образом:
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)
Что я делаю не так?