2013-07-04 65 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();