2013-07-04 37 views
0

我想检查表选择不从Windows窗体应用程序工作

在变量“名”的存在我送现有表字符串有关的文件的数据,但“的returnValue”总是-1。 在testQuery面板它的工作原理,我复制相同的查询,它的工作原理,返回值是一行。 问题在哪里,我该如何解决这个问题?

+0

您确定名称后面有空格+“? –

+0

where nameFile ='”+ name +“'”....修复您的空间.. – Olrac

+6

您在名称后有一个额外的空间。 'nameFile ='“+ name +”''应该是'nameFile ='“+ name +”''。但是,您应该使用参数化查询来避免SQL注入攻击。 – Tim

回答

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变量不包含原始示例类似的任何不必要的空格只是一个单一的价值。

+0

OP会还需要更改返回值的检查:) – Tim

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是为了表现,如果你只想检查文件是否存在于数据库中。

+0

我试过但没有任何变化returnValue也是'-1':( – Alex

+1

@alex不检查返回值,检查查询的结果!没有记录受到查询的影响 –

+0

修复了命令执行的问题 – gzaxx

2

它看起来像名称后面有一个空格 - 换句话说,就是说name =“John”,但在查询中它将是'John'。这可能是因为它不工作。

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

var command = new SqlCeCommand("Select * From Files 
            Where [email protected]",con); 

command.Parameters.AddWithValue("@Name", name); 
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();