Escolar Documentos
Profissional Documentos
Cultura Documentos
sobre C#
O C# é uma das linguagens que você pode usar na
plataforma .NET além dela você pode usar também VB
.NET e qualquer implementação que use o .NET
Framework , mas vou me ater somente as duas mais
conhecidas e que são distribuídas com o Visual Studio.
Então veja bem , você primeiro escolhe qual
linguagem vai usar , no nosso caso C# ou VB .NET ,
para na sequência criar os seus projetos na linguagem
escolhida. Dessa forma você pode desenvolver
aplicações Windows Forms usando C# ou VB .NET como
pode também desenvolver aplicações para web , no
caso ASP .NET , usando C# ou VB .NET.
Muita gente pensa que ASP .NET é uma linguagem, mas
não é , veja a seguir uma definição sobe ASP .NET da
WikiPédia:
ASP.NET é a plataforma da Microsoft para o desenvolvimento
de aplicações Web e é o sucessor da tecnologia ASP.
fonte: http://pt.wikipedia.org/wiki/ASP.NET
Veja também meus artigos : Minha primeira página
ASP.NET e ASP.NET evolução ou enganação
Bem, mas meu assunto neste artigo é C#.
class MainClass {
{}
2. Então pressione ENTER duas vezes para abrir espaço
entre os parêntesis;
}
3. Agora digite o seu código no interior do bloco
envolvido pelos parêntesis;
Console.WriteLine(“Hello Console.WriteLine(“Hello”
”) );
} }
errado correto
Se você não tomar cuidado com estes pequenos
detalhes pode ficar quebrando a cabeça procurando
erros que são na verdade erros de digitação.
namespace DocumentationCommentsExample
{
/// <summary>
/// A documentation sample -
the short description goes here
/// </summary>
/// <remarks>Where a longer description would go<
/remarks>
class ClassExample
{
/// <summary>
/// A member variable
/// </summary>
private string m_str;
/// <summary>
/// A method example
/// </summary>
/// <param name="val">a new value to be saved<
/param>
/// <returns>the length of the string</returns>
public int MethodExample( string val )
{
m_str = val;
return val.Length;
}
}
}
Abaixo segue uma lista das tags XML mais usadas na
documentação.( Lembre-se que com XML você pode
criar suas próprias tags)
TAG PROPÓSITO de uso
<summary> … Breve descrição de uma classe,
</summary> método ou propriedade.
<remarks> … Descrição mais detalhada.
</remarks>
<para> ... Permite delinear parágrafos dentro
</para> da tag <remarks>
<list type="…"> Permite usar marcadores para
… </list> formatar uma descrição. Os tipos de
marcadores podem ser “bullet”,
“number” e “table”.
<example> … Para disponibilizar um exemplo de
</example> como usar um método, propriedade
ou outro membro da biblioteca.
<code> … Para indicar que o texto incluído é
</code> código da aplicação.
<c> … </c> Para indicar que o texto incluído é
código da aplicação. É usada para
linhas de código que precisam ser
separadas da descrição.
<see Indica uma referencia a outro
cref="member"/> membro ou campo. O compilador
verifica se o membro realmente
existe.
<exception> … Para fazer a descrição de uma
</exception> exceção.
<permission> … Para documentar a acessibilidade.
</permission>
<param Para documentar um parâmetro de
name="name"> … um método.
</param>
<returns> … Para documentar um valor e seu
</returns> tipo retornado de um método.
<value> … Para descrever uma propriedade
</value>
A linguagem C# possui uma coleção de palavras chaves
ou reservadas que são usadas pela linguagem conforme
abaixo:
Abstract as base bool break
Byte case catch char checked
Class const continue decimal default
Delegate do double else enum
Event explicit extern false finally
Fixed float for foreach goto
If implicit in int interface
Internal is lock long namespace
New null object operator out
Override params private protected public
Readonly ref return sbyte sealed
Short sizeof stackalloc static string
Struct switch this throw true
Try typeof uint ulong unchecked
Unsafe ushort using virtual volatile
Void while . . .
Note que as palavras reservadas são todas em
caixa baixa (minúsculas) dessa forma o
compilador não vai reconhecer a instrução
Return pois a instrução correta é return.
Além disso C# contém duas categorias de tipos de
dados embutidos:
1- Tipos por valor - consistem em duas categorias :
Struts e Enumerations;
2- Tipos por referência - definidos por classes;
Qual a principal diferença ?
Em suma uma variável de valor ou Value-Type contém
diretamente a informação e uma variável de
referência (Reference-Type) contém uma referência a
um endereço de memória onde esta a informação.
Value-Type
• Armazena diretamente o valor;
• Cada copia da variável contém uma copia do valor;
• Operações em uma variável não afetam a sua
cópia;
• São variáveis Value-Type: integer, double, float e
struct;
Reference-Type
• Armazena uma referencia ao valor;
• Duas variáveis Reference-Type podem possuir uma
referencia a um mesmo objeto;
• Operações feitas em uma varíavel afetam a outra;
• Variáveis Reference-Type: string, array e classes;
Tipos de variáveis:
A seguir temos os tipos usado no C# com sua referência
no .NET Framework:
Tipo C# Tipo .NET Significado
Framework
bool System.Boolean Representa valores true e
false
byte System.Byte inteiro de 8-bit sem sinal
sbyte System.SByte
char System.Char Um caractere
decimal System.Decimal Tipo numérico para cálculos
financeiros
double System.Double Ponto flutuante de precisão
dupla
float System.Single Ponto Flutuante de precisão
simples
int System.Int32 Inteiro
uint System.UInt32 inteiro sem sinal
long System.Int64 Inteiro Longo
ulong System.UInt64 inteiro longo sem sinal
object System.Object objeto
short System.Int16 Inteiro Short
ushort System.UInt16 Um inteiro short sem sinal
string System.String Uma sequencia de
caracteres
A seguinte tabela mostra os tipos de variáveis e os
valores possíveis de se armazenar em cada uma delas.
string nome;
string nomeCompleto = "Little John";
Estruturas de repetição ( Laços )
objeto DataSet;
Através da ADO.NET podemos acessar dados de três
maneiras básicas: OLE DB , SQL e ODBC.
1- ) Usando um DataSet
Este modo é conhecido como modo desconectado.
O objeto DataSet veio para substituir com vantagens o
objeto recordset (ADO) e, guarda poucas similaridades
com o objeto recordset. Enquanto o objeto recordset
representa uma coleção de tabelas de dados O objeto
DataSet representa uma cópia do banco de dados em
memória.
Membro Descrição
Coleções
2- Usando um DataReader
Os objetos DataReader é uma das maneiras mais fáceis
para ler os dados retornados pelos objetos Command .
Eles permitem acessar e percorrer os registros no
modo de somente leitura e somente para frente -
forward-only .
O objeto DataTable
Ao tratar com banco de dados não podemos deixar de
pensar em tabelas e o objeto DataTable representa
uma ou mais tabelas de dados em memória. Os
objetos DataTable estão contidos no objeto DataSet
e/ou DataView.
O objeto DataView
O DataView tem a função de permitir a ligação dos
dados de uma fonte de dados com a interface do
usuário através do DataBinding . Através do DataView
podemos filtrar, ordenar, pesquisar e navegar pelos
dados oferecendo diversas visões de um mesmo
conjunto de dados ao usuário.
alteradas , novas)
o Added - linhas de dados novas.
o Deleted - Linha excluída pelo método Delete
o None - Nenhuma linha
o ModifiedCurrent - linhas de dados que foram
/// <summary>
/// Demonstra como trabalhar abrir uma conexão
com SqlConnection
/// </summary>
class SqlConnectionDemo{
3- Atualizar dados
O método ExecuteNonQuery também é usado para
atualização de dados:
// prepara um comando SQL para incluir dados
usando a instrução Update
string atualizaSQL = @"update Clientes set Nome
= 'Macoratti' where id = 1";
// 1.Instancia um novo comando com uma
consulta sql
SqlCommand cmd = new SqlCommand(atualizaSQL
);
4- Excluir dados
O método ExecuteNonQuery também é usado para excluir
dados:
// prepara um comando SQL para incluir dados
usando a instrução DELETE
string excluiSQL = @"delete from Clientes where
id = 1";
5- Obtendo valores
using System.Data.SqlClient;
namespace adonetCshp_3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender,
EventArgs e)
{
string connetionString = null;
SqlConnection cnn =
default(SqlConnection);
SqlCommand cmd = default(SqlCommand);
string sql = null;
connetionString = @"Data
Source=.\SQLEXPRESS;Initial
Catalog=Cadastro;Integrated Security=SSPI";
using System;
using System.Data;
using System.Data.SqlClient;
class ExecutaInsertUpdateDelete
{
public static void exibirRegistro(SqlCommand
comando, string ID)
{
comando.CommandText ="SELECT codigo, nome
FROM Clientes WHERE codigo = '" + ID + "'";
SqlDataReader dr = comando.ExecuteReader();
while (dr.Read())
{
listBox1.Items.Add("dr[\" codigo\"] = " +
dr["codigo"]);
listBox1.Items.Add("dr[\" nome\"] = " +
dr["Nome"]);
}
dr.Close();
}
public static void Main()
{
connetionString = @"Data
Source=.\SQLEXPRESS;Initial
Catalog=Cadastro;Integrated Security=SSPI";
SqlConnection conexaoSql =new
SqlConnection(connetionString) ;
SqlCommand comando =
conexaoSql.CreateCommand();
comando.CommandText ="INSERT INTO
Clientes (codigo, nome) VALUES (" + " 19,
'Macoratti')";
conexaoSql.Open();
int numeroLinhasAfetadas =
comando.ExecuteNonQuery();
l
listBox1.Items.Add("Numero de linhas afetadas = " +
numeroLinhasAfetadas);
exibirRegistro(comando, "9");
comando.CommandText = "UPDATE Clientes
SET Nome = 'Novo' WHERE codigo = 19";
numeroLinhasAfetadas =
comando.ExecuteNonQuery();
listBox1.Items.Add("Numero de linhas atualizadas =
" + numeroLinhasAfetadas);
exibirRegistro(comando, "9");
comando.CommandText ="DELETE FROM
Clientes WHERE codigo = 19";
numeroLinhasAfetadas =
comando.ExecuteNonQuery();
listBox1.Items.Add("Numero de linhas deletadas = "
+ numeroLinhasAfetadas);
conexaoSql.Close();
}
}
Para encerrar eu gostaria de falar sobre o bloco
using:
A instrução using declara o início de um bloco
Using e opcionalmente adquire os recursos do
sistema que o bloco controla.
Um bloco Using garante a liberação de um ou mais
dos tais recursos quando seu código estiver
finalizado com eles. Isso torna-os disponíveis para
uso por outros códigos.
As Classes SqlConnection e SqlCommand
implementam a interface IDisposable e isto
significa que eles podem usar recursos não
gerenciados e liberar tais recursos é trabalho do
desenvolvedor, de forma que depois de usar estas
classes temos que chamar o método Dispose().
Se ocorrer uma exeção no acesso ao banco de
dados temos que ter certeza que o Dispose() foi
chamado , este é um motivo para usar a palavra
reservada Using.
Obs: Recursos gerenciados são descartados pela
coletor de lixo .NET Framework (GC) sem qualquer
codificação extra de sua parte. Você não precisa
de um bloco Using para recursos gerenciados.
Veja abaixo um exemplo de bloco Using para criar
uma tabela em um banco de dados; a string de
conexão esta sendo obtida a partir do arquivo de
configuração
using (SqlConnection con = new
SqlConnection(Macoratti.Properties.Settings.Defaul
t.MacorattiConnectionString))
{
con.Open();
try
{
using (SqlCommand command = new
SqlCommand("CREATE TABLE Macoratti (Codigo
INT, Nome TEXT, Endereco TEXT)", con))
{
command.ExecuteNonQuery();
}
}
catch
{
Console.WriteLine("Tabela não pode ser
criada");
}
}
Outro exemplo usando Using e comparando com a
sintaxe tradicional sem usar Using:
using (SqlConnection cn SqlConnection cn = null;
= new SqlCommand cm = null;
SqlConnection(connection try
String)) {
{ cn = new
using (SqlCommand SqlConnection(connection
cm = new String);
SqlCommand(commandS cm = new
tring, cn)) SqlCommand(commandS
{ tring, cn);
cn.Open(); cn.Open();
cm.ExecuteNonQuery(); cm.ExecuteNonQuery();
} }
} finally
{
if (null != cm);
cm.Dispose();
if (null != cn)
cn.Dispose();
}
Os dois trechos de código acima são equivalentes.
Command();
• Obter o retorno da consulta usando o método
Read();
Abaixo temos um exemplo bem básico do código
usando SqlDataReader:
using System.Data;
using System.Data.SqlClient;
// novo command
string sql = "SELECT * FROM Tabela";
SqlCommand adoCmd = new SqlCommand(sql,
adoConn);
if (adoDR.HasRows)
{
while (adoDR.Read())
{
Response.Write(adoDR["0"].ToString());
}
}
adoDR.Close();
adoDR.Dispose();
adoCmd.Dispose();
adoConn.Close();
adoConn.Dispose();
Observe as linhas em negrito onde temos:
1-) A criação de um objeto SqlCommand usando
uma instrução SQL e a conexão
SqlCommand adoCmd = new SqlCommand(sql,
adoConn);
2-) A criação de um objeto SqlDataReader e
utilização do método ExecuteReader() do objeto
SqlCommand;
SqlDataReader adoDR =
adoCmd.ExecuteReader();
3-) Utilização do método Read() para ler o
resultado
while (adoDR.Read())
Veja a seguir outra forma de obter o mesmo
resultado:
using System.Data.SqlClient;
System.Data.SqlDbType.NVarChar, // o tipo
de dado SqlDbType
40,
// o tamanho do parametro
"ProductName"));
// o nome da coluna na tabela a qual se
aplica
// Preenche o valor do parâmetro
com o texto informado
// na caixa de texto : txtcriterio
cmd.Parameters["@criterio"].Value =
txtcriterio.Text+"%";
// executa a consulta
sqldr = cmd.ExecuteReader();
lbDados.Items.Clear();
// preenche o listBox com os
valores retornados
// usa o método read() para
percorrer o datareader
while (sqldr.Read())
{
lbDados.Items.Add(sqldr["ProductName"].ToS
tring() + " - " + sqldr["UnitPrice"].ToString());
}
}
catch (Exception ex)
{
// exibe mensagem de erro
MessageBox.Show(ex.Message);
}
finally
{
// fecha o data reader e a
conexão
if (sqldr != null)
sqldr.Close();
if (con.State ==
ConnectionState.Open)
con.Close();
}
}
Note que estamos usando o parâmetro @criterio
para receber o valor informado na caixa de texto
na instrução de comando SQL :
SELECT ProductName,UnitPrice FROM
Products WHERE (ProductName LIKE
@criterio)";
Ao atribuir o valor ao parâmetros incluímos o
caractere % ao final do valor digitado:
cmd.Parameters["@criterio"].Value =
txtcriterio.Text+"%";
Após executar o comando via método
ExecuteReader() percorremos o DataReader com
o método Read() e obtemos os valores usando a
sintaxe: sqldr["ProductName"].ToString() + "
- " + sqldr["UnitPrice"].ToString()
O resultado para a letra C pode ser visto abaixo:
Usando uma Stored Procedure
Podemos também gerar um DataReader
executando uma stored procedure. Supondo que
você tenha uma stored procedure criada no banco
de dados com o nome listaClientes que obtêm os
clientes para um determinado id.
O código usado para definir o comando e passar o
parâmetro pode ser escrito assim:
1 SqlCommand storedProcCommand = new
SqlCommand ("listaClientes", con);
2 storedProcCommand.CommandType =
CommandType.StoredProcedure;
3
storedProcCommand.Parameters.Add("@ID",clien
teID);
4 SqlDataReader reader =
storedProcCommand.ExecuteReader();
5 while (reader.Read())
{//}
- Na primeira linha construímos o objeto
SqlCommand com o nome da stored procedure
usando a conexão com o banco de dados;
- Na linha 2 o objeto Sqlcommand define que
estará executando uma stored procedure;
- Na linha 3 incluímos o parâmetro no objeto
SqlCommand. Observe o uso do símbolo @ usado
para identificar um parâmetro no SQL Server.
- Na linha 4 usamos o método ExecuteReader()
para executar a stored procedure e retornar um
DataReader;
- Na linha 5 iniciamos a leitura do DataReader;
Lembrete:
Um DataReader é sempre mais rápido que um DataSet
???
A resposta é : DEPENDE...
A vantagem do DataReader e não ter que carregar todo o
conteúdo da tabela em memória, e retornar os registros à
medida que são disponibilizados pelo banco de dados;
enquanto que o DataSet aguarda o fim da execução da
consulta para prosseguir a execução.
// 3. preenche o dataset
daProdutos.Fill(dsProdutos, tabela);
}
catch(Exception ex)
{
//se houver erro exibe a mensagem
MessageBox.Show(ex.Message);
}
}
O resultado obtido pode ser visto na figura abaixo: