我想检查表格中是否存在有关文件的数据
public bool ExistFile(string name)
{
bool result = false;
SqlCeConnection con = new SqlCeConnection();
con.ConnectionString =
ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
con.Open();
var command = new SqlCeCommand("Select * From Files
Where nameFile='"+ name +" ' ",con);
int returnValue = command.ExecuteNonQuery();
command.Dispose();
con.Close();
if (returnValue > 0)
result = true;
else
result = false;
return result;
}
在变量“name”中我在表中发送现有字符串,但“returnValue”始终为-1。 在testQuery面板中它工作,我正在复制相同的查询,它的工作原理,返回值是一行。 问题出在哪里,我该如何解决?
答案 0 :(得分:4)
更好的方法是:
var command = new SqlCeCommand("select top 1 * from Files where nameFile = @file",con);
command.Parameters.AddWithValue("@file", name);
var returned = command.ExecuteScalar();
if (returned != null)
{
returned = true;
}
这应该可以正常工作。如果您只想检查数据库中是否存在文件,top 1
也是为了提高性能。
答案 1 :(得分:3)
由于您只想检查记录是否存在,因此您无需返回查询中的任何字段。你可以使用ExecuteScalar:
这样写var command = new SqlCeCommand("select 1 as Result from Files where nameFile = @file",con);
command.Parameters.AddWithValue("@file", name);
var result=command.ExecuteScalar();
这将只返回一个值而不是整个记录
确保name
变量不包含任何不需要的空格,就像原始示例一样。
答案 2 :(得分:2)
看起来你的名字后面有一个空格 - 换句话说,比如name =“John”,但在查询中它将是'John'。这可能就是它无法正常工作的原因。
此外,您应该使用参数化查询来避免SQL注入攻击。这样的事情可以解决你的问题:
var command = new SqlCeCommand("Select * From Files
Where nameFile=@Name",con);
command.Parameters.AddWithValue("@Name", name);
答案 3 :(得分:1)
请始终使用parameterized SQL
。这种字符串连接对SQL Injection
攻击开放。
var command = new SqlCeCommand("Select * From Files Where nameFile= @nameFile",con);
command.Parameters.AddWithValue("@nameFile", name);
int returnValue = command.ExecuteNonQuery();