2010-05-10 93 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 
    
  • 相关问题