从Windows窗体应用程序中选择不起作用

时间:2013-07-04 07:38:59

标签: c# winforms select sql-server-ce

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

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 个答案:

答案 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();