2013-07-23 51 views
0

我想檢查文件是否存在於數據庫或不使用asp.net。我搜索了一下,但我沒有發現與字節文件比較。如何使用查詢在數據庫中存在比較字節文件?

我使用了Visual Studio 2010,SQL Server 2008和C#語言。

於是,我試着寫這個代碼,但顯示錯誤:

Incorrect syntax near '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(); 
    } 
} 

謝謝..

+0

文件通常不包含它們的文件名或甚至它們的擴展名。你究竟想要做什麼?如果您試圖通過其內容搜索二進制文件的類型,則必須非常熟悉文件格式。 –

回答

2

像我們做其他數據類型不能在字節流比較文件。您可以爲散列或校驗和等文件生成一些唯一值,並將其與字節流一起存儲在數據庫中,這可用於檢查文件是否存在。通常這些機制不用於此。這隻適用於文件內容完全相同的情況。即使最細微的變化也無法識別比賽。

或者,您可以決定存儲一些替代信息,就像我們通常所做的那樣。像文件名或基於用戶的驗證來檢查文件是否存在。

編輯:

你可以找到哈希像字符串哈希;

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

see it here

+0

如何從字節文件創建散列文件?什麼是校驗和? – Dalal

+0

@達拉爾答案已更新。 –

+0

非常感謝。我會試試:) – Dalal

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服務器中使用HASHBYTES進行比較。

你也可以在SQL服務器以及C#端執行其他類型的散列,如SHA1

更多關於HASHBYTES - http://codepieces.tumblr.com/post/31006268297/sql-server-hashbytes-function-and-net-hashing-md5

同樣,這有相同的限制,在內容上略有變化意味着posted filestored file in SQL之間的不匹配。

相關問題