Путь к файлу не сохраняется в базе данных SQL - PullRequest
0 голосов
/ 25 января 2020

У меня проблемы с сохранением пути к файлу документа в моей базе данных SQL. Мне нужно сохранить его, чтобы потом можно было извлечь файл на более позднем этапе.

Итак, в основном приложение делает то, что оно постоянно просматривает указанную папку c на предмет любых изменений. Поэтому, когда файл добавлен, он обнаруживает его и затем должен сохранить этот файл в базе данных. Теперь я не уверен, что лучше всего сохранять файл или просто путь к файлу?

Это код, который я сейчас тестирую:

static void Main(string[] args)
{
    string path = "C:\\Documents";
    MonitorDirectory(path);
    Console.ReadKey();
} 

private static void MonitorDirectory(string path)
{
    FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
    fileSystemWatcher.Path = path;
    fileSystemWatcher.Created += FileSystemWatcher_Created;
    fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;
    fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;
    fileSystemWatcher.EnableRaisingEvents = true;
}

private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
    Console.WriteLine("File created: {0}", e.Name);

    string connectionString = @"Data Source=Development-PC\SQLEXPRESS;Initial 
    Catalog=FileDB;Integrated Security=True";
    FileStream stream = new FileStream(e.Name, FileMode.Open, FileAccess.ReadWrite);
    BinaryReader reader = new BinaryReader(stream);
    byte[] file = reader.ReadBytes((int)stream.Length);
    reader.Close();
    stream.Close();
    DateTime dateTimeVariable = DateTime.Now;
    SqlCommand command;
    SqlConnection connection = new SqlConnection(connectionString);
    command = new SqlCommand("INSERT INTO FileTable (filename, datestamp) VALUES (@filename, 
    @datestamp)", connection);
    command.Parameters.Add("@filename", SqlDbType.Binary, file.Length).Value = file;
    command.Parameters.Add("@datestamp", SqlDbType.DateTime, file.Length).Value = 
    dateTimeVariable;
    connection.Open();
    command.ExecuteNonQuery();
}

Ошибка, которую я получаю в строке 42:

command.Parameters.Add("@filename", SqlDbType.Binary, file.Length).Value = file;

Что означает:

Необработанное исключение. System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Любая помощь будет принята с благодарностью!

Спасибо

1 Ответ

1 голос
/ 25 января 2020

@ GSerg правильный, с вашим кодом много проблем. Вам не нужно читать файл, если вам просто нужно имя файла. FileInfo может предоставить вам эту информацию. Если вам нужно прочитать содержимое и сохранить его, вам потребуется поле filecontent в вашей базе данных.

static void Main(string[] args)
    {
        string path = @"C:\Documents";
        MonitorDirectory(path);
        Console.ReadKey();
    }

    private static void MonitorDirectory(string path)
    {
        FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
        fileSystemWatcher.Path = path;
        fileSystemWatcher.Created += FileSystemWatcher_Created;
        fileSystemWatcher.EnableRaisingEvents = true;
    }

    private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("File created: {0}", e.Name);

        string connectionString = @"Data Source=Development-PC\SQLEXPRESS;Initial Catalog=FileDB;Integrated Security=True";
        FileInfo info = new FileInfo(e.FullPath);
        byte[] file;
        using (var fileStream = File.OpenRead(e.FullPath))
        {
            BinaryReader reader = new BinaryReader(fileStream);
            file = reader.ReadBytes((int)fileStream.Length);
        }
        //FileStream stream = new FileStream(e.Name, FileMode.Open, FileAccess.ReadWrite);
        //BinaryReader reader = new BinaryReader(stream);
        //byte[] file = reader.ReadBytes((int)stream.Length);
        //reader.Close();
        //stream.Close();
        DateTime dateTimeVariable = DateTime.Now;
        using (var connection = new SqlConnection(connectionString))
        {
            using (var command = new SqlCommand("INSERT INTO FileTable (filename, datestamp) VALUES (@filename,  @datestamp)", connection))
            {
                command.Parameters.Add("@filename", SqlDbType.NVarChar).Value = info.Name;
                command.Parameters.Add("@filecontent", SqlDbType.Binary).Value = file;
                command.Parameters.Add("@datestamp", SqlDbType.DateTime).Value = dateTimeVariable;
                connection.Open();
                command.ExecuteNonQuery();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...