我已经阅读了其他有关此问题,但在大多数情况下都无济于事。 在创建另一条记录并允许它们再次上传同一文件之前,尝试检查文件是否已上传(文件名已发送到此表)。
我正在使用此代码并且它一直告诉我每个文件都是一个新文件,即使我使用相同的文件进行测试。显然它应该导致"存在"。已经使用" 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
答案 0 :(得分:1)
永远不要像这样建立一个SQL字符串。请参阅SQL injection。
您为什么使用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;
}
答案 1 :(得分:1)
有一些新的和更具创新性的方法可以解决简单的问题"替换所有`和"字符与..." SQL注入预防技术。在您的情况下,如果VideoURL恰好是varchar(而不是nvarchar),那么使用unicode字符U+02BC
(URL encoded = %CA%BC
)会将引号字符作为unicode字符串传入,这将是绕过C#检查,但SQL Server可以方便地转换为查询中的引号字符。这只是为什么你不应该这样做的一个例子:)。
就您的检查而言,我总是更喜欢使用TOP 1
让SQL Server缩短潜在的表扫描时间。所以,我会使用这个查询:
Select TOP 1 SomeNonNullIntColumn from TrainingVideo2 where VideoURL Like ... and Status=1;
使用ExecuteScalar执行查询。如果结果为null
,则记录不存在。