C#中的SQL查询未按预期工作

本文关键字:工作 中的 SQL 查询 | 更新日期: 2023-09-27 17:57:27

你好,我在C#中使用SQL时遇到问题

问题是没有返回结果,或者至少没有返回结果。Rows.Count为0,但当我从更改查询时

String query = "SELECT * FROM local_entry WHERE filename ='" + filename + "' AND size =" + filesize;

String query = "SELECT * FROM local_entry";

当应该有7个时,计算6个结果

我在sql浏览器中运行了查询,它返回1个结果,因此语法正确,结果为已知

以下是我用于查询的完整代码

public DataTable GetDataTable(string sql)
    {
        DataTable dt = new DataTable();
        try
        {
            SQLiteConnection cnn = new SQLiteConnection(dbConnection);
            cnn.Open();
            SQLiteCommand mycommand = new SQLiteCommand(cnn);
            mycommand.CommandText = sql;
            SQLiteDataReader reader = mycommand.ExecuteReader();
            dt.Load(reader);
            reader.Close();
            cnn.Close();
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
        return dt;
    }
    private bool ExecuteSQLQuery(String filename, String filesize)
    {
        filesize = filesize.Replace(",", String.Empty);
        String query = "SELECT * FROM local_entry WHERE filename ='" + filename + "' AND size =" + filesize;

        var results = GetDataTable(query);
        if (results.Rows.Count > 0)
        {              
            return true;
        }         
        return false;
    }

编辑-代码的意图很简单,可以比较文件名及其大小的列表。来自谷歌驱动器Local_entry的.db日志有5列inode_number(int)、filename(text)modified(int)checksum(text)和size(int)如果列表中的文件与.db中的条目匹配,则会将匹配文件的名称保存到.txt

已解决。事实证明,.db的行为很奇怪,当我用更新的条目从原始条目复制时,更新没有被继承,因此为什么没有结果,为什么会发生这种情况,我不知道,但感谢你的所有帮助,代码现在更干净了。

C#中的SQL查询未按预期工作

试试这个sql。

string sql = string.Format("SELECT * FROM local_entry WHERE filename LIKE '%{0}%' AND size = {1}", filename.trim(), filesize);

尝试这两个更改--

SQLiteCommand mycommand = cnn.CreateCommand();

mycommand.CommandType = CommandType.Text;

我还建议using,它可以生成更好的代码。像这样:

using (SQLiteConnection cnn = new SQLiteConnection(dbConnection))
{
  using(SQLiteCommand mycommand = cnn.CreateCommand())
  {
     mycommand.CommandType = CommandType.Text;
     mycommand.CommandText = sql;
     using (SQLiteDataReader reader = mycommand.ExecuteReader())
     {
        dt.Load(reader);
     }
  }
  mycommand.Close();
}

PS——您的代码中还有另外两个问题需要修复——一个什么都不做的catch和sql注入攻击的漏洞。

使用和Adapter加载DataTable比使用Reader更好,如果内存服务,您必须从适配器"读取",这可能是您没有看到结果的原因:

        public DataTable GetDataTable(string sql)
    {
        try
        {
            using (SQLiteConnection cnn = new SQLiteConnection(dbConnection))
            {
                using (SQLiteCommand mycommand = cnn.CreateCommand())
                {
                    mycommand.CommandType = CommandType.Text;
                    mycommand.CommandText = sql;
                    using (DataTable dt = new DataTable())
                    {
                        using (SQLiteDataAdapter da = new SQLiteDataAdapter())
                        {
                            da.SelectCommand = mycommand;
                            da.Fill(dt);
                            return dt;
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
    }