質問: 誰かがこれが何を意味するのかを説明してもらえますか(Dapper.netのウェブサイトから) 制限と警告 Dapperは、実行するすべてのクエリに関する情報をキャッシュします。これにより、オブジェクトを素早くマテリアライズし、パラメータを素早く処理できます。現在の実装は、この情報をConcurrentDictionaryオブジェクトにキャッシュします。格納するオブジェクトは決してフラッシュされません。 **パラメータを使用せずにSQL文字列を生成する場合、メモリの問題が発生する可能性があります。**ディクショナリをLRUキャッシュに変換することがあります。 私は大胆な線が何を意味するのか理解できません。私はSQL ServerとC#クライアントを使用しています。 誰かがこのメモリの問題を作成するC#コードのサンプルを提供していただけますか?ありがとうございました
回答: > パラメータを使用せずにSQL文字列を生成する場合、メモリの問題が発生する可能性があります。 > > あなたはこれを行うことができます: ``` cmd.CommandText = "SELECT email, passwd, login_id, full_name " + "FROM members " + "WHERE email = '" + email + "'"; ``` またはこれを行うことができます: ``` string s = "SELECT email, passwd, login_id, full_name " + "FROM members WHERE " + "email = @email"; SqlCommand cmd = new SqlCommand(s); cmd.Parameters.Add("@email", email); ``` 後者はパラメータ化されています。それは一度キャッシュされます。前者はパラメータ化されていません。それは`email`ための異なった価値のそれのような問合せを書くたびにキャッシュされ`email` 。これはあなたの記憶を爆発させます。 後者は非常に優れています。それは注入攻撃を避ける。 dapperは一度キャッシュすることができます。 SQL Serverは実行計画を一度コンパイルしてキャッシュします。 すでにパラメータ化されたクエリを使用している必要があります(必須)。あなたがしていない場合は、あなたがやっていることをすべて落として、これを最優先にしてください。 > 誰かがこのメモリの問題を作成するC#コードのサンプルを提供していただけますか?ありがとうございました > > 前者をループで実行してください。あなたの記憶が成長するのを見てください。後者はループで行います。あなたの記憶が成長しないのを見てください。