[英]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.