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]