如何检查SQL数据库表以查看是否存在记录

时间:2010-05-10 15:50:58

标签: asp.net vb.net

我有一个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

提前致谢,

安东尼

4 个答案:

答案 0 :(得分: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 =@DocName)
    begin
           set @isExists=1
    end

检查记录在哪里

答案 1 :(得分:2)

这里有很多错误:

  • 检查时和上传时间之间的竞争条件
  • 合法地允许多个文档具有相同的名称。使用标签,文件夹,时间戳或其他方法来区分它们。
  • 名称参数
  • 上的Sql Injection漏洞
  • 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

答案 2 :(得分:1)

ExecuteNonQuery是一个函数,它返回一个等于查询影响的行数的整数。

但是,它通常用于更新。

您可以考虑使用ExecuteScalar,它返回结果集中第一行的第一列。

因此,如果您将查询更改为select count(*) from...,则ExecuteScalar的结果将是行数,然后您可以对其进行测试。

答案 3 :(得分:0)

如果你想要数:

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