SubSonic est un très bon framework d'accès aux données qui intègre la génération de code/Build Provider (une nouvelle fonctionnalité d'asp.net 2.0). Il s'inspire d'ActionPack dans ROR. Il est très adapté au développement rapide de petits sites Web.
J'ai commencé à utiliser ce framework hier et j'ai découvert un petit problème.
J'ai un champ nommé Key et SQL signale une erreur lors de la génération d'une requête pour une instruction Select. Parce que Key est un mot-clé, il n'est pas échappé dans le SQL généré par SubSonic.
Le SQL généré lors du débogage peut être obtenu comme suit :
SELECT TOP 100 PERCENT [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips] . [Étiquettes] FROM [cfg_Tips] OÙ [cfg_Tips].Key = @Key ORDER BY [Id];
J'ai modifié la méthode BuildWhere dans SqlDataProvider.cs dans le code source pour résoudre temporairement ce problème.
chaîne statique protégée BuildWhere (Query qry)
{
chaîne où = "" ;
stringwhereOperator = " WHERE ";
foreach (Où wWhere dans qry.wheres)
{
si (wWhere.ParameterValue != DBNull.Value)
{
où += WhereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
Where.GetComparisonOperator(wWhere.Comparison) + " @" + wWhere.ParameterName;
}
autre
{
où += WhereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + Comparison.Is +
"NUL";
}
oùOpérateur = " ET " ;
}
foreach (EntreEt entre dans qry.betweens)
{
où += WhereOperator + "[" + between.TableName + "].[" + between.ColumnName + "] BETWEEN @start" +
between.ColumnName + " ET @end" + between.ColumnName ;
oùOpérateur = " ET " ;
}
pour (int i = qry.wheres.Count - 1; i >= 0; i--)
{
if (qry.wheres[i].ParameterValue == DBNull.Value)
{
qry.wheres.RemoveAt(i);
}
}
retourner où;
}
Les pièces que j'ai ajoutées sont marquées en vert dans le code ci-dessus.
Il est étrange que l'auteur ait ajouté des crochets au nom de la table mais pas au nom de la colonne, ce qui n'est évidemment pas rigoureux.
Il existe également des classes telles que MySqlDataProvider dans cette bibliothèque qui rencontrent également ce problème. Comme je n'utilise pas MySQL pour le moment, je ne les modifierai pas encore.
Une autre expérience est que lorsque vous utilisez des bibliothèques tierces open source, essayez de les ajouter au projet dans le code source. Sinon, le débogage ne sera pas possible en cas de problème.
Maintenant, la façon dont j'utilise ce framework consiste à utiliser sa page Web de classe générée GenerateAllClasses.aspx pour générer du code, puis à le référencer moi-même. Bien que cela soit un peu plus gênant que la génération directe par défaut, puis la compilation et l'exécution en mémoire, cela en vaut toujours la peine pour la commodité du débogage.
publié le 22/01/2007 00:28 Lecture Kinoho (62) Commentaires (4) Modifier la collection Citer Extrait du réseau Catégorie : .NET
Commentaire
# re : Problème de nom de champ SubSonic non échappé résolu 2007-01-22 00:47 TerryLee
SubSonic n'est pas mauvais, il est connu comme une couche d'accès aux données sans code :) Répondre plus de commentaires
# re: Correction du problème sans échappement du nom de champ SubSonic 2007-01-22 00:49 Kinohu
@TerryLee
Haha, oui. Cependant, je n'ose pas utiliser son mode automatique, après tout, j'ai l'impression d'avoir moins de contrôle. La raison est celle décrite dans cet article.
Répondre Plus de commentaires
# re: Correction du problème non échappé du nom de champ SubSonic 2007-01-22 00:53 TerryLee
@木野湖 Eh bien, oui,
je ne l'ai utilisé que pour écrire une petite démo :) Répondre Plus de commentaires
# re: Correction du problème non échappé du nom de champ SubSonic 2007-01-22 01:02 木野湖 ressent cette chose lorsqu'il est utilisé séparément La documentation est encore clairsemé. L'exemple donné est également très simple. L'utilisation légèrement plus utile dépend de ma propre exploration.
Par exemple ceci :
Pour charger un objet en fonction de conditions, le document (pdf) mentionne que vous pouvez utiliser
object.Load(...) pour charger, et les paramètres peuvent être IDataReader, DataRow, DataTable.
J'ai utilisé un IDataReader pour le transmettre, et. ça m'a pris beaucoup de temps pour le faire, c'est une erreur. Enfin, après avoir débogué le code source du framework, j'ai découvert que je devais le lire une fois avant de transmettre le IDataReader pour réussir. Par exemple, il est utilisé dans cet exemple simple que j'ai écrit :
/// <summary>
/// Obtenir le responsable du service où se trouve le responsable
/// </summary>
/// <param name="staff"></param>
/// <retours></retours>
public statique Personnel GetManager (Personnel) {
SubSonic.Query qry = new SubSonic.Query(Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, true);
qry.AddWhere(Staff.Columns.OfficeId, staff.OfficeId
Gestionnaire du personnel = new Staff();
Lecteur IDataReader = qry.ExecuteReader();
si (lecteur.Read())
{
manager.Load(lecteur);
}
gestionnaire de retour ;
}
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html