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 パネルでは機能します。同じクエリをコピーすると機能します。戻り値は 1 行です。問題はどこにありますか、どうすれば解決できますか?

4

4 に答える 4

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 に答える