SubSonic ist ein sehr gutes Datenzugriffs-Framework, das Codegenerierung/Build Provider integriert (eine neue Funktion von asp.net 2.0). Es ist von ActionPack in ROR inspiriert und eignet sich sehr gut für die schnelle Entwicklung kleiner Websites.
Ich habe gestern angefangen, dieses Framework zu verwenden und ein kleines Problem entdeckt.
Ich habe ein Feld mit dem Namen „Key“ und SQL meldet einen Fehler beim Generieren einer Abfrage für eine Select-Anweisung. Da Key ein Schlüsselwort ist, wird es in der von SubSonic generierten SQL nicht maskiert.
Das beim Debuggen generierte SQL kann wie folgt abgerufen werden:
SELECT TOP 100 PERCENT [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips] . [Labels] FROM [cfg_Tips] WHERE [cfg_Tips].Key = @Key ORDER BY [Id];
Ich habe die BuildWhere-Methode in SqlDataProvider.cs im Quellcode geändert, um dieses Problem vorübergehend zu lösen.
geschützte statische Zeichenfolge BuildWhere(Query qry)
{
string where = "";
string whereOperator = " WHERE ";
foreach (Where wWhere in qry.wheres)
{
if (wWhere.ParameterValue != DBNull.Value)
{
where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
Where.GetComparisonOperator(wWhere.Comparison) + " @" + wWhere.ParameterName;
}
anders
{
where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + Compare.Is +
„NULL“;
}
whereOperator = " AND ";
}
foreach (BetweenAnd between in qry.betweens)
{
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);
}
}
wohin zurückkehren;
}
Die von mir hinzugefügten Teile sind im obigen Code grün markiert.
Es ist seltsam, dass der Autor dem Tabellennamen eckige Klammern hinzugefügt hat, dem Spaltennamen jedoch nicht, was offensichtlich nicht streng ist.
Es gibt auch Klassen wie MySqlDataProvider in dieser Bibliothek, bei denen dieses Problem ebenfalls auftritt. Da ich MySQL vorerst nicht nutze, werde ich diese noch nicht ändern.
Eine weitere Erfahrung besteht darin, dass Sie bei der Verwendung von Open-Source-Bibliotheken von Drittanbietern versuchen, diese im Quellcode zum Projekt hinzuzufügen. Andernfalls ist das Debuggen nicht möglich, wenn etwas schief geht.
Nun verwende ich dieses Framework so, dass ich die generierte Klassenwebseite GenerateAllClasses.aspx verwende, um Code zu generieren, und ihn dann selbst referenziere. Obwohl dies etwas aufwändiger ist als die standardmäßige direkte Generierung und anschließende Kompilierung und Ausführung im Speicher, lohnt es sich aus Gründen der Bequemlichkeit des Debuggens dennoch.
gepostet am 22.01.2007 00:28 Kinoho Reading (62) Kommentare (4) Sammlung bearbeiten Zitat Netzwerkauszug Kategorie: .NET
Kommentar
# Betreff: Problem mit nicht maskiertem SubSonic-Feldnamen behoben 22.01.2007 00:47 TerryLee
SubSonic ist nicht schlecht, es ist als Zero-Code-Datenzugriffsschicht bekannt :) Weitere Kommentare beantworten
# Betreff: SubSonic-Feldname nicht maskiert Problemkorrektur 22.01.2007 00:49 Kinohu
@TerryLee
Haha, ja. Allerdings traue ich mich nicht, den Automatikmodus zu nutzen, schließlich habe ich das Gefühl, weniger Kontrolle zu haben. Der Grund ist wie in diesem Beitrag beschrieben.
Antworten Weitere Kommentare
# Betreff: SubSonic-Feldname nicht maskiert Problemkorrektur 22.01.2007 00:53 TerryLee
@木野湖 Nun ja,
ich habe es nur verwendet, um eine kleine Demo zu schreiben :) Antworten Weitere Kommentare
# Betreff: SubSonic-Feldname ohne Escapezeichen Problemkorrektur 22.01.2007 01:02 木野湖 spürt dieses Ding, wenn man es separat verwendet. Die Dokumentation ist immer noch spärlich. Das gegebene Beispiel ist auch sehr einfach. Die etwas nützlichere Verwendung hängt von meiner eigenen Erkundung ab.
Zum Beispiel dies:
Um ein Objekt basierend auf Bedingungen zu laden, wird im Dokument (PDF) erwähnt, dass Sie
object.Load(...) zum Laden verwenden können, und die Parameter können IDataReader, DataRow, DataTable sein.
Ich habe einen IDataReader verwendet, um es zu übergeben, und Es hat lange gedauert, bis ich es geschafft habe. Schließlich stellte ich nach dem Debuggen des Framework-Quellcodes fest, dass ich ihn einmal lesen muss, bevor ich den IDataReader übergebe, um erfolgreich zu sein. Es wird beispielsweise in diesem einfachen Beispiel verwendet, das ich geschrieben habe:
/// <summary>
/// Holen Sie sich den Verantwortlichen der Abteilung, in der sich der Verantwortliche befindet
/// </summary>
/// <param name="staff"></param>
/// <returns></returns>
public static Staff GetManager(Staff staff) {
SubSonic.Query qry = new SubSonic.Query(Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, true);
qry.AddWhere(Staff.Columns.OfficeId, staff.OfficeId
Staff manager = new Staff();
IDataReader reader = qry.ExecuteReader();
if (reader.Read())
{
manager.Load(reader);
}
Rückkehrmanager;
}
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html