quinta-feira, março 31, 2005

Whidbey vs Yukon

Nas últimas duas semanas tenho estado a experimentar as Betas do Visual Studio 2005 e do SQL Server 2005, e existem algumas lições a retirar e relembrar:

Lição 1: As frameworks que suportam os dois produtos não são compatíveis! Posso estar enganado, mas parece até que são desenvolvidas em paralelo sem qualquer tipo de coordenação. Para instalar ambos no mesmo sistema, deve-se começar, sempre, por instalar a framework mais recente.

Lição 2: Esquecer a última afirmação da lição 1. Não forçar a co-habitação dos dois espécimens, utilizar máquinas virtuais, nomeadamente o virtual PC. Aceder ao SQL Server remotamente a partir do VS.

Lição 3: Para configurar a rede da máquina virtual, instalar o Loopback Adapter (instruções aqui), e definir o adaptador de rede da máquina virtual como sendo o loopback adapter.

quinta-feira, março 10, 2005

[.NET] Acesso ao SQLServer através de Webservice e ADO.NET

Objectivo: Criar um webservice que disponibiliza métodos para aceder a uma base de dados.

Tecnologia:
- Microsoft Visual Studio .NET 2003
- Microsoft SQL Server 2000
- IIS
- C#

Este tutorial pretende, numa primeira fase, demonstrar como utilizar a tecnologia ADO.NET para comunicar com o SQL Server. Aproveitando depois esse trabalho, constrói-se um webservice que irá disponibilizar métodos para interagir com uma base de dados.

1ª Parte
Nota: Para que se possa utilizar ADO.NET é necessário importar dois namespaces: System.Data e System.Data.SqlClient.

.Ligar à base de dados
Para este efeito utiliza-se o objecto SqlConnection.

[C#]
String connString = "Data Source=localhost; Integrated Security=SSPI; Initial Catalog=PSA"; SqlConnection sqlConn = new SqlConnection(connString);
sqlConn.Open();
//Fazer operações...
sqlConn.Close();

A connection string fornece os dados necessários à conexão. Neste caso o data source é local e a base de dados que se pretende utilizar tem o nome PSA. Ao utilizar o método de autenticação Integrated Security=SSPI, e como neste caso o acesso vai ser feito via webservice, o que vai acontecer é que o login vai ser feito com o utilizador IUSR_NOMEDAMÁQUINA o que se traduz do lado do SQL Server como o utilizador guest. Ou seja, é necessário dar permissões ao guest sobre a base de dados ou as tabelas desejadas.
Outro ponto chave consiste em fechar sempre a conexão depois de já não ser necessária, para que possa ser devolvida à pool de conexões. A reutilização de conexões é feita se a connection string for a mesma.

.Executar uma query
Demonstra-se de seguida como preencher um DataSet com o resultado de uma query.

[C#]
SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT category from categories",sqlConn);
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);

Utiliza-se o objecto SqlDataAdapter, passando como parâmetro a query e a conexão. A query só é executada aquando da operação Fill.

Existem no entanto casos, em que não interessa receber o resultado de uma operação (por exemplo: uma inserção ou remoção). Para este caso, e para demonstrar uma técnica diferente, utiliza-se o objecto SqlCommand.

[C#]
SqlCommand sqlComm = new SqlCommand("INSERT INTO categories (category) VALUES('"+category+"')",sqlConn);
sqlComm.ExecuteNonQuery();

Se a query retornasse apenas um valor, poder-se-ia utilizar ExecuteScalar. Para obter um efeito semelhante à query select utilizar-se-ia, por sua vez, ExecuteReader que retorna um SqlDataReader.

Terminada a primeira fase, surge a fase trivial, criar um webservice que disponibilize métodos para manipular a base de dados.

2ª Parte
Criar um webservice utilizando o VS é muito fácil, basta criar um novo projecto desse tipo. Existem porém algumas coisas a apontar:
- A classe tem de herdar de System.Web.Services.WebService (feito automaticamente pelo VS)
- Todos os métodos marcados com o atributo [WebMethod] poderão ser invocados remotamente.

Para que todo o puzzle se junte convém olhar para o código fonte fornecido.

[código fonte] Nota: Descompactar e colocar a directoria na wwwroot do IIS.
[versão PDF]