【问题标题】:Query with empty entry空条目查询
【发布时间】:2013-01-10 17:40:04
【问题描述】:

我正在开发一个目录程序,我使用这段代码在数据库中查找资源:

sql = "SELECT * FROM Articoli WHERE CodiceArt='"+CodArtEntry.Text+"' OR Barcode='"+BarcodeEntry.Text+"' OR NomeArt LIKE '%"+NameArtEntry.Text+"%'";

此代码有效,但如果 NameArtEntry (GTK# Entry) 为空,它将选择数据库的每条记录。

我怎样才能避免这种情况?非常感谢

【问题讨论】:

  • 也许您不应该连接字符串来生成查询。请改用SqlCommand,它至少可以防止最常见的 SQL 注入形式。看看dotnetperls.com/sqlparameter

标签: c# sql sqlite mono


【解决方案1】:

检查明确的空值并忽略它们。

sql = "SELECT * FROM Articoli WHERE CodiceArt is not null AND CodeArt <> '' and ( isCodiceArt='"+CodArtEntry.Text+"' OR Barcode='"+BarcodeEntry.Text+"' OR NomeArt LIKE '%"+NameArtEntry.Text+"%'");

【讨论】:

    【解决方案2】:

    试试这个

    var sql = String.Format("SELECT * FROM Articoli WHERE CodiceArt='{0}' OR Barcode='{1}'", CodArtEntry.Text, BarcodeEntry.Text);
    if (!String.IsNullOrWhiteSpace(NameArtEntry.Text))
         sql += String.Format(" OR NomeArt LIKE '%{0}%' ", NameArtEntry.Text);
    

    使用 String.Format 将使您的查询更具可读性,尤其是在您编写直接 sql 时

    【讨论】:

    • 非常感谢!这段代码对我有用并解决了我的问题! :)
    【解决方案3】:

    请注意,您的 SQL 语句容易受到 SQL-injection 的攻击。

    您总是可以通过逐步构建查询来解决它:

    var query = "SELECT * FROM Articoli WHERE CodiceArt='"+CodArtEntry.Text+"' OR barcode='"+BarcodeEntry.Text+"'";
    
    if(!String.IsNullOrEmpty(NameArtEntry.Text)){
        query += " OR NomeArt LIKE '%"+NameArtEntry.Text + "%'";
    }
    

    【讨论】:

      【解决方案4】:

      类似:

      sql = "SELECT * FROM Articoli WHERE (CodiceArt='" + CodArtEntry.Text + "' OR Barcode='" + BarcodeEntry.Text + "' OR NomeArt LIKE '%" + NameArtEntry.Text + "%') AND NameArtEntry IS NOT NULL AND NameArtEntry <> ''";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-30
        • 2011-10-26
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多