Universidado Portucalense
Mestrado em Informática
Nuno Flores,
Departamento de Engenharia Informática Faculdade de Engenharia da Universidade do Porto
Computação Móvel
Aplicação DataAdapter Fill( ) DBMS DBMS Dataset - Connection - Command (SQL) - CommandBuilder Update( ) 3 3 Visualização Databind( ) Sql… (SQLServer) Oracle… (Oracle)OleDb… (BD’s com drivers OLEDB) Odbc… (BD’s com drivers ODBC)
CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
string connstr = “server=some; database=pubs; uid=sa; pwd=“; string command = “select * from titles”;
SqlConnection conn = new SqlConnection(connstr); SqlCommand comm = new SqlCommand(command, conn); SqlDataAdapter adapter = new SqlDataAdapter(comm); DataSet ds = new DataSet();
Ligação e configuração DataSet ds = new DataSet();
adapter.Fill(ds, “Titles”); list.DataSource = ds; list.DataMember = “Titles”; list.DataTextField = “title”; list.DataValueField = “price”; list.DataBind( ); Session[“MyDataSet”] = ds;
DataTable table = ds.Tables[“Titles”]; DataTable table = ds.Tables[“Titles”]; Modificação
Manipulação de um DataSet
4 4
DataTable table = ds.Tables[“Titles”]; DataRow row = table.NewRow( ); row[“title”] = “ADO.NET”; row[“price”] = 49.99; table.Rows.Add(row);
DataTable table = ds.Tables[“Titles”]; DataRow[ ] rows = table.Select(“price > 100.0”); foreach (DataRow row in rows)
row[“price”] = (decimal) row[“price”] – 5.00; DataTable table = ds.Tables[“Titles”];
DataRow[ ] rows = table.Select(“pubdate < ‘#1/1/1990’ ”); foreach (DataRow row in rows)
row.Delete( ); Novas linhas
Eliminação
CMOV
DataAdapter tem 4 propriedades que representam comandos SQL:
SelectCommand, InsertCommand, UpdateCommand, DeleteCommand
Insert, Update e Delete podem ser gerados a partir de SelectCommand usando umCommandBuilder.
SqlDataAdapter adapter = new SqlDataAdapter( … );
SqlCommandBuilder builder = new SqlCommandBuilder( adapter ); …
adapter.Update(table);
Se houver necessidade de garantir alguma ordem (por exemplo fazer os DELETE’s
5 5 Se houver necessidade de garantir alguma ordem (por exemplo fazer os DELETE’s
antes dos INSERT’s):
DataTable deletes = table.GetChanges(DataRowState.Deleted); adapter.Update(deletes);
DataTable inserts = table.GetChanges(DataRowState.Added); adapter.Update(inserts);
DataTable updates = table.GetChanges(DataRowState.Modified); adapter.Update(updates);
CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
Dataset Ficheiro XML ReadXML( … ); WriteXML( … ); 6 6 Dataset Ficheiro XML CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
Todos os acessos a BDs necessitam de uma ligação e de um comando (SQL). O padrão usual de acesso envolve 5 passos:
• Criação de 1 objecto ligação representando uma BD através de uma connection string • Criação de 1 objecto ligação representando uma BD através de uma connection string • Criação de 1 objecto comando representando uma instrução SQL e associação a uma ligação • Abertura da ligação através do método Open( )
• Chamada de um método do objecto comando de modo a executá-lo na BD • Fecho da ligação através do seu método Close( )
Por exemplo (commando de leitura – select):
SqlConnection conn = new SqlConnection(“server=some; database=pubs; uid=sa; pwd=“); try {
conn.Open();
SqlCommand cmd = new SqlCommand(“select * from titles”, conn); SqlDataReader reader = cmd.ExecuteReader( );
7 7
SqlDataReader reader = cmd.ExecuteReader( ); while (reader.Read( ) )
Console.WriteLine(reader[“title”]); }
catch (SqlException ex) { Console.WriteLine(ex.Message); } finally { conn.Close(); } CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
Leitura de comandos que só retornam um valor
…
SqlCommand cmd = new SqlCommand(“select max(advance) from titles”, conn); SqlCommand cmd = new SqlCommand(“select max(advance) from titles”, conn); decimal amount = (decimal) cmd.ExecuteScalar();
…
Outro:
MemoryStream stream = new MemoryStream(); …
SqlCommand cmd = new SqlCommand(“select logo from pub_info where pub_id=‘0736’ ”, conn); byte[ ] blob = (byte[ ]) cmd.ExecuteScalar();
stream.Write(blob, 0, blob.Length()); Bitmap bitmap = new Bitmap (stream);
8 8
Bitmap bitmap = new Bitmap (stream); … bitmap.Dispose(); … finally { conn.Close(); stream.Close(); } CMOV
Comandos que não retornam informação (inserts, updates, deletes e outros)
… …
SqlCommand cmd = new SqlCommand(“update titles set title_id=‘JP2002’ ” + “where title_id = ‘JP1001’ “, conn); cmd.ExecuteNonQuery();
… …
SqlCommand cmd = new SqlCommand(“delete from titles where” + “title_id = ‘JP2002’ “, conn); cmd.ExecuteNonQuery(); … 9 9 CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
Fazer uma transferência de uma conta para outra numa BD de um banco
SqlTransaction trans = null;
SqlConnection conn = new SqlConnection( . . . ); try {
try {
conn.Open();
trans = conn.BeginTransaction(IsolationLevel.Serializable); SqlCommand cmd = new SqlCommand( );
cmd.Connection = conn; cmd.Transaction = trans;
cmd.CommandText = “update accounts set balance = balance – 1000 where account_id=‘1111’ “; cmd.ExecuteNonQuery();
cmd.CommandText = “update accounts set balance = balance + 1000 where account_id=‘2222’ “; cmd.ExecuteNonQuery(); 10 10 trans.Commit( ); } catch (SqlException) { if (trans != null) trans.Rollback(); } finally { conn.Close();
} CMOV CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
A mesma operação de há pouco, mas com parâmetros:
SqlTransaction trans = null;
SqlConnection conn = new SqlConnection( . . . ); try {
conn.Open();
trans = conn.BeginTransaction(IsolationLevel.Serializable);
SqlCommand cmd = new SqlCommand(“update accounts set balance = balance + @amount “ + SqlCommand cmd = new SqlCommand(“update accounts set balance = balance + @amount “ +
“where account_id = @id”, conn); cmd.Parameters.Add(“@amount”, SqlDbType.Money); cmd.Parameters.Add(“@id”, SqlDbType.Char); cmd.Transaction = trans; cmd.Parameters[“@amount”].Value = -1000; cmd.Parameters[“@id”].Value = “1111”; cmd.ExecuteNonQuery(); cmd.Parameters[“@amount”].Value = 1000; cmd.Parameters[“@id”].Value = “2222”; 11 11 cmd.Parameters[“@id”].Value = “2222”; cmd.ExecuteNonQuery(); trans.Commit( ); } catch (SqlException) { if (trans != null) trans.Rollback(); } finally { conn.Close();
} CMOV CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
CREATE PROCEDURE proc_TransferFunds @Amount money, @From char(10), @To char(10) @To char(10) AS BEGIN TRANSACTION
UPDATE Accounts SET Balance = Balance - @Amount WHERE Account_ID = @From
IF @@ROWCOUNT = 0 BEGIN
ROLLBACK TRANSACTION RETURN
END
UPDATE Accounts SET Balance = Balance + @Amount WHERE Account_ID = @To
IF @@ROWCOUNT = 0 BEGIN
SqlConnection conn = new SqlConnection(…); try {
conn.Open();
SqlCommand cmd = new SqlCommand(“proc_TransferFunds”, conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(“@amount”, 1000); cmd.Parameters.Add(“@from”, “1111”); cmd.Parameters.Add(“@to”, “2222”); 12 12 BEGIN ROLLBACK TRANSACTION RETURN END COMMIT TRANSACTION GO cmd.Parameters.Add(“@to”, “2222”); cmd.ExecuteNonQuery( ); }
catch (SqlException ex) { Console.WriteLine(ex.Message); } finally { conn.Close(); } CMOV
DataSet Sql … Oracle … OleDb … Odbc … …DataAdapter
…Connection …Command…Command …CommandBuilder …DataReader DB 13 13 …Connection …Transaction …Command …Command …Parameter …Parameter …Exception …Error Data Provider CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
Computação Móvel
Permite a utilização de um modelo de arquitectura Smart Device Application
ADO.NET SQL Server CE client agent SQL Server CE RDA Merge replication modelo de arquitectura “mostly disconnected” opcional ADO.NET SqlServerCe .NET CF 15 15 SQL Server CE engine Database file (.sdf) Pocket PC Enterprise DB (SQL Server)
Classes extra em ADO.NET: SqlCeEngine
SqlCeReplication SqlCeRemoteDataAccess CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
Tipos de dados:
• booleanos - bit
• inteiros – tinyint, smallint, int, bigint
SQL Data Manipulation Statements: SELECT
• inteiros – tinyint, smallint, int, bigint
• numéricos – real, numeric, float
• binários – binary, varbinary, image
• unicode – nchar, nvarchar, ntext
• outros – money, datetime, uniqueidentifier
Outras características: • até 4 GB • Transações internas • Cursors SELECT INSERT UPDATE DELETE
SQL Data Definition Statements: CREATE DATABASE CREATE TABLE CREATE INDEX ALTER TABLE 16 16 • Cursors
• Segurança – encriptação e password
• Índices, constraints (id, unique, pk, fk), defaults
ALTER TABLE DROP TABLE DROP INDEX Muitas funções e operadores:
@@IDENTITY RAND
trigonométricas PATINDEX datas e horas SQRT, EXP, LOG stringsCMOV CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPoutros FEUP
if (!File.Exists(@”\My Documents\db.sdf”)) {
string constr = @”Data Source=\My Documents\db.sdf”;
string cmd1 = “CREATE TABLE Persons(Pid int not null primary key identity(1, 1),” + “ Name nvarchar(100) not null)”;
string cmd2 = “CREATE TABLE Sells(Sid int not null primary key identity(1, 1),” + “ Pid int references Persons(Pid), “ +
“ Pid int references Persons(Pid), “ + “ Price money not null, “ +
“ Descr nvarchar(100) not null)”; SqlCeEngine eng = new SqlCeEngine(constr); eng.CreateDatabase();
SqlCeConnection conn = new SqlCeConnection(constr); try {
conn.Open();
SqlCeCommand cmd = new SqlCeCommand(cmd1, conn); cmd.ExecuteNonQuery(); cmd.CommandText = cmd2; 17 17 cmd.CommandText = cmd2; cmd.ExecuteNonQuery(); }
catch (SqlCeException ex) { …. } finally { conn.Close(); } CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
.NET CF 2.0 .NET CF 2.0
SQL Server CE 3.5 (SQL Server 2005 Mobile) Query Analyzer 3.5
Bases de dados: ficheiros *.sdf
Podem ser criadas em Visual Studio 2008
18 18 e com as ferramentas do SQL Server 2005
(SQL Server Management Studio)
CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
.NET CF Application SQL CE Server Agent SQL Server OLE DB Provider Internet HTTP SqlCeRemoteDataAccess SQL CE Client Agent O L E D B OLE DB 19 19 SQL Server Database Internet Information Server (IIS) Database SQL CE Engine O L E D B CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
public void RDAPull(){
SqlCeRemoteDataAccess rda = new SqlCeRemoteDataAccess();
string ServerOledbStr =
“Provider=sqloledb; Data Source=dataserver;”+ “ Initial Catalog=Pubs;User Id=sa;Password=;”;
rda.LocalConnectionString =
@”Data Source=\My Documents\test.sdf”; rda.InternetURL = @“http://www.dataserver.com/sqlce/sscesa20.dll”; rda.InternetLogin = “MyDomain\someuser”; rda.InternetPassword = “HaRd2GuEsS!$*”; 20 20 rda.Pull( “Authors”,
“Select * from authors where state = ‘CA’”, ServerOledbStr, RdaTrackOption.TrackingOn); } query local table tracking behavior CMOV
public void RDAPush(){
SqlCeRemoteDataAccess rda = new SqlCeRemoteDataAccess(); SqlCeRemoteDataAccess rda = new SqlCeRemoteDataAccess();
string ServerOledbStr =
“Provider=sqloledb; Data Source=dataserver;”+ “ Initial Catalog=Pubs;User Id=sa;Password=;”;
rda.LocalConnectionString =
@”Data Source=\My Documents\test.sdf”; // set URL and IIS login/password
21 21 rda.Push( “Authors”, ServerOledbStr, RdaBatchOption.BatchingOn); } local table update as a single transaction CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP
public void UseRDA(){ public void UseRDA(){
SqlCeRemoteDataAccess rda = new SqlCeRemoteDataAccess();
rda.InternetURL =
@“http://www.dataserver.com/sqlce/sscesa20.dll”; rda.InternetLogin = “MyDomain\someuser”;
rda.InternetPassword = “HaRd2GuEsS!$*”;
rda.SubmitSql(“Delete from authors where state <> ‘CA’”, “Provider=sqloledb; Data Source=dataserver;”+ “ Initial Catalog=Pubs;User Id=sa;Password=;”); }
command to run on server
CMOV
CMOV -- MIEIC MIEIC -- 2008/2009 2008/2009 -- Nuno Flores Nuno Flores -- FEUPFEUP 2222
}