sqlite数据库没有返回结果

时间:2011-09-02 10:50:54

标签: c# database sqlite

为什么我的查询没有返回结果? 我正在使用C#。 它返回列标题但没有行。我的select语句有问题吗?

这是我的代码:

conn = new SQLiteConnection("Data Source=local.db;Version=3;New=False;Compress=True;");
DataTable data = new DataTable();
SQLiteDataReader reader;
using (SQLiteTransaction trans = conn.BeginTransaction())
{
    using (SQLiteCommand mycommand = new SQLiteCommand(conn))
    {
        mycommand.CommandText = "SELECT * FROM TAGTABLE WHERE TAG = '"+tag+"' ;";
        reader = mycommand.ExecuteReader();
    }
    trans.Commit();
    data.Load(reader);
    reader.Close();
    reader.Dispose();
    trans.Dispose();
}
return data;

TAGTABLE有以下字段:

TID int,
Tag varchar(500),
FilePath varchar(1000)

2 个答案:

答案 0 :(得分:1)

您不需要该交易,请尝试以下操作:

    DataTable data = new DataTable();

    using (SQLiteConnection conn = new SQLiteConnection("Data Source=local.db;Version=3;New=False;Compress=True;"))
    using (SQLiteCommand mycommand = new SQLiteCommand(conn))
    {
        mycommand.CommandText = "SELECT * FROM TAGTABLE WHERE TAG = @tag;";
        mycommand.Parameters.AddWithValue("@tag", tag);
        conn.Open();

        using (SQLiteDataReader reader = mycommand.ExecuteReader())
        {
            data.Load(reader);  
        }
    }

    return data;

如果SELECT没有产生任何结果,那么最有可能不返回任何内容的原因。

另请注意,实现IDisposable接口的任何内容都可以与using语句一起使用,因此不需要手动关闭/处理对象。

请注意,SQL已更改为使用参数化查询,这有助于降低SQL注入攻击的可能性,并且通常更清晰。

答案 1 :(得分:0)

由于您没有显示示例数据以及应该回溯一些常规指针:

  • 构建SQL的方式对SQL注入(一个严重的安全问题)很开放
  • 取决于tag的值(例如,如果它包含'),上述SQL语句将执行您不希望的事情
  • 因为using中的所有内容都是假的(好事!)问题是,using块内是否有异常抛出(请使用调试器检查)
  • 你为什么要使用交易?我看不出任何必要的理由......

请显示一些带有参数值和预期结果的示例数据......