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

时间:2014-04-07 20:23:53

标签: c# sql sqlite

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

问题是没有返回结果或者至少是result.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;
    }

编辑 - 代码的意图很简单,比较文件名列表及其大小,从谷歌驱动器的.db日志开始,Local_entry有5列inode_number(int),文件名(文本)修改(int)校验和(文本)和大小(INT) 如果列表中的文件与.db中的条目匹配,则会将匹配文件的名称保存为.txt

解决。事实证明.db表现得很奇怪,当我从原件复制更新的条目时,更新没有被转移,因此为什么没有结果,为什么这个发生我不知道但是谢谢你所有的帮助和代码现在很多

3 个答案:

答案 0 :(得分:0)

尝试这两项更改 -

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 - 你应该修复你的代码中的另外两个问题 - 一个什么也不做的捕获和sql注入攻击的漏洞。

答案 1 :(得分:0)

试试这个sql。

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

答案 2 :(得分:0)

最好使用和适配器加载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);
        }
    }