文件路径未保存在 SQL 数据库中

File path is not being saved in SQL database

我无法将文件路径保存到我的 SQL 数据库中的文档。我需要保存它,以便稍后检索文件。

基本上,该应用程序所做的就是持续监视特定文件夹的任何更改。因此,当添加文件时,它会检测到它,然后应将该文件保存在数据库中。现在我不确定这里的最佳做法是保存文件还是只保存文件路径?

这是我目前正在测试的代码:

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;

即:

Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.

任何帮助将不胜感激!

谢谢

@GSerg 是正确的,你的代码有很多问题。如果您只需要文件名,则不必读取文件。 FileInfo 可以为您提供该信息。如果您需要读取内容并保存它,您将需要在数据库中有一个文件内容字段。

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();
            }
        }