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的行为很奇怪,当我用更新的条目从原始条目复制时,更新没有被继承,因此为什么没有结果,为什么会发生这种情况,我不知道,但感谢你的所有帮助,代码现在更干净了。
试试这个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);
}
}