SQL Server & C# - 如何检查我正在上传的 varbinary(max) 文件是否已存在于表中?



我以以下格式将文件存储在SQL Server的表中:

文件 ID - 整数(自动递增),文件名 - 变量二进制(MAX),文件数据 - 变量二进制(MAX)。

我想做的是 - 通过上传一个新的文件名和文件数据作为参数,返回文件名和文件数据匹配的第一个 FileID,如下所示:

SqlCommand cmd = new SqlCommand("SELECT TOP 1 FileID FROM Attachments WHERE FileName = @FileName AND FileData = @FileData", Program.connection);
cmd.Parameters.AddWithValue("@FileName", Path.GetFileName(MyFile));
cmd.Parameters.Add("@FileData", SqlDbType.VarBinary).Value = File.ReadAllBytes(MyFile);
int result = (int)cmd.ExecuteScalar();

但是,无论我做什么,该函数在实际执行查询时都会在最后一行终止(无一例外)。我做错了什么?

如果可能的话,我宁愿不获取每个文件的数据并在 C# 中进行比较。

正如其他人在他们的评论中已经写的那样:首先,扩展您的表格以容纳另外 2 列。一个用于内容的哈希,一个用于文件长度。然后,您可以在用户上传文件时对文件的内容进行哈希处理并获取其长度。然后,查询 SQL-Server 以查找包含相同长度和相同哈希(以及相同名称,如果您希望将具有不同名称的相同文件视为不同文件)的行。如果命中,则不会将文件传输到 SQL-Server,如果未命中,则会创建新记录。

希望有帮助。

最新更新