0

私はこのヘルパー関数を持っています:

public bool Delete(String tableName, String where)
    {
        Boolean returnCode = true;
        try
        {
            this.ExecuteNonQuery(String.Format("delete from {0} where {1};", tableName, where));                
        }
        catch (Exception fail)
        {
            MessageBox.Show(fail.Message);
            returnCode = false;
        }
        return returnCode;
    }

TableName には "[MyTable]" が含まれ、行 ID を表す一意の GUID である "[MyTable ID]='4ffbd580-b17d-4731-b162-ede8d698e026'" が含まれます。

関数は成功したように true を返し、例外はありませんが、行は DB から削除されません。

これは ExecuteNonQuery 関数です

 public int ExecuteNonQuery(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open();
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        int rowsUpdated = mycommand.ExecuteNonQuery();
        cnn.Close();
        return rowsUpdated;
    }
4

1 に答える 1

7

まず、そのように SQL を埋め込むだけではいけません。SQL インジェクション攻撃を避けるために、パラメータ化された SQLを使用する必要があります。

次に、 の戻り値を見てくださいExecuteNonQueryの通常のパターンに従うと仮定すると、ExecuteNonQuery影響を受けた行の数が返されます。0 を返していると思われます。これは、where句に一致するものが何もないことを意味します。

(私もキャッチをやめますException- おそらく何かをキャッチするのをやめますが、少なくとも必要に応じて特定のものをキャッチします。ローカル変数も取り除き、何を返したいかがわかったら直接戻ります... )

于 2013-02-06T20:14:43.670 に答える