如果数据库中存在字节文件,我该如何使用查询进行比较
本文关键字:何使用 查询 比较 数据库 存在 字节 文件 如果 | 更新日期: 2023-09-27 18:24:18
我想使用asp.net检查数据库中是否存在文件。我搜索了一下,但没有发现与字节文件相比。
我使用了Visual Studio 2010、SQL Server 2008和C#语言。
所以,我试图写这个代码,但显示错误:
"System.Byte[])"附近的语法不正确。
此外,这个问题还有其他解决方案吗?
代码
if (ext == ".doc" || ext == ".docx" || ext == ".pdf" || ext == ".txt")
{
Stream fs = FileUpload1.PostedFile.InputStream;
BinaryReader br = new BinaryReader(fs);
Byte[] bytes = br.ReadBytes((Int32)fs.Length);
//insert the file into database
strQuery = "insert into [Text File](User_id, T_Title, T_Extension, T_Data, Course_code, Course_num, T_Description, T_Keyword,Date)" +
" values (@User_id, @T_Title, @T_Extension, @T_Data, @Course_code, @Course_num, @T_Description, @T_Keyword, @Date)";
SqlCommand cmd = new SqlCommand(strQuery);
cmd.Parameters.Add("@User_id", (string)Session["ID"]);
cmd.Parameters.Add("@T_Title", SqlDbType.VarChar).Value = filename;
cmd.Parameters.Add("@T_Extension", SqlDbType.VarChar).Value = ext;
cmd.Parameters.Add("@T_Data", SqlDbType.VarBinary).Value = bytes;
strQueryCount = "select count(*) from [Text File] where T_Data.SequenceEqual ('" + bytes + ")'";
cmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add("@Course_code", Course_code.SelectedItem.Text);
cmd.Parameters.Add("@Course_num", Course_num.SelectedItem.Text);
cmd.Parameters.Add("@T_Description", Description.Text);
cmd.Parameters.Add("@T_Keyword", keywords.Text);
InsertUpdateData(cmd, bytes, strQueryCount);
}
private Boolean InsertUpdateData(SqlCommand cmd, Byte[] bytes, string strQueryCount)
{
String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
try
{
con.Open();
command = new SqlCommand(strQueryCount, con);
int num = Convert.ToInt16(command.ExecuteScalar());
Label2.Text = num.ToString();
if (num == 0)
{
cmd.ExecuteNonQuery();
return true;
}
else
{
Label2.ForeColor = System.Drawing.Color.Red;
Label2.Text = "error ";
Description.Text = " ";
keywords.Text = " ";
Course_code.SelectedItem.Text = " ";
Course_num.SelectedItem.Text = " ";
return false;
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
return false;
}
finally
{
con.Close();
con.Dispose();
}
}
谢谢。。
您不能像在其他数据类型上那样比较byte stream
中的文件。您可以为hash
或check-sum
等文件生成一些唯一值,并将其与字节流一起存储在DB
中,用于检查文件是否存在。通常情况下,这些机制不用于此。只有当文件内容完全相同时,这才有效。即使是最细微的变化也无法识别匹配。
或者,您可以像往常一样决定存储一些备用信息。比如文件名或基于用户的验证,以检查文件是否存在。
编辑:
你可以找到类似的散列
string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}
请在此处查看
我同意,正如上面文章中所建议的,您可以维护hash
来管理文件比较。
既然你问了how to compare using query
,我在这里再加一个建议。
用C#编写一个函数来获取MD5哈希。以下是函数的代码。
public static string GetMD5Hash(string input)
{
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
return s.ToString();
}
所以获取文件的MD5散列,然后使用HASHBYTES('MD5', VarbinaryColumn))
,可以比较值。这将起作用,因为您将使用MD5哈希生成C#,并在SQL server中使用HASHBYTES
进行比较。
您还可以在SQL server和C#端执行其他类型的散列,如SHA1
。
有关哈希字节的详细信息-http://codepieces.tumblr.com/post/31006268297/sql-server-hashbytes-function-and-net-hashing-md5
同样,这也有同样的局限性,内容的微小变化意味着posted file
和stored file in SQL
之间的不匹配。