SubSonic es un marco de acceso a datos muy bueno que integra generación de código/proveedor de compilación (una nueva característica de asp.net 2.0). Está inspirado en ActionPack en ROR y es muy adecuado para el rápido desarrollo de sitios web pequeños.
Comencé a usar este marco ayer y descubrí un pequeño problema.
Tengo un campo llamado Clave y SQL informa un error al generar una consulta para una instrucción Select. Debido a que Key es una palabra clave, no se escapa en el SQL generado por SubSonic.
El SQL generado durante la depuración se puede obtener de la siguiente manera:
SELECCIONAR EL 100 POR CIENTO SUPERIOR [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Valor], [cfg_Tips] [Etiquetas] DESDE [cfg_Tips] DONDE [cfg_Tips].Key = @Key ORDEN POR [Id];
Modifiqué el método BuildWhere en SqlDataProvider.cs en el código fuente para resolver temporalmente este problema.
cadena estática protegida BuildWhere (Consulta qry)
{
cadena donde = "";
cadena dondeOperador = "DÓNDE";
donde (Dónde wDónde en qry.wheres)
{
si (wWhere.ParameterValue! = DBNull.Value)
{
donde += dondeOperador + "[" + wDónde.NombreTabla + "].[" + wDónde.NombreColumna + "] " +
Where.GetComparisonOperator(wWhere.Comparison) + "@" + wWhere.ParameterName;
}
demás
{
donde += dondeOperador + "[" + wDónde.NombreTabla + "].[" + wDónde.NombreColumna + "] " + Comparación.Es +
"NULO";
}
dondeOperador = "Y";
}
foreach (Entre y entre en qry.betweens)
{
donde += dondeOperador + "[" + entre.NombreTabla + "].[" + entre.NombreColumna + "] ENTRE @inicio" +
entre.ColumnName + " AND @end" + entre.ColumnName;
dondeOperador = "Y";
}
para (int i = qry.wheres.Count - 1; i >= 0; i--)
{
si (qry.wheres[i].ParameterValue == DBNull.Value)
{
qry.wheres.RemoveAt(i);
}
}
regresar a donde;
}
Las partes que agregué están marcadas en verde en el código anterior.
Es extraño que el autor haya agregado corchetes al nombre de la tabla pero no al nombre de la columna, lo que obviamente no es riguroso.
También hay clases como MySqlDataProvider en esta biblioteca que también tienen este problema. Como no uso MySQL por el momento, no los cambiaré todavía.
Otra experiencia es que cuando utilice bibliotecas de terceros de código abierto, intente agregarlas al proyecto en el código fuente. De lo contrario, la depuración no será posible si algo sale mal.
Ahora, la forma en que uso este marco es usar su página web de clase generada GenerateAllClasses.aspx para generar código y luego hacer referencia a él yo mismo. Aunque es un poco más problemático que la generación directa predeterminada y luego compilar y ejecutar en la memoria, vale la pena por la conveniencia de la depuración.
publicado el 22/01/2007 00:28 Lectura de Kinoho (62) Comentarios (4) Editar colección Cita Extracto de red Categoría: .NET
Comentario
# re: Problema sin escape del nombre del campo SubSonic solucionado 2007-01-22 00:47 TerryLee
SubSonic no es malo, se conoce como una capa de acceso a datos de código cero :) Responder más comentarios
# re: Corrección del problema sin escape del nombre del campo SubSonic 2007-01-22 00:49 Kinohu
@TerryLee
Jaja, sí. Sin embargo, no me atrevo a utilizar su modo automático, después de todo, siento que tengo menos control. El motivo es el descrito en este post.
Responder Más comentarios
# re: Corrección del problema sin escape del nombre del campo SubSonic 2007-01-22 00:53 TerryLee
@木野湖 Bueno, sí,
solo lo usé para escribir una pequeña demostración :) Responder Más comentarios
# re: Corrección del problema sin escape del nombre del campo SubSonic 2007-01-22 01:02 木野湖 siente esto cuando lo usa por separado La documentación es todavía escaso. El ejemplo dado también es muy sencillo. El uso un poco más útil depende de mi propia exploración.
Por ejemplo este:
Para cargar un objeto según las condiciones, el documento (pdf) menciona que puede usar
object.Load(...) para cargar, y los parámetros pueden ser IDataReader, DataRow, DataTable.
Usé un IDataReader para pasarlo y. Me tomó mucho tiempo hacerlo es un error. Finalmente, después de depurar el código fuente del marco, descubrí que debo leerlo una vez antes de pasar IDataReader para tener éxito. Por ejemplo, se usa en este ejemplo simple que escribí:
/// <summary>
/// Conseguir al responsable del departamento donde se encuentra el responsable
/// </summary>
/// <param nombre="personal"></param>
/// <devoluciones></devoluciones>
personal estático público GetManager (personal del personal) {
SubSonic.Query qry = nuevo SubSonic.Query(Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, verdadero);
qry.AddWhere(Staff.Columns.OfficeId, staff.OfficeId
Gerente de personal = nuevo Personal());
Lector IDataReader = qry.ExecuteReader();
si (lector.Read())
{
administrador.Cargar(lector);
}
gerente de devolución;
}
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html