0

我想检查有关文件的数据是否存在于表中

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 面板中它有效,我正在复制相同的查询并且它有效,返回值为一行。问题出在哪里,我该如何解决?

4

4 回答 4

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如果您只想检查文件是否存在于数据库中,这也是为了提高性能。

于 2013-07-04T07:41:17.977 回答
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变量不包含任何不需要的空格,就像您的原始示例一样。

于 2013-07-04T07:49:20.250 回答
2

看起来您在名称后有一个空格 - 换句话说,说 name = "John",但在查询中它将是 'John'。这可能就是它不起作用的原因。

此外,您应该使用参数化查询来避免 SQL 注入攻击。这样的事情应该可以解决您的问题:

var command = new SqlCeCommand("Select * From Files
                                     Where nameFile=@Name",con);

command.Parameters.AddWithValue("@Name", name);
于 2013-07-04T07:45:26.470 回答
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();
于 2013-07-04T07:47:26.967 回答