domingo, 30 de agosto de 2009

Livros de Delphi no Google Books

Alguns excelentes livros de Delphi, que recomendo a leitura, podem ser acessados pelo Google Books, clique e leia (parcial):


Delphi in a Nutshell


Delphi Developers Guide


Mastering Delphi (Dominando o Delphi)

domingo, 23 de agosto de 2009

Criando Stored Procedures em C# - Revista SQL Magazine 67




Na SQL Magazine 67 foi publicada uma matéria que fiz sobre a construção de Stored Procedures para SQL Server usando código gerenciado C#, através da integração com a CLR.

Aqui tem um preview de como fazer isso, uma Stored Procedure que retorna a quantidade de produtos em estoque:


using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
 
 
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void UnidadesEmEstoque(int ProductID)
{
// Configura conexão e instrução SQL
string ConStr = "context connection=true";
string SQL = "select UnitsInStock from Products "+
"where ProductID = @ProductID";
SqlConnection con = new SqlConnection(ConStr);
// Prepara comando para ser executado, setando parâmetros
SqlCommand cmd = new SqlCommand(SQL, con);
cmd.Parameters.AddWithValue("@ProductID", ProductID);
con.Open();
try
{
// Executa
object Estoque = cmd.ExecuteScalar();
// Cria estrutura de dados
SqlMetaData ColEstoque = new SqlMetaData("Estoque", SqlDbType.Int);
SqlDataRecord row = new SqlDataRecord(ColEstoque);
// Atribui valor
row.SetSqlInt32(0, (int)Estoque);
// Envia o resultado
SqlContext.Pipe.Send(row);
}
finally
{
con.Close();
}
}
}


Leia o artigo completo agora

sexta-feira, 21 de agosto de 2009

QUIZ Delphi History

Mais sobre o vírus que infecta a Lib do Delphi

Mais alguns posts interessantes:

Magazine ships Induc Delphi virus on cover CD ROM

Induc Virus Infects Popular Downloads Via Delphi

Marco Cantu

Info

Symantec

Agora pare para pensar:

Induce, em inglês, significa Induzir. Por que alguém se interessaria em fazer um vírus, não malicioso, para simplesmente causar terrorismo tecnológico, que infecta só as Libs do Delphi 4, 5, 6 e 7 (ou seja, versões antigas do Delphi)?

quarta-feira, 19 de agosto de 2009

Social Media Revolution

Dados atuais sobre o uso do Twitter, Google, Youtube, LinkedIn, Facebook...

Facebook = 100 milhões de usuários em menos de 9 meses. Se fosse um país, em número de pessoas (população), estaria em quarto lugar;

80% das empresas usam o LinkedIn como forma primária para contratar empregados;

As pessoas mais seguidas no Twitter, somam mais seguidores que a população da Irlanda, Noruega e Panama juntas;

80% dos usuários do Twitter o fazem via Mobile Devices;

O Youtube tem 100 milhões de vídeos;

Wikipedia tem 13 milhões de artigos;

Existem 200 milhões de Blogs e destes, 54% fazem posts diários;

Nós não precisamos mais procurar por notícias, elas vem até nós;

Em um futuro próximo não vamos mais precisar procurar por produtos ou serviços, eles vão nos encontrar via mídias sociais;

1,5 milhões de conteúdos Web (blogs, textos, vídeos) são postados no Facebook diariamente;

Novo vírus infecta a Lib do Delphi

Foi descoberto ontem um vírus que injeta código na unit Sysconst.dcu da LIB do Delphi versões 4,5,6 e 7, chamado "Induc". Com isso, todas as aplicações compiladas com o Delphi vão, obviamente, carregar o vírus. A remoção do vírus é simples, apague a DCU e renomeie a Sysconst.bak para Sysconst.dcu (sim, o vírus é tão esperto que faz backup do arquivo!).

Mais informaçõs no site da Mcafee

Para verificar se o seu EXE está infectado, use esse utilitário

terça-feira, 18 de agosto de 2009

Delphi Prism, Firebird, ASP.NET e AJAX

Existem inúmeras formas de acessar um banco de dados Firebird a partir de uma aplicação .NET. Sem dúvida, a melhor delas é usando o provider nativo do Firebird para o ADO.NET, em uma arquitetura multicamadas, como faremos aqui. Então baixe e instale o MSI.


Instalando o provider ADO.NET

Criando o ASP.NET Web Site

No Delphi Prism, iniciamos um novo Web Site ASP.NET, escolhendo um location para o site, a versão do framework como .NET 3.5 e linguagem Oxygene.



Para usarmos AJAX, precisamos colocar um ScriptManager no topo do formulário. Logo abaixo, colocamos um UpdatePanel e dentro dele, um GridView e um DetailsView. No DetailsView, configure a propriedade AutoGenerateInsertButton para True e DefaultMode para Insert.

Nós colocamos um GridView para visualizar os dados, e um DetailsView para permitir a inserção, já que, diferente do DBGrid da VCL, o GridView não suporta inserção.



Referenciando o assembly do provider

O próximo passo é dar um clique de direita no nome do WebSite no Solution Explorer e escolher Add Reference. Na janela que aparece, escolhemos browse e localizamos o assembly FirebirdSql.Data.FirebirdClient.dll, no diretório de instalação do FBCliente, em c:\ProgramsFiles\FirebirdClient (padrão).



Codificando a classe de acesso a dados

Não existe DataModule no .NET Framework. Precisamos usar um framework de persistência, como o NHibernate ou ADO.NET Entity Framework. Ou construir uma classe DAL (Data Access Layer), opção que farei aqui. Então, clique de direita no Solution Explorer e adicione uma classe chamada DAL.pas ao projeto, colocando-a na pasta App_Code.

O código da classe DAL está na listagem abaixo. Aqui usamos basicamente ADO.NET, com o provider nativo do Firebird, para criar os métodos CRUD para manipular dados (escolhi a tabela Customer, que é a mais simples do banco).


namespace;
 
interface
 
uses
System,
System.Data,
System.Web.Configuration,
FirebirdSql.Data.FirebirdClient;
 
type
DAL = public class
public
constructor;
method Select(): DataSet;
method Insert(Cust_No: integer; Customer: String);
method Update(Cust_No: integer; Customer: String);
method Delete(Cust_No: integer);
method ConStr(): String;
end;
 
implementation
 
constructor DAL;
begin
 
end;
 
method DAL.Select(): DataSet;
begin
var Con := new FbConnection(ConStr);
var SQL := "select Cust_No, Customer from Customer";
var da := new FbDataAdapter(SQL,Con);
var ds := new DataSet();
da.Fill(ds);
result := ds;
end;
 
method DAL.Insert(Cust_No: integer; Customer: String);
begin
var Con := new FbConnection(ConStr);
var SQL := "insert into Customer (Customer) values (@Customer);";
var cmd := new FbCommand(SQL, Con);
cmd.Parameters.AddWithValue("@Customer",Customer);
Con.Open();
try
cmd.ExecuteNonQuery();
finally
Con.Close();
end;
end;
 
method DAL.Update(Cust_No: integer; Customer: String);
begin
var Con := new FbConnection(ConStr);
var SQL := "update Customer set Cust_No=:Cust_No, Customer=:Customer where Cust_No=:Cust_No);";
var cmd := new FbCommand(SQL, Con);
cmd.Parameters.AddWithValue(":Cust_No",Cust_No);
cmd.Parameters.AddWithValue(":Customer",Customer);
Con.Open();
try
cmd.ExecuteNonQuery();
finally
Con.Close();
end;
end;
 
method DAL.Delete(Cust_No: integer);
begin
var Con := new FbConnection(ConStr);
var SQL := "delete from Customer where Cust_No=:Cust_No;";
var cmd := new FbCommand(SQL, Con);
cmd.Parameters.AddWithValue(":Cust_No",Cust_No);    
Con.Open();
try
cmd.ExecuteNonQuery();
finally
Con.Close();
end;
end;
 
 
method DAL.ConStr(): String;
begin
result := "User=SYSDBA;Password=masterkey;Database=C:\Program Files\Firebird\Firebird_1_5\examples\Employee.fdb;DataSource=localhost;"    
end;
 
end.


Nota: Uma boa prática é colocar a ConnectionString no arquivo Web.Config.

Usando o ObjectDataSource


Para fazer a ligação entre a camada de interface AJAX e a camada de acesso a dados, vamos colocar um ObjectDataSource dentro do UpdatePanel. Nas suas Tasks, escolhemos Configure Data Source. O próximo passo é escolher nossa classe DAL e apontar os métodos.





Agora basta usar as Tasks dos controles GridView e DetailsView para apontar para o ObjectDataSource. Nas Tasks do GridView habilitamos o Update e Delete.

Testando

Pressionando Ctrl+F5 temos o resultado o Web Site.



Download deste código-fonte no site da Embarcadero

segunda-feira, 17 de agosto de 2009

Enquete - NHibernate ou ADO.NET Entity Framework

Se você tivesse que optar por um framework de persistência e mapeamento O/R para suas aplicações, você escolheria:

NHibernate

ADO.NET Entity Framework



QUIZ ASP.NET 3.5

sábado, 15 de agosto de 2009

.net Magazine 65 em formato digital




Lançada a Revista .net Magazine 65 em formato digital. Mais conteúdo, mais interatividade, inovação, entrevistas, vídeos, apresentações, mesa redonda, enquete, QUIZ e claro, artigos :) Enjoy!

Guinther Pauli
Editor Geral Revista .NET Magazine Brasil

C#: Como criar uma lista genérica se estou usando tipos anônimos?

Vamos supor que eu crie um objeto baseado em um tipo anônimo, por exemplo:


var Cliente  = new { Nome = "Guinther", Idade = 31 };


Como eu crio uma coleção genérica para guardar vários objetos deste tipo anônimo, se eu não tenho o nome do tipo antes da compilação?


var Clientes = new List<OQueEuColocoAqui>()


Aqui vai uma possível solução:


var Cliente = new { Nome = "Guinther", Idade = 31 };
var Clientes = (new[] { Cliente }).ToList();
Clientes.Add(new { Nome = "Ben Campbell", Idade = 21 });

C#, VB.NET ou Delphi Prism(D#)?

Analise os códigos abaixo e tire suas próprias conclusões. Para facilitar, omiti usings e try finally. Os 3 códigos fazem exatamente a mesma coisa. Eu assino embaixo: com poquíssimo esforço, você domina 3 linguagens e abre imensamente seu legue de atuação no mercado. Conheça o framework, as classes, ASP.NET, ADO.NET. Assim você poderá atuar facilmente sem dificuldade tanto em projetos com Delphi .NET, C# ou VB.NET.

[C#]

   1: protected void Page_Load(object sender, EventArgs e)
   2: {
   3:     string ConStr = @"Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;";
   4:     SqlConnection con = new SqlConnection(ConStr);
   5:     string SQL = "select * from Customers";
   6:     SqlCommand cmd = new SqlCommand(SQL, con);
   7:     con.Open();
   8:     GridView1.DataSource = cmd.ExecuteReader();
   9:     GridView1.DataBind();
  10:     con.Close();
  11: }


[VB.NET]

   1: Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   2:         Dim ConStr As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;"
   3:         Dim con As SqlConnection = New SqlConnection(ConStr)
   4:         Dim SQL As String = "select * from Customers"
   5:         Dim cmd As SqlCommand = New SqlCommand(SQL, con)
   6:         con.Open()
   7:         GridView1.DataSource = cmd.ExecuteReader()
   8:         GridView1.DataBind()
   9:         con.Close()
  10:     End Sub


[Delphi Prism]

   1: method _Default.Page_Load(sender: Object; e: EventArgs);
   2: begin
   3:     var ConStr: String := "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;";
   4:     var con: SqlConnection := new SqlConnection(ConStr);
   5:     var SQL: String := "select * from Customers";
   6:     var cmd:SqlCommand := new SqlCommand(SQL, con);
   7:     con.Open();
   8:     GridView1.DataSource := cmd.ExecuteReader();
   9:     GridView1.DataBind();
  10:     con.Close();    
  11: end;

quinta-feira, 13 de agosto de 2009

Delphi - Programação para Banco de Dados e Web - Segunda Edição

Estou trabalhando na segunda edição do meu livro Delphi - Programação para Banco de Dados e Web, lançado em 2004 e sucesso de vendas em todo o país.

Novidades da segunda edição:
- Ampliada, mais capítulos;
- Atualizada: todos os exemplos serão expostos em Delphi XE, mesmo assim compatíveis ainda com Delphi 7 (usando diretivas de compilação);
- Os exemplos em Delphi for .NET serão migrados para Delphi Prism;
- Os exemplos do falecido IntraWeb (aka VCL for the Web) serão convertidos para ASP.NET com Delphi Prism. Os exemplos em IW serão também convertidos para IW no XE, ficando ambas disponíveis;
- Serão incluídos ainda dois novos capítulos extras e inéditos sobre as novidades do Delphi nas últimas versões, incluindo 2007, 2009, 2010 e XE;
- Novos capítulos também sobre DataSnap e SOAP;
- Capítulo especial sobre Delphi Prism;
- Capítulo de certificação também atualizado;
- UPDATED: Retirada dos exemplos que usam CLX / Kylix;
- UPDATED: Todos os bancos usados nos exemplo em Win32 (MySql, Interbase) serão migrados para Firebird 2.5;

Se tiver alguma sugestão de assunto que queira ver na segunda edição, sinta-se a vontade para enviar diretamente para o meu EMail

Curso de VS2008, ASP.NET 3.5 e C# 3.0 em São Paulo

Confirmadas as datas para a minha disciplina no curso de Pós-Graduação na Univem em Marília - SP, Sistemas Avançados para Internet. As datas são: 19,26 SET e 03,10 OUT.

Haverá uma turma especial, aberta à comunidade, com o mesmo conteúdo da disciplina. Data: 5 a 9 OUT. Para se inscrever, entre em Contato

terça-feira, 11 de agosto de 2009

C# 4.0 - Passagem de parâmetros nomeados

Novidade básica e simples no C# 4.0, mas interessante e útil.

Antes, para passar parâmetros para um método, fazíamos:


   1: AdicionarAumento(1928,21);


Mas o que são 1928 e 21?

Então, fazemos uma Boa Prática:


   1: int IdProduto = 1928;
   2: double AumentoPerc = 21;
   3: AdicionarAumento(IdProduto,AumentoPerc);


Agora:


   1: AdicionarAumento(IdProduto: 1928,AumentoPerc: 21);

Delphi 2010 beta

Já está praticamente tudo definido o que será novidade na próxima versão do Delphi. Neste link podemos encontrar todas as informações sobre a versão.

No meu post anterior sobre o beta, sugeri alguns recursos que poderiam ser implementados na linguagem. Basicamente o que temos hoje no C# 3.0 e Delphi Prism e que torna o código mais flexível. Exemplos:


   1: method MyClass.MyMethod();
   2: begin
   3:   var S := "Olá";
   4:   var Eu := new class (Nome := "Guinther", Idade := 31);
   5:   var Cds := new TClientDataSet(FileName := "dados.xml", Active := True);
   6: end;


Além disso, pessoalmente eu acharia que as aspas duplas seriam muito bem-vindas, assim como foi no Delphi Prism. É realmente complicado se acostumar com aspas simples e duplas quando se precisa programar em três ou mais linguagens ao mesmo tempo.

ASP.NET FavIcon

FavIcon é o ícone que é exibido ao lado esquerdo da barra de endereços do browser. Também é adicionado ao menu favoritos do navegador ao lado do título da página quando você a adiciona na lista. É simples fazer isso em ASP.NET. Supondo que você tenha um .ico chamado "favicon" no mesmo diretório do Web Site, adicione no seu ASPX dentro do Head o seguinte:


   1: <link rel="shortcut icon" href="~/favicon.ico" mce_href="~/favicon.ico" type="image/x-icon" />




Aqui tem um site interessante em que você faz upload da imagem e ele gera o FavIcon (.ico)

Classes Parciais no Delphi Prism

Classes parciais são classes que têm o mesmo nome porém estão codificadas em locais diferentes, dois arquivos .pas por exemplo. No momento da compilação, o compilador une ambos os códigos das classes e cria uma única. É usado exaustivamente pelo ASP.NET, por exemplo, para o novo modelo de compilação de páginas ASPX e code-behind, além de aplicações Windows Forms para separar código da inicialização do form. Para usar em aplicações Delphi Prism, é simples. Vejamos um exemplo básico:

Classe Cliente (arquivo Class1.pas):


   1: Cliente = public partial class
   2: public
   3:   method GetNome(): string;
   4: end;
   5:  
   6: method Cliente.GetNome(): string;
   7: begin
   8:   result := "Acme";
   9: end;


Classe Cliente (arquivo Class2.pas):


   1: Cliente = public partial class
   2: public
   3:   method GetTipo(): String;    
   4: end;
   5:  
   6: method Cliente.GetTipo(): String;
   7: begin
   8:   result := "Software";
   9: end;


Usando a classe:


   1: var NewCustomer := new Cliente();
   2: Console.Write(NewCustomer.GetNome());
   3: Console.Write(NewCustomer.GetTipo());


Essa técnica também pode ser usada para injetar código em classes existentes sem que para isso seja necessário alterar seus fontes, usar herança etc.

Interessado no Prism? Acompanhe meus cursos na DevMedia.

Funções úteis em Delphi

Retorna o diretório onde o Windows está instalado


   1: function GetWinDir: String;
   2: var
   3:   Buf: array[0..MAX_PATH-1] of Char;
   4: begin
   5:   GetWindowsDirectory(Buf, SizeOf(Buf));
   6:   Result := StrPas(Buf);
   7: end;


Iniciar o programa com o Windows


   1: procedure Iniciar();
   2: const
   3:    RunKey = '\Software\Microsoft\Windows\CurrentVersion\Run';
   4: var
   5:    Registry: TRegistry;
   6:    Myapp: String;
   7: begin
   8:      Myapp := 'Minha aplicação';
   9:      Registry := TRegistry.Create;
  10:      Registry.RootKey := HKEY_LOCAL_MACHINE;
  11:       if Registry.OpenKey(RunKey, FALSE) then
  12:       Begin
  13:              Registry.WriteString(Myapp, ParamStr(0));
  14:              Registry.Free;
  15:       end;
  16: end;


Coloque Registry no uses ;)