2012-10-02 75 views
0

我試圖創建一個包含上傳新文件,首先檢查該文件已經存在於數據庫,或者不那麼如果在數據庫中不存在保存的是

Image Id (int) 
Imagename (varchar(50)) 
Image (image) 

SQL數據庫和ASPX寫在上傳按鈕,這代碼:

protected void btnUpload_Click(object sender, EventArgs e) 
{ 
    //Condition to check if the file uploaded or not 
    if (fileuploadImage.HasFile) 
    { 
     //getting length of uploaded file 
     int length = fileuploadImage.PostedFile.ContentLength; 

     //create a byte array to store the binary image data 
     byte[] imgbyte = new byte[length]; 

     //store the currently selected file in memeory 
     HttpPostedFile img = fileuploadImage.PostedFile; 

     //set the binary data 
     img.InputStream.Read(imgbyte, 0, length); 

     string imagename = txtImageName.Text; 

     //use the web.config to store the connection string 
     SqlConnection connection = new SqlConnection(strcon); 
     connection.Open(); 

     SqlCommand cmd = new SqlCommand("INSERT INTO Image (ImageName,Image) VALUES (@imagename,@imagedata)", connection); 
     cmd.Parameters.Add("@imagename", SqlDbType.VarChar, 50).Value = imagename; 
     cmd.Parameters.Add("@imagedata", SqlDbType.Image).Value = imgbyte; 

     int count = cmd.ExecuteNonQuery(); 
     connection.Close(); 

     if (count == 1) 
     { 
      BindGridData(); 
      txtImageName.Text = string.Empty; 
      ScriptManager.RegisterStartupScript(this, this.GetType(), "alertmessage", "javascript:alert('" + imagename + " image inserted successfully')", true); 
     } 
    } 
} 

當我上傳新圖片我需要首先檢查該圖像數據庫已經存在,如果它不存在數據庫中保存這一點。

請問我該怎麼做?

+0

這個問題沒有說清楚,你不想,如果它存在,以更新的形象。 –

回答

0
string cmd ="if not exists (select * from Image where ImageName= @imagename); "; 
\\if you want to check image data 
\\ (select * from Image where SUBSTRING(ImageName, 1, 8000)= SUBSTRING(@imagename, 1, 8000)); 
string cmd += "INSERT INTO Image (ImageName,Image) VALUES (@imagename,@imagedata)"; 
SqlCommand cmd = new SqlCommand(cmd, connection); 

如果您想驗證圖象 - ,你可以嘗試使用DATALENGTH作爲檢查的兩個圖像的第一道防線。 如果DATALENGTH是不同的,那麼你想有一個「不同的」圖片」。
您還可以使用SUBSTRING(Image, 1, 8000)先檢查8000個字節。
並且還SUBSTRING(Image, DATALENGTH(Image) - 7999, 8000)檢查最後8000個字節。

+0

這也適用,但更新和檢查使用if存在的行數會更快。它只需要一次表掃描而不是兩次。 –

+0

謝謝你的回答 但是,圖像本身的情況可能不是由圖像名稱? –

+0

是的,它可能在圖像本身。 –

0

之一最快的方法是做一個更新,然後插入如果更新不返回任何更新

string cmd = @"UPDATE Image SET Image = @imagedata WHERE ImageName = @ImageName 
       IF @@ROWCOUNT=0 
        INSERT INTO Image (ImageName,Image) VALUES (@imagename,@imagedata)"; 

或者如果圖像本身的查詢:

string cmd = @"UPDATE Image SET ImageName = @ImageName WHERE Image = @imagedata 
       IF @@ROWCOUNT=0 
        INSERT INTO Image (ImageName,Image) VALUES (@imagename,@imagedata)"; 
+0

'UPDATE'後跟'INSERT'受制於種族。'INSERT'帶有'NOT EXISTS',然後'@@ ROWCOUNT = 0'上的'UPDATE'可以避免這場比賽 –

+0

你的解決方案是一個很好的解決方案,問題是如果圖像已經存在,就不要做任何活動 –

+0

Emmanuele,問題是「圖像已經存在於數據庫中,如果它不存在保存」。因此檢查它不存在之前插入。 –

1

添加一個負責檢查表中文件名是否已存在的方法。

private bool FileExists(string imageName) 
    { 
     using (SqlConnection conn = new SqlConnection()) // establish connection 
     { 
      using (SqlCommand cmd = 
       new SqlCommand("select 1 where exists(select Id from Image where ImageName = @)", conn)) 
      { 
       cmd.Parameters.Add("@imagename", SqlDbType.VarChar, 50).Value = imageName; 
       return cmd.ExecuteNonQuery() > 0; 
      } 
     } 
    } 

然後我會叫這個,像這樣

 if (fileuploadImage.HasFile && !FileExists(txtImageName.Text)) 
     { 
      ... 
相關問題