正确检查数据库中是否已存在记录

本文关键字:存在 记录 是否 检查 数据库 | 更新日期: 2023-09-27 18:28:44

我读过关于这方面的其他问题,但在很大程度上没有帮助。在创建另一条记录并允许他们再次上传同一文件之前,尝试检查文件是否已上传(文件名已发送到此表)。

我正在使用这段代码,它不断告诉我每个文件都是一个新文件,即使我使用同一个文件进行测试。显然,它应该导致"存在"。已经使用"this.Master.Conne"建立了连接,所以请不要使用SQLCommand之类的东西。

我甚至尝试在查询中使用通配符。

   private string SQLCheck(string FileName)
{
    string Check = "Select VideoURL from TrainingVideo2 where VideoURL Like '" + FileName +"' and Status=1;";
    Object ob = this.Master.Conn.ExecuteSqlScalarCommand(Check);
    string Result;
    if (DBNull.Value.Equals(ob))
    {
        Result = "Exists";
    }
    else
    {
        Result = "NewFile";
    }
    return Result;
}

此外,有人有更好(更有效)的方法来做到这一点吗?

试图在c#中基本上重写它。

    Private Function CheckName(name As String) As Int32
    Dim sql As String = "SELECT ID FROM Company Where Name Like '" & name & "' "
    Dim ob As Object = Conn.ExecuteSqlScalarCommand(sql)
    If IsDBNull(ob) Then
        Return 0
    Else
        Return CInt(ob)
    End If
End Function

正确检查数据库中是否已存在记录

有一些新的、更具创新性的方法可以绕过简单的"用…替换所有`和"字符。。。"SQL注入预防技术。在您的情况下,如果VideoURL恰好是varchar(而不是nvarchar),则使用unicode字符U+02BC(URL编码=%CA%BC)将一个引号字符作为unicode字符串传入,这将绕过C#检查,但SQL Server将方便地在查询中转换为引号字符。这只是为什么你不应该这样做的一个例子:)。

就检查而言,我总是更喜欢使用TOP 1来让SQL Server缩短潜在的表扫描。所以,我会使用这个查询:

Select TOP 1 SomeNonNullIntColumn from TrainingVideo2 where VideoURL Like ... and Status=1;

使用ExecuteScalar执行查询。如果结果为null,则该记录不存在。

永远不要构建这样的SQL字符串。请参阅SQL注入。

为什么要使用likefileName中真的有Sql通配符吗?

示例(对"SqlCommand的东西"感到抱歉,但它很重要):

string sql = "select count(*) from TrainingVideo2 where VideoURL = @Name and Status=1"
using (SqlConnection conn = new SqlConnection(connString))
{
    SqlCommand cmd = new SqlCommand(sql, conn);
    cmd.Parameters.Add("@Name", fileName);
    conn.Open();
    return (Int32)cmd.ExecuteScalar() > 0;
}