2014-11-02 113 views
0

我已经阅读了关于此的其他问题,但这对大部分内容没有帮助。 在创建另一条记录并允许它们再次上传同一文件之前,试着检查文件是否已经上传(文件名发送到此表)。正确地检查数据库中是否已经存在记录

我正在使用此代码,它会一直告诉我每个文件都是新文件,即使我使用相同的文件进行测试。显然它应该导致“存在”。连接已经建立使用“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

我认为,你应该改变条件,当文件不存在时,它会导致'null',与'dbnull'比较,所以即使文件不存在,它也会说'存在',就像你一样检查'DBNull.Value.Equ..' – 2014-11-02 17:31:08

+2

永远不要返回一个字符串来代替真/假值。你的方法应该返回一个布尔值。 – 2014-11-02 17:32:56

+1

同样使用参数化查询而不是连接字符串,这对于sql注入来说是一个很大的安全漏洞 – Nripendra 2014-11-02 17:38:01

回答

1

有设计来解决简单的“全部替换`和”字与新的和更创新的方法... “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,则该记录不存在。

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; 
} 
+0

我的公司已经有连接设置,并记录流量。我无法设置新的连接。另外,它是一个需要登录的公司网站,我们不允许在任何地方输入'或',而且他们必须知道确切的数据库或表名。高级程序员并不担心它,所以这是我试图在c#中重写它,它来自高级程序员vb文件。 – 2014-11-02 17:45:08

+0

Private Function CheckName(name As String)As Int32 Dim sql As String =“SELECT ID FROM Company Where Name Like'”&name & “”” 昏暗OB为对象= Conn.ExecuteSqlScalarCommand(SQL) 如果IsDBNull以便(OB)然后 返回0 否则 返回CINT(OB) 结束如果 端功能 – 2014-11-02 17:46:13

+0

这真的不是在一个评论的可读性。 – weston 2014-11-02 17:48:04

相关问题