SubSonic は、コード生成とビルド プロバイダー (asp.net 2.0 の新機能) を統合する、非常に優れたデータ アクセス フレームワークです。 ROR の ActionPack からインスピレーションを受けており、小規模な Web サイトの迅速な開発に非常に適しています。
昨日からこのフレームワークを使い始めましたが、小さな問題を発見しました。
Key という名前のフィールドがありますが、Select ステートメントのクエリを生成すると SQL がエラーを報告します。 Key はキーワードであるため、SubSonic によって生成される SQL ではエスケープされません。
デバッグ時に生成されるSQLは以下のように取得できます。
SELECT TOP 100 PERCENT [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips] . [ラベル] FROM [cfg_Tips] WHERE [cfg_Tips].Key = @Key ORDER BY [Id];
この問題を一時的に解決するために、ソース コードの SqlDataProvider.cs の BuildWhere メソッドを変更しました。
保護された静的文字列 BuildWhere(Query qry)
{
文字列 ここで = "";
文字列 whereOperator = " WHERE ";
foreach (qry.wheres のどこどこ)
{
if (wWhere.ParameterValue != DBNull.Value)
{
where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
Where.GetComparisonOperator(wWhere.Comparison) + " @" + wWhere.ParameterName;
}
それ以外
{
where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + Comparison.Is +
"NULL";
}
whereOperator = " AND ";
foreach
(qry.betweens の BetweenAnd between)
{
where += whereOperator + "[" + between.TableName + "].[" + between.ColumnName + "] BETWEEN @start" +
between.ColumnName + " AND @end" + between.ColumnName;
whereOperator = " AND ";
}
for (int i = qry.wheres.Count - 1; i >= 0; i--)
{
if (qry.wheres[i].ParameterValue == DBNull.Value)
{
qry.wheres.RemoveAt(i);
}
}
どこに戻るか。
}
私が追加した部分は、上記のコード内で緑色でマークされています。
作成者がテーブル名には角括弧を追加したが、列名には角括弧を追加しなかったのは奇妙であり、これは明らかに厳密ではありません。
このライブラリには、MySqlDataProvider などのクラスにもこの問題があります。当面は MySQL を使用しないので、まだ変更しません。
もう 1 つの経験は、オープン ソースのサードパーティ ライブラリを使用するときに、それらをソース コードでプロジェクトに追加してみることです。そうしないと、何か問題が発生した場合にデバッグできなくなります。
このフレームワークを使用する方法は、生成されたクラス Web ページ GenerateAllClasses.aspx を使用してコードを生成し、それを自分で参照することです。デフォルトで直接生成してメモリ内でコンパイルして実行するよりも少し面倒ですが、デバッグの利便性を考えるとそれでも価値があります。
投稿日: 2007-01-22 00:28 きのほ 読書 (62) コメント (4) コレクション引用ネットワーク抜粋の編集 カテゴリ: .NET
コメント
# re: SubSonic フィールド名がエスケープされていない問題を修正 2007-01-22 00:47 TerryLee
SubSonic は悪くありません。ゼロコード データ アクセス層として知られています:) さらにコメントを返信
# re: SubSonic フィールド名がエスケープされていない問題の修正 2007-01-22 00:49 Kinohu
@TerryLee
ははは、はい。しかし、結局のところ、私はその自動モードを使用しません。結局のところ、私は制御が少ないと感じます。理由はこの投稿で説明したとおりです。
返信 さらにコメント
# re: SubSonic フィールド名がエスケープされていない問題の修正 2007-01-22 00:53 TerryLee
@木野湖 まあ、そうです、
# re: SubSonic フィールド名がエスケープされていない問題の修正 2007-01-22 01:02 木野湖は、それを個別に使用するとこのことを感じます。ドキュメントは次のとおりです
。
まだまばらです。示されている例も非常に単純です。もう少し便利な使い方は私自身の探求次第です。
たとえばこれ:
条件に基づいてオブジェクトをロードするには、ドキュメント (pdf) には
object.Load(...) を使用してロードできると記載されており、パラメータには IDataReader、DataRow、DataTable を
指定して渡し
ます。長い時間がかかったのは間違いです。最後に、フレームワークのソース コードをデバッグした後、成功するには、IDataReader を渡す前に一度コードを読み取る必要があることがわかりました。たとえば、これは私が書いたこの簡単な例で使用されています:
/// <summary>
/// 担当者のいる部署の担当者を取得
/// </概要>
/// <param name="staff"></param>
/// <戻り値></戻り値>
public static Staff GetManager(Staff スタッフ) {
SubSonic.Query qry = new SubSonic.Query(Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, true);
qry.AddWhere(Staff.Columns.OfficeId, Staff.OfficeId);
スタッフ マネージャー = new Staff();
IDataReader リーダー = qry.ExecuteReader();
if (reader.Read())
{
マネージャー.Load(リーダー);
}
リターンマネージャー。
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html