SubSonic é uma estrutura de acesso a dados muito boa que integra geração de código/Build Provider (um novo recurso do asp.net 2.0). É inspirado no ActionPack em ROR. É muito adequado para o rápido desenvolvimento de pequenos sites.
Comecei a usar esse framework ontem e descobri um pequeno problema.
Eu tenho um campo chamado Key e o SQL relata um erro ao gerar uma consulta para uma instrução Select. Como Key é uma palavra-chave, ela não tem escape no SQL gerado pelo SubSonic.
O SQL gerado durante a depuração pode ser obtido da seguinte forma:
SELECT TOP 100 PERCENT [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips] .[Rótulos] FROM [cfg_Tips] WHERE [cfg_Tips].Key = @Key ORDER BY [Id];
Modifiquei o método BuildWhere em SqlDataProvider.cs no código-fonte para resolver temporariamente este problema.
string estática protegida BuildWhere (Query qry)
{
string onde = "";
string whereOperator = "WHERE";
foreach (Onde wWhere em qry.wheres)
{
if (wWhere.ParameterValue! = DBNull.Value)
{
onde += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
Where.GetComparisonOperator(wWhere.Comparison) + " @" + wWhere.ParameterName;
}
outro
{
onde += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + Comparação.Is +
"NULO";
}
ondeOperador = "E";
}
foreach (BetweenAnd entre em qry.betweens)
{
onde += whereOperator + "[" + entre.TableName + "].[" + entre.ColumnName + "] ENTRE @start" +
entre.ColumnName + " AND @end" + entre.ColumnName;
ondeOperador = "E";
}
for (int i = qry.wheres.Count - 1; i >= 0; i--)
{
if (qry.wheres[i].ParameterValue == DBNull.Value)
{
qry.wheres.RemoveAt(i);
}
}
retornar para onde;
}
As partes que adicionei estão marcadas em verde no código acima.
É estranho que o autor tenha adicionado colchetes ao nome da tabela, mas não ao nome da coluna, o que obviamente não é rigoroso.
Também existem classes como MySqlDataProvider nesta biblioteca que também apresentam esse problema. Como não uso MySQL por enquanto, não vou alterá-los ainda.
Outra experiência é que, ao usar bibliotecas de terceiros de código aberto, tente adicioná-las ao projeto no código-fonte. Caso contrário, a depuração não será possível se algo der errado.
Agora, a maneira como uso essa estrutura é usar sua página da web de classe gerada GenerateAllClasses.aspx para gerar código e, em seguida, referenciá-lo eu mesmo. Embora seja um pouco mais problemático do que a geração direta padrão e a compilação e execução na memória, ainda vale a pena pela conveniência da depuração.
postado em 22/01/2007 00:28 Kinoho Reading (62) Comentários (4) Editar coleção Citação Rede Trecho Categoria: .NET
Comentário
# re: Problema sem escape do nome do campo SubSonic corrigido 22/01/2007 00:47 TerryLee
SubSonic não é ruim, é conhecido como uma camada de acesso a dados de código zero :) Responder mais comentários
# re: Nome do campo SubSonic correção de problema sem escape 22/01/2007 00:49 Kinohu
@TerryLee
Haha, sim. Porém, não me atrevo a usar seu modo automático, afinal sinto que tenho menos controle. O motivo é descrito neste post.
Responder Mais comentários
# re: Nome do campo SubSonic correção de problema sem escape 22/01/2007 00:53 TerryLee
@木野湖 Bem, sim,
eu só usei para escrever uma pequena demonstração :) Responder Mais comentários
# re: Nome do campo SubSonic correção de problema sem escape 2007-01-22 01:02 木野湖 sente essa coisa ao usá-lo separadamente A documentação é ainda escasso. O exemplo dado também é muito simples. O uso um pouco mais útil depende da minha própria exploração.
Por exemplo isto:
Para carregar um objeto com base em condições, o documento (pdf) menciona que você pode usar
object.Load(...) para carregar, e os parâmetros podem ser IDataReader, DataRow, DataTable.
Usei um IDataReader para passá-lo e. demorei muito para fazer isso é um erro. Finalmente, após depurar o código-fonte da estrutura, descobri que devo lê-lo uma vez antes de passar o IDataReader para ter sucesso. Por exemplo, é usado neste exemplo simples que escrevi:
/// <summary>
/// Obtenha o responsável pelo departamento onde o responsável está localizado
/// </sumário>
/// <param name="staff"></param>
/// <retorna></retorna>
public static Staff GetManager(Equipe pessoal) {
SubSonic.Query qry = new SubSonic.Query(Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, verdadeiro);
qry.AddWhere(Staff.Columns.OfficeId, staff.OfficeId
Gerente de equipe = new Staff());
Leitor IDataReader = qry.ExecuteReader();
if (leitor.Leitura())
{
gerenciador.Load(leitor);
}
gerente de retorno;
}
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html