如果使用查询存在于数据库中,如何比较字节文件?

时间:2013-07-23 10:38:02

标签: c# asp.net sql sql-server bytearray

我想使用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();
    }
}

谢谢..

2 个答案:

答案 0 :(得分:2)

您无法像在其他数据类型上那样比较字节流中的文件。您可以为散列或校验和等文件生成一些唯一值,并将其与DB中的字节流一起存储,这可用于检查文件是否存在。通常这些机制不适用于此。这仅适用于文件内容完全相同的情况。即使是最轻微的变化也无法确定匹配。

或者您可以决定像我们通常那样存储一些备用信息。与文件名或基于用户的验证一样,以检查文件是否存在。

编辑:

您可以找到类似字符串哈希的哈希值;

using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
    hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}

see it here

答案 1 :(得分:1)

我同意,如上文所述,您可以维护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

有关hashbytes的更多信息 - http://codepieces.tumblr.com/post/31006268297/sql-server-hashbytes-function-and-net-hashing-md5

同样,这也有同样的限制,内容的轻微变化意味着posted filestored file in SQL之间的不匹配。