您好我在C#中使用SQL时遇到问题
问题是没有返回结果或者至少是result.Rows.Count为0但是当我从
更改查询时String query = "SELECT * FROM local_entry WHERE filename ='" + filename + "' AND size =" + filesize;
到String query = "SELECT * FROM local_entry";
我在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表现得很奇怪,当我从原件复制更新的条目时,更新没有被转移,因此为什么没有结果,为什么这个发生我不知道但是谢谢你所有的帮助和代码现在很多
答案 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);
}
}