1

Sqlite データベースに対してデータ アクセス レイヤーを実装しようとしています。テーブルの 1 つに日時フィールドが含まれています。

この日時フィールドにデータを挿入する際に問題があります。

cmd.CommandText = string.Format(
                        "INSERT INTO Orders(" +
                            "OrderId, " +
                            "Status, " +
                            "CreationTime, " +
                            "LastModification, " +
                            "CreatorName) " +
                        "VALUES(@orderId,@status,@creation,@modification,@creator)";
                    cmd.Parameters.AddWithValue("@orderId", orderId);
                    cmd.Parameters.AddWithValue("@status", status);
                    cmd.Parameters.AddWithValue("@creation", creationTime);
                    cmd.Parameters.AddWithValue("@modification", lastModificationTime);
                    cmd.Parameters.AddWithValue("@creator", creatorName);

私のテーブルの作成:

cmd.CommandText = "CREATE TABLE IF NOT EXISTS Orders(" +
                                  "OrderId TEXT PRIMARY KEY NOT NULL, " +
                                  "Status TEXT, " +
                                  "CreationTime DATETIME, " +
                                  "LastModification DATETIME, " +
                                  "CreatorName TEXT)";
4

1 に答える 1

3

文字列を手動で作成する代わりに、パラメータ化されたクエリを使用してパラメータ値を追加します。String.Format を使用すると、ご存知のように変換エラーが確実に発生し、SQL インジェクション攻撃にさらされます。

パラメータを使用すると、変換なしで値が渡されるため、変換エラーやインジェクション攻撃について心配する必要はありません。ほとんどのデータベースは、どの部分が変更される可能性があり、どの部分が実行ごとに同じままであるかを知っている場合、クエリをより適切に最適化することもできます。

あなたの場合、次のようなものを使用できます。

cmd.CommandText= "INSERT INTO Orders(" +
                        "OrderId, " +
                        "Status, " +
                        "CreationTime, " +
                        "LastModification, " +
                        "CreatorName) " +
                    "VALUES (@orderId,@status,@creation,@modification,@creator)";
cmd.Parameters.AddWithValue("@orderId",orderId);
cmd.Parameters.AddWithValue("@status",status);
cmd.Parameters.AddWithValue("@creation",creation);
cmd.Parameters.AddWithValue("@modification",modification);
cmd.Parameters.AddWithValue("@creator",creator);

トピック外 - パラメータ化されたクエリが高速な理由

すべてのサーバーは、クエリを解析して構造を理解し、クエリを実行するための実行計画を作成する必要があります。プランには、使用するインデックス、フィルタリングまたは結合の戦略、必要な一時構造などが含まれます。このプランの作成にはコストがかかるため、ほとんどのサーバーは作成したプランを後で使用するためにキャッシュします。

サーバーは、クエリのどの値が実際にパラメーターであり、どれが手動でコーディングされているかを認識しない限り、実際にクエリを解析せずに、既存のプランを使用できるか、新しいプランを作成できるかを判断できません。パラメーターを自分で指定することにより、サーバーがより優れた再利用可能なプランを作成できるようになります。毎秒大量のクエリを実行する場合、これは大幅な向上となります。

ネイティブ形式で値を渡すことは、テキストとして渡すよりもはるかに軽量であるため、高速であることは言うまでもありません。

于 2013-10-10T13:25:20.327 に答える