簡體   English   中英

正確檢查數據庫中是否已存在記錄

[英]Properly check if a record already exists in a database

我已經閱讀了其他問題,但這在大多數情況下並沒有幫助。 在創建另一個記錄並允許他們再次上傳同一文件之前,嘗試檢查文件是否已經上傳(文件名已發送到該表)。

我正在使用此代碼,即使我使用同一文件進行測試,它仍會告訴我每個文件都是一個新文件。 顯然,它應導致“存在”。 已經使用“ this.Master.Conn”建立了連接,因此請不要使用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字符串。 請參見SQL注入

你為什么用like 您確實在該fileName有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;
}

有一些新的和更具創新性的方法可以解決簡單的“用...替換所有`和“字符...” 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 ,則該記錄不存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM