2010-05-10 97 views
2

我有一個SQL數據庫爲用戶上載到服務器的每個文檔創建一個記錄。我想在用戶上傳文檔之前檢查此表,以確保它們不上載名稱已存在的文件。如何檢查SQL數據庫表以查看是否存在記錄

我知道如何建立連接並使SqlCommand查詢表中的現有記錄。但我不知道如何從sqlCommand中檢查記錄數。

這有道理嗎?

Using myConnectionCheck As New SqlConnection(myConnectionStringCheck) 
       Dim myCommandCheck As New SqlCommand() 
       myCommandCheck.Connection = myConnectionCheck 
       myCommandCheck.CommandText = "SELECT * FROM Req_Docs WHERE Doc_Name =" & DocName 
       myConnectionCheck.Open() 
       myCommandCheck.ExecuteNonQuery() 

      End Using 

由於提前,

安東尼

回答

2

使用if exists此問題

create procedure isDocExists 
@DocName varchar(255), 
@isExists bit output 
as 
    set @isExists = 0 
    if exists (SELECT Doc_Name FROM Req_Docs WHERE Doc_Name [email protected]) 
    begin 
      set @isExists=1 
    end 

以檢查記錄是否有或沒有

+0

對於IF EXISTS()爲+1。唯一需要注意的是將SELECT *更改爲SELECT Doc_Name,以便查詢只需要抓取一列。可以被認爲是挑剔的,但SQL人會告訴你SELECT *不應該被使用,除非出於性能方面的考慮。 – 2010-05-10 16:25:20

+0

是的,你是正確的查詢更新現在感謝信息 – 2010-05-10 16:30:13

1

ExecuteNonQuery是一個函數,那返回一個等於受影響行數的整數通過查詢。

但是,它通常用於更新。

您可能會考慮ExecuteScalar,它會返回結果集中第一行的第一列。

因此,如果您將查詢更改爲select count(*) from...,ExecuteScalar的結果將成爲行數,然後您可以測試。

0

如果你想算:

SELECT COUNT(*) as count FROM Req_Docs WHERE Doc_Name = 'DocName' 
+2

更好地使用IF EXISTS() - 這將停止一旦發現第一場比賽,而COUNT(*)將掃描整個表...... – 2010-05-10 16:08:07

+0

也許在WHERE語句中可能有極限1,它可能以類似的複雜度工作:) – marianboda 2010-05-10 16:17:13

+0

選擇頂部1 * ......一旦它找到一條記錄就停止。 – 2014-11-08 20:02:42

2

所以,很多事情錯在這裏:當您檢查,當你上傳

  • 多個文檔之間

    • 比賽條件應合理地不允許有一樣的名字。使用標籤,文件夾,時間戳或其他手段來區分它們。
    • 名稱參數上的Sql注入漏洞
    • SELECT查詢上的ExecuteNonQuery()。

    對於前兩個問題,我會給你一個好處,即你仍然允許上傳,這樣你就可以詢問用戶他們想如何關聯這些文檔。鑑於此,以下是您如何解決其他兩個問題:

    Using cn As New SqlConnection(myConnectionStringCheck), _ 
         cmd As New SqlCommand("SELECT COUNT(*) FROM (SELECT TOP 1 1 FROM Req_Docs WHERE Doc_Name= @DocName) t", cn) 
        cmd.Parameters.Add("@DocName", SqlDbTypes.VarChar, 255).Value = DocName 
    
        cn.Open() 
        Return CInt(cmd.ExecuteScalar()) 
    End Using 
    
  • 相關問題