terça-feira, 16 de abril de 2024
Aprenda a Evitar Memory Leaks no .NET com Dispose e Blocos Using
Os memory leaks são como fantasmas assombrando os
desenvolvedores de software. Eles podem se esconder silenciosamente em nossos
códigos, consumindo recursos preciosos e prejudicando o desempenho do
aplicativo. No ambiente .NET, a gestão de memória é parcialmente automatizada
pelo coletor de lixo (garbage collector), mas mesmo assim, é responsabilidade
do desenvolvedor garantir a liberação adequada de recursos não gerenciados.
Felizmente, o .NET oferece algumas ferramentas poderosas para lidar com isso, como
o método Dispose() e os blocos using.
O Que São Memory Leaks?
Um memory leak ocorre quando um programa aloca memória
dinamicamente repetidamente, mas não libera essa memória quando não é mais
necessária. Isso pode acontecer por várias razões, mas é especialmente comum
quando trabalhamos com recursos não gerenciados, como arquivos, conexões de
banco de dados e objetos COM.
A Importância do Método Dispose()
O método Dispose() é uma parte fundamental do padrão
de design "Dispose pattern" no .NET. Ele é usado para liberar
explicitamente os recursos não gerenciados usados por um objeto. Ao implementar
a interface IDisposable e chamar o método Dispose(), os
desenvolvedores podem garantir que os recursos sejam liberados assim que não
forem mais necessários.
Usando Blocos Using para Garantir a Liberação de Recursos
Os blocos using no C# fornecem uma maneira
conveniente de garantir que os objetos que implementam IDisposable sejam
liberados corretamente, mesmo se ocorrerem exceções no código. Um bloco using
garante que o método Dispose() seja chamado automaticamente quando o
escopo do bloco é concluído.
Exemplo Prático
Vamos examinar um trecho de código e explorar como podemos
melhorá-lo para garantir uma gestão mais robusta de recursos no ambiente .NET.
No código acima, estamos lidando com uma operação de leitura
de dados de um banco SQLite e exibindo-os em um DataGridView. Pode ser
que vocês já estejas familiarizado com códificação
parecida. No entanto, há alguns problemas de gestão de recursos que precisamos
resolver:
1. Gestão de Conexão com o Banco de Dados
O objeto SQLiteConnection precisa ser aberto e
fechado corretamente para evitar vazamentos de recursos. Vamos usar um bloco using
para garantir que a conexão seja fechada automaticamente quando não for mais
necessária.
2. Limpeza de Recursos em Caso de Exceção
Se ocorrer uma exceção durante a execução do código dentro
do bloco using, precisamos garantir que os recursos sejam liberados
corretamente. Vamos mover a definição do objeto DataTable para dentro do
bloco using e usar o método Dispose() para liberar o leitor e o
comando em caso de exceção.
Conclusão
Lidar com memory leaks no .NET é crucial para manter a
estabilidade e o desempenho dos aplicativos. Utilizar corretamente o método Dispose()
e os blocos using é uma prática recomendada para garantir a liberação
adequada de recursos não gerenciados. Ao melhorar a gestão de recursos em nosso
código, garantimos que ele seja mais robusto, eficiente e menos propenso a
problemas como memory leaks. Utilizando blocos using para objetos que
implementam IDisposable, lidamos adequadamente com a liberação de
recursos. Ao seguir essas práticas, podemos criar aplicativos mais estáveis e
de alta qualidade no ambiente .NET. Adotar essas práticas desde o início do
desenvolvimento, os desenvolvedores podem evitar muitas dores de cabeça no
futuro e garantir uma experiência de usuário mais suave.
terça-feira, 3 de outubro de 2023
Como Alterar a Senha do Super Administrador (sa) via Prompt?
Problema:
Você se depara com uma situação em que precisa acessar o super administrador 'sa' em seu servidor SQL Server, mas não se lembra da senha. Isso pode acontecer devido a vários motivos, como esquecimento da senha ou herança de um sistema existente, onde a senha 'sa' não é conhecida. Sem acesso à conta 'sa', você não pode executar tarefas essenciais de administração de banco de dados.
Causa:
A causa raiz desse problema geralmente é o esquecimento da senha do usuário 'sa'. A conta 'sa' é altamente privilegiada e é recomendado que sua senha seja protegida com segurança. Portanto, quando essa senha é perdida ou esquecida, é necessário encontrar uma maneira de redefini-la.Solução Passo a Passo:
Aqui estão os passos para resolver esse problema e alterar a senha do super administrador 'sa' usando o prompt de comando:
Passo 1: Abra o Prompt de Comando como Administrador:
Para começar, clique com o botão direito do mouse no ícone do Prompt de Comando e selecione "Executar como administrador". Certifique-se de ter privilégios administrativos no servidor SQL.
Passo 2: Navegue até a Pasta do SQL Server:
Use o comando `cd` para navegar até o diretório onde o utilitário `sqlcmd` está localizado. Normalmente, o caminho padrão é `C:\Program Files\Microsoft SQL Server\<Versão>\Tools\Binn`. Certifique-se de substituir `<Versão>` pela versão específica do SQL Server instalada no seu sistema.
Passo 3: Execute o Comando SQL para Alterar a Senha:
Digite o seguinte comando e pressione Enter para abrir o utilitário `sqlcmd`, conectando-se ao SQL Server usando a autenticação do Windows:
sqlcmd -S localhost -E
Agora, você deve estar conectado ao SQL Server.
Passo 4: Redefina a Senha do 'sa':
Use o seguinte comando SQL para alterar a senha do super administrador 'sa'. Substitua `<nova_senha>` pela senha desejada:
ALTER LOGIN sa WITH PASSWORD = '<nova_senha>';
GO
Após executar este comando, você verá uma mensagem indicando que a senha foi alterada com sucesso.
Passo 5: Feche o Utilitário SQL e o Prompt de Comando:
Digite QUIT no utilitário sqlcmd para sair dele. Em seguida, feche o Prompt de Comando.
Ao seguir este guia passo a passo, você pode resolver com sucesso o problema de alteração da senha do super administrador 'sa' via prompt de comando. Lembre-se de que o usuário 'sa' possui privilégios significativos, portanto, mantenha a nova senha segura e siga as melhores práticas de segurança para proteger seu servidor SQL contra ameaças.
Agora, com acesso restabelecido ao super administrador 'sa', você pode continuar a administrar e manter seu servidor SQL Server com confiança. Espera ter ajudado, se você tiver alguma dúvida ou precisar de assistência adicional, não hesite em entrar em contato.
sexta-feira, 30 de junho de 2023
Entendendo o Conceito de Multithreading e seus Desafios
O conceito de multithreading é fundamental para compreender como os processos são executados em um sistema operacional. Neste artigo, vamos explorar o significado de "thread" e "multithreading", discutir sua relevância para os programadores e abordar os benefícios e desafios associados a esse conceito.
O que são threads:
Uma thread, também conhecida como fio ou linha, é um componente de um processo capaz de executar determinadas tarefas. Pode ser considerada como um subsistema ou um subconjunto do processo. Esse conceito pode ser comparado aos famosos "textões" do Twitter, nos quais um conteúdo extenso é dividido em partes menores para facilitar a leitura e compreensão.
Contextualizando os microprocessadores:
No contexto dos microprocessadores, o termo "thread" refere-se à capacidade de encadeamento de instruções que podem ser executadas simultaneamente. Esse conceito é complexo, mas ao longo deste artigo, procuraremos torná-lo mais compreensível para os programadores.
A importância do multithreading para os programadores:
O multithreading desempenha um papel crucial na programação, e é essencial que os desenvolvedores compreendam seus fundamentos. Neste artigo, abordaremos por que os programadores precisam conhecer o multithreading e como ele pode melhorar a eficiência e a capacidade de resposta de seus programas.
Benefícios do multithreading:
O uso de threads oferece vantagens significativas, como uma maior capacidade de resposta, compartilhamento e utilização eficiente de recursos, além de economia de tempo no desenvolvimento e gerenciamento de programas. Exploraremos cada um desses benefícios em detalhes.
Desafios e problemas do multithreading:
No entanto, o multithreading também apresenta desafios. Um dos principais problemas é o cancelamento prematuro de uma thread, o que pode interferir no funcionamento correto de outras threads. Além disso, o compartilhamento de recursos entre threads pode levar a problemas de concorrência e sincronização. Discutiremos esses desafios e como os programadores podem lidar com eles.
Concorrência versus paralelismo:
É importante distinguir entre os conceitos de concorrência e paralelismo. A concorrência envolve lidar com várias tarefas ao mesmo tempo, enquanto o paralelismo refere-se à execução simultânea de várias tarefas. Explicaremos a diferença entre esses dois conceitos e como eles se relacionam com o multithreading.
Considerações finais:
Neste artigo, exploramos o conceito de multithreading, seu significado e importância para os programadores. Discutimos os benefícios e desafios associados a esse conceito, enfatizando a necessidade de compreender a concorrência, o compartilhamento de recursos e a sincronização entre threads. Ao dominar o multithreading, os programadores podem otimizar a eficiência de seus programas e melhorar a experiência do usuário.
Lembre-se de que o multithreading é uma área complexa, mas espero que essa postagem tenha proporcionado uma compreensão básica e um ponto de partida.
.
quarta-feira, 18 de maio de 2022
Como obter a PublicKeyToken de uma biblioteca ou assembly?
Olá pessoal, hoje quero te ajudar a encontrar a PublicKeyToken ou Token de Chave Pública de um aplicativo, assembly ou dll através da linha de comando do power shall.O que é PublicKeyToken?
Vamos a prática
([system.reflection.assembly]::loadfile("C:\projects\demo20\Intelligencia.UrlRewriter.dll")).FullNameIntelligencia.UrlRewriter, Version=2.0.0.9, Culture=neutral, PublicKeyToken=0573f3650687980d
Bonús - Como obter a PublicKeyToken via código C#?
segunda-feira, 5 de agosto de 2019
Entenda o DOM de uma vez por todas - 1 Introdução
Olá, este poste é o inicio de uma série de postes com um único objecto: "Te ajudar de uma vez por todas à entender o DOM usando javascript". Então bem-vindo a primeira parte:
Introdução ao DOM
Quase sempre que um site realiza uma ação, como alternar entre uma apresentação de slides de imagens, exibir um erro quando um usuário tenta enviar um formulário incompleto ou alternar um menu de navegação, ele é o resultado do JavaScript acessando e manipulando o DOM. Neste artigo, aprenderemos o que é o DOM, como trabalhar com o documentobjeto e a diferença entre o código-fonte HTML e o DOM.
O que eu preciso?
Para entender efetivamente o DOM e como ele se relaciona com o trabalho com a Web, é necessário ter um conhecimento existente de HTML e CSS . Também é benéfico ter familiaridade com a sintaxe e a estrutura de código fundamentais do JavaScript.O que é o DOM?
No nível mais básico, um site consiste em um documento HTML. O navegador que você usa para visualizar o site é um programa que interpreta HTML e CSS e renderiza o estilo, conteúdo e estrutura na página que você vê.Além de analisar o estilo e a estrutura do HTML e do CSS, o navegador cria uma representação do documento conhecido como Document Object Model. Este modelo permite que o JavaScript acesse o conteúdo de texto e os elementos do documento do site como objetos.
JavaScript é uma linguagem interativa e é mais fácil entender novos conceitos fazendo. Vamos criar um site muito básico. Crie um index.htmlarquivo e salve-o em um novo diretório de projeto.
Para nossos objetivos, usaremos o navegador Google Chrome, mas você poderá receber resultados semelhantes de outros navegadores modernos. No Chrome, abra-se index.html. Você verá um site simples com nosso título dizendo "Document Object Model (DOM)". Clique com o botão direito em qualquer lugar da página e selecione "Inspecionar". Isso abrirá as Ferramentas do desenvolvedor.
Na guia Elements , você verá o DOM.
Nesse caso, quando expandido, parece exatamente o mesmo que o código-fonte HTML que acabamos de escrever - um tipo de documento e as poucas outras tags HTML que adicionamos. Passar o mouse sobre cada elemento destacará o respectivo elemento no site renderizado. Pequenas setas à esquerda dos elementos HTML permitem alternar a exibição de elementos aninhados.
O document object
O document oject é um objeto interno que possui muitas propriedades e métodos que podemos usar para acessar e modificar sites. Para entender como trabalhar com o DOM, você deve entender como os objetos funcionam em JavaScript.Em Developer Tools no index.html , vá para a guia Console . Digite
document no console e pressione ENTER. Você verá que o resultado é o mesmo que você vê na guia Elements.
Digitar document e trabalhar diretamente no console não é algo que você geralmente fará fora da depuração, mas ajuda a solidificar exatamente o que o document object é e como modificá-lo, como descobriremos a seguir.
Qual é a diferença entre o código-fonte DOM e HTML?
Atualmente, com este exemplo, parece que o código-fonte HTML e o DOM são exatamente a mesma coisa. Existem duas instâncias em que o DOM gerado pelo navegador será diferente do código-fonte HTML:- O DOM é modificado pelo JavaScript do lado do cliente
- O navegador corrige automaticamente erros no código-fonte
O console responderá com esta saída:
Document é um objeto, body é uma propriedade desse objeto que acessamos com notação de ponto. O envio document.body para o console gera o elemento body e tudo dentro dele.No console, podemos alterar algumas das propriedades ativas do objeto body neste site. Vamos editar o atributo style, mudando a cor de fundo para blue. Digite isso no console:
Depois de digitar e enviar o código acima, você verá a atualização ao vivo para o site, conforme a cor do plano de fundo é alterada.
Alternando para a guia Elements ou digitando document.body no console novamente, você verá que o DOM foi alterado.
backgroundColor. Qualquer propriedade CSS hifenizada será escrita em camelCase em JavaScript
O código JavaScript que digitamos, atribuindo à cor azul como fundo do body, é agora uma parte do DOM.
No entanto, clique com o botão direito do mouse na página e selecione "Ver fonte da página". Você notará que a fonte do site não contém o novo atributo de estilo que adicionamos via JavaScript. O código-fonte ou de origem de um site não será alterada e nunca será afetada pelo JavaScript do lado do cliente. Se você atualizar a página, o novo código que adicionamos no console desaparecerá.
A outra instância em que o DOM pode ter uma saída diferente do código-fonte HTML é quando há erros no código-fonte. Um exemplo comum disso é a tag table – uma tag tbody é necessária dentro de um table, mas os desenvolvedores geralmente não a incluem em seu HTML. O navegador corrigirá automaticamente o erro e adicionará o tbody, modificando o DOM. O DOM também corrigirá tags que não foram fechadas.
O que aprendemos?
Nesta parte, definimos o DOM, acessamos o objeto document, usamos JavaScript e o console para atualizar uma propriedade do objeto document e examinamos a diferença entre o código-fonte HTML e o DOM.No próximo artigo, revisaremos a terminologia HTML importante, aprenderemos sobre a árvore DOM, descobriremos o que são nós, aprenderemos sobre os tipos mais comuns de nós e começaremos a criar scripts interativos com JavaScript.
Fique atento ao proximo artigo desta série!
Forte abraço.
terça-feira, 2 de julho de 2019
Como ignorar a acentuação ao consultar dados no Sql Server?
Vou ser rápido. Mas esse problema ocorre porque a muitas vezes a colecção do Sql Server definida é a Accent Sensitive (AS), por isso ele procurará a expressão exacta, incluindo as acentos.Solução
SELECT * FROM Produto WHERE Nome like '%pao%' COLLATE Latin1_general_CI_AI
Na consulta acima a expressão Latin1_general_CI_AIpode ser dividido nas seguintes partes:
- Latin1 - faz o servidor tratar strings usando charset latin 1, ou seja, o ascii.
- CI - especifica maiúsculas e minúsculas, portanto, "ABC" é igual a "abc".
- AI - especifica insensível à acentuação, então "ãó" é igual a "ao".
quinta-feira, 30 de maio de 2019
Como humanizar o formato dos DateTime em C#
O Algoritmo
Como usar?
quinta-feira, 25 de abril de 2019
Como gerar sequências numéricas em SQL numa consulta ou select?
Sem muitas voltas, te digo: Use a função Row_Number() do Sql Server.Confira no exemplo a seguir.
Select Row_Number() Over(Order By idAluno) as Ordem, idAluno, NomeAluno
From Aluno
Where idTurma = 2
Resultado:
Isso é tudo, apenas olhe para essa instrução como um modelo para o que realmente desejas, ou comente o para eu te ajudar.
quinta-feira, 11 de abril de 2019
Porque Sql Server está consumindo muita memória? [Resolvido]
Porque o Sql Server está consumindo muita memória?
A Solução é limitar a memória máxima do Sql Server.
- Clique com o botão direito no servidor conectado;
- Em seguida, clique em Properties (Propriedades);
- Selecione a aba Memory (Memória);
- Edite o campo Maximum Server Memory (Memória máxima do servidor). No nosso exemplo, queremos que o Sql Server consuma apenas 6GB;
- Clique em Ok para confirmar as alteração.
Bonus: Como limitar a memória do SqlServer via código?
Alguma dúvida? Deixe nos cometário. Espero ter ajudado.
segunda-feira, 28 de janeiro de 2019
Como colocar mensagem no DataList quanto está Vazio (Empty) no asp.net?
Como colocar a mensagem no DataList quanto está Vazio ou Empty conforme se faz no GridView do Asp.net?
O GridView possui a propriedade EmptyDataText que serva para colocar a mensagem de erro ou "not find" mas infelizmente o DataList e o ListView não têm esse propriedade. Para resolver este problema siga a solução abaixo:
<asp:DataList ID="dlFunc" runat="server" RepeatColumns="4">
<ItemStyle CssClass="CardSeparation" />
<ItemTemplate>
<%-- area para campos --%>
</ItemTemplate>
<FooterTemplate>
<asp:Label Visible='<%#bool.Parse((dlFunc.Items.Count==0).ToString())%>'
runat="server" ID="lblNoRecord" Text="Documento não encontrado!"></asp:Label>
</FooterTemplate>
</asp:DataList>
Isso está criando uma lable no rodapé de DataList e torná-lo visível somente se a contagem de registro DataList é 0.
<asp:Label Visible='<%#bool.Parse((dlFunc.Items.Count==0).ToString())%>'
runat="server" ID="lblNoRecord" Text="Documento não encontrado!">
Espero ter te ajudado. Um forte abraço!
segunda-feira, 21 de janeiro de 2019
Entity Framework - Como listar tabela dinamicamente através do seu nome?
public IQueryable GetMyTable(string tipo)
{
MyDbContext context = new MyDbContext();
Type type = Type.GetType($"teu_namespace.{tipo}");
if (type != null)
return context.Set(type).AsQueryable();
return null;
}
O segredo todo está no método Set. Muitas pessoas que encontram esse problema usaram esse método de maneira errada, colocando o Set<Type>. Isso sempre gerá o erro: "is a type but used as a class".
Para evitar esse problema use o Set(string) é a melhor forma para dinamizar o teu código.
sexta-feira, 21 de setembro de 2018
Por que você pode querer usar CGI com C#?
O que é o CGI?
O Common Gateway Interface, ou CGI, é um padrão W3C de longa data para comunicação entre uma página da web e um aplicativo disponível no servidor web. Os aplicativos no servidor que se comunicam no CGI têm todas as funcionalidades de qualquer outro aplicativo nativo, como acesso ao banco de dados ou leitura de arquivos de entrada. No entanto, no mundo atual, com ASP.NET, PHP, Perl e muitas outras linguagens de script que fornecem essencialmente a mesma funcionalidade, você pode se perguntar por que se incomodaria em criar seu próprio aplicativo CGI com C #. Existem algumas razões que posso pensar que podem ser aplicadas.Motivo 1
Primeiro, os interpretadores para ASP, PHP, Perl, etc. são essencialmente aplicativos aproveitando o CGI. Em muitos casos, eles são criados diretamente no serviço da Web (como com ISAPI para IIS), mas todos eles também estão disponíveis em suas aparências CGI (ASP disponível como CGI por meio do projeto Mono da Novel). Para entender melhor os recursos e a limitação da sua linguagem de script favorita do servidor, você pode estar interessado em saber como ela funciona em um nível inferior.Motivo 2
Outra razão é que você pode escrever seu próprio intérprete de mini-scripts. Linguagens como ASP são de propósito geral e, embora possam fazer qualquer coisa, algumas coisas poderiam ser melhor realizadas com um script de propósito mais específico.Por exemplo, isso descreve a razão pela qual eu investiguei pela primeira vez o reino de CGI e C#. Minha empresa tem uma demanda muito alta por relatórios. Apesar de uma ampla gama de ferramentas disponíveis para os funcionários, o site continua sendo o principal recurso para seus relatórios personalizados devido a muitas viagens. Todos os relatórios têm uma variedade de requisitos gráficos muito exigentes, desde formatação, até gráficos, até o fornecimento de uma pasta de trabalho do Excel gerada dinamicamente. O código ASP estava começando a parecer assustador, então criamos um aplicativo C# personalizado para interpretar uma linguagem de relatório tão específica às necessidades de nossos negócios que até mesmo usuários avançados não programadores podem ajudar na criação e modificação das necessidades de relatórios. (Um tópico para outro artigo? diz que sim no comentário.)
Motivo 3
Outro benefício para CGI é que ele é agnóstico do servidor web. O mesmo executável funcionará para o IIS como para o Apache, como para qualquer outro servidor da Web compatível com o W3C. E, ao contrário de algumas linguagens de script, o executável é compilado para que a execução seja rápida e a origem não esteja visível.C# é uma excelente linguagem para usar com CGI por causa do poder do .NET framework. Também é possível testar um aplicativo C# utilizando CGI, mesmo sem um servidor da Web, porque ele simplesmente é executado como um aplicativo de console. Mais sobre isso depois.
Motivo 4
Finalmente, existem provedores de serviços da Web que permitem usar aplicativos CGI personalizados que podem não permitir o uso de módulos Apache ou ISAPI IIS DLLs. O motivo é que um módulo integrado em um servidor da Web pode causar muito mais danos ao servidor da Web do que um executável separado e controlável.Gostou? Comenta o que mais te interessou!
terça-feira, 4 de setembro de 2018
Como ignorar letras acentuadas na comparação de string no C# e SQL?
Ignorar acentos no C#
Para ignorar acentos, maiúsculas e minúsculas, você pode primeiro definir um método de extensão como este:public static string RemoveAcentos(this String s)
{
String normalizedString = s.Normalize(NormalizationForm.FormD);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < normalizedString.Length; i++)
{
Char c = normalizedString[i];
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
stringBuilder.Append(c);
}
return stringBuilder.ToString().ToLower();
}
Exemplo 1
string valor = "pãO 10 Grãos".RemoveAcentos();if (valor == "Pão 10 Grãos".RemoveAcentos())
{
// instruções
Console.WriteLine("Iguais");
}
else
{
// instruções Console.WriteLine("Diferentes");
}
Exemplo 2
string queryText = filter.ToUpper().RemoveDiacritics();var result = from p in Produtos
where p.Nome.ToUpper().RemoveAcentos() == queryText
select p;
Ignorar acentos no SQL
O nosso método, no exemplo 2, é bom se estamos apenas iterando sobre uma colecção no C#, mas se você estiver usando LINQ para SQL é preferível evitar métodos não padrão (incluindo métodos de extensão) em sua consulta LINQ. Isso ocorre porque seu código não pode ser convertido em SQL válido e, portanto, executado no SQL Server com toda a optimização de desempenho.Como não parece haver uma maneira padrão de ignorar os acentos no LINQ para SQL, nesse caso, sugiro alterar o tipo de campo que você deseja pesquisar para não diferenciar maiúsculas e minúsculas (CI_AI):
ALTER TABLE Produtos ALTER COLUMN Nome [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI
Sua consulta deve agora ignorar a acentuação e o caso.
É importante que você deve remover temporariamente quaisquer restrições exclusivas no campo antes de executar a consulta acima usando, por exemplo, a seguinte instrução:
ALTER TABLE People DROP CONSTRAINT UQ_Produtos_Nome
Agora a nossa consulta LINQ será simplificada:
var result = from p in Produtos
where p.Nome == filter
select p;
Espero ter ajudado.
sexta-feira, 31 de agosto de 2018
Como exportar Crystal Report para PDF e Excel (código completo)
Vamos aprender, de forma rápida, como exportar um relatório de Crystal Report para os formatos PDF e Excel. Como exemplo vou pegar o projecto que fizemos no post anterior. Clica aqui para ver.Adicione os botões "Exportar PDF" e "Exportar Excel" no formulário para exportar o relatório.
Para o botão "Exportar PDF" coloque o seguinte código:
Para o botão "Exportar Excel" coloque o seguinte código:
Código completo deste projecto.
public partial class FormPaises : Form
{
public FormPaises()
{
InitializeComponent();
}
Reports.ReportPaises2 cr = new Reports.ReportPaises2();
private List<Pais> GetListaPaises()
{
List<Pais> Paises = new List<Pais>
{
new Pais(1, "Angola"),
new Pais(2, "Brasil"),
new Pais(3, "Portugal"),
new Pais(6, "Moçambique"),
new Pais(7, "Cabo-Verde"),
new Pais(8, "Namibia")
};
return Paises;
}
private void FormPaises_Load(object sender, EventArgs e)
{
crystalReportViewer1.ReportSource = cr;
cr.SetDataSource(GetListaPaises());
}
private void btnExportToPDF_Click(object sender, EventArgs e)
{
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "Arquivo PDF|*.pdf";
string nomeArquivo="";
if(dialog.ShowDialog()== DialogResult.OK)
{
nomeArquivo = dialog.FileName;
cr.ExportToDisk(ExportFormatType.PortableDocFormat, nomeArquivo);
}
}
private void btnExportToExcel_Click(object sender, EventArgs e)
{
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "Arquivo Excel|*.xls";
string nomeArquivo = "";
if (dialog.ShowDialog() == DialogResult.OK)
{
nomeArquivo = dialog.FileName;
cr.ExportToDisk(ExportFormatType.Excel, nomeArquivo);
}
}
}
Como criar um relatório CrystalReport sem banco de dados
A um tempo tive problemas com as conexões do crystal report. Quando passava a aplicação para outros computadores tinha que trocar também a conexão, porem muitas vezes esquecia de fazer esse processo e ficava horas e horas para descobrir onde estava o problema. Por isso optei por usar os crystal report sem conexão directa a base de dados.
O que vamos ver é pequeno exemplo de como criar um relatório de Lista de Países com o Crystal Reports a partir de uma lista de objectos sem ter uma banco de dados.
Passo 1
Certifique-se de ter Crystal Report para o Visual Studio instalado.Passo 2
Cria um novo projecto WinForm. Neste exemplo criei um projecto com nome TesteCrystalSemDB. A seguir, cria uma classe País como o seguinte:public class Pais
{
public Pais(int codigo,string nome)
{
this.Codigo = codigo;
this.NomePais = nome;
}
public int Codigo { get; set; }
public string NomePais { get; set; }
}
Passo 3
Adicione um novo formulário com o nome FormPaises, e adicione o seguinte método:
private List<Pais> GetListaPaises()
{
List<Pais> Paises = new List<Pais>
{
new Pais(1, "Angola"),
new Pais(2, "Brasil"),
new Pais(3, "Portugal"),
new Pais(6, "Moçambique"),
new Pais(7, "Cabo-Verde"),
new Pais(8, "Namibia")
};
return Paises;
}
Passo 4
Adicione um DataSet. Nomeia-o por DataSet1 como na figura abaixo:Dentro da DataSet adicione uma DataTable com o nome de Pais, e cria as colunas com os mesmos nome dos atributos da classe Pais. ( Esse é o maior segredo ;). Confirma na figura acima.
Passo 5
Adicione ao projecto um Crystal Report e nomeio-o por ReportPaises2, clique em Add.
Aparecerá uma caixa como a que se segui, as opeções criar um nome documento de crystal report, escolha a segunda, Relatório em Branco e clica OK.
Passo 6

No assistente, expande Dados de Projecto > Conjuntos de Dados ADO.NET > TesteCrystalSemDB.DataSet1e seleccione a DataTable Pais.
Passo 7
Volte para o formulário FormPaises, vai à ToolBox, escolha o CrystalReportViewer, coloque-o ao formulário e nomeia-o por crystalReportViewer1.
Selecione este novo componente e (1) no seu canto superior direito dê um clique para ver a lista de propriedades, (2) clique em "Escolher um Crystal Report, (3) Selecione o relatorio que criamos "ReportPaises2", (4) clique em OK.
private void FormPaises_Load(object sender, EventArgs e)
{
Reports.ReportPaises2 cr = new Reports.ReportPaises2();
crystalReportViewer1.ReportSource = cr;
cr.SetDataSource(GetListaPaises());
}
Pronto, o relatório está feito, basta pressionar F5 para testar.
Bonus
A propriedade SetDataSource do CrystalReport pode receber qualquer colecção de dados. Por isso aproveita essa propriedade colocar a tua fonte da dados. Como eu disse no inicio deste post, não acho viável os dados serem dependentes da conexão do Crystal Report.sexta-feira, 27 de julho de 2018
Como definir a resolução do monitor com o C#
Tive dificuldade em definir uma resolução de tela dinâmica quando estava fazendo um aplicativo. Eu presumo que a maioria de nós tenha acontecido conosco ou tenha enfrentado esses tempos em algum lugar ao longo de nosso ciclo de vida de engenharia. Porque, como todos sabemos, a resolução da tela do usuário pode não ser a mesma da tela do ambiente de desenvolvimento.Neste post vou entregar o que eu encontrei como uma solução para o desafio discutido.
Então vamos ver:
- Como obter a resolução do monitor do usuário.
- Como alterar a resolução do monitor do usuário para produto compatível
- Como proteger a resolução do monitor do usuário.
Como obter a resolução do monitor do usuário
O acesso à tela do usuário está sendo facilitado pela classe Screen, que é fornecida junto com a estrutura .NET. E pode acessar a resolução da tela do usuário atual por meio de uma propriedade Screen.PrimaryScreen que é estática disponível na classe Screen:
public static Screen PrimaryScreen {get;}
A propriedade acima mencionada é somente leitura e retorna um tipo Screen. E a lógica abaixo mostra como usar o tipo Screen para acessar a resolução da tela do usuário:
Screen screen = Screen.PrimaryScreen;
int S_width=screen.Bounds.Width;
int S_height=screen.Bounds.Height;
Como alterar a resolução do monitor do usuário para produto compatível
Antes de seguir em direção ao nosso próximo objetivo, deixe-me falar sobre a parte não gerenciada dessa implementação. Ao contrário das linguagens tradicionais, a estrutura .NET mantém uma etapa distinta enquanto aproveita o código gerenciado e não gerenciado. Pessoalmente, quando escrevi este artigo, nunca encontrei nenhum código gerenciado que faça esse tratamento de resolução. E isso é o que me fez pensar em explorar algumas APIs do Win32.
Como o escopo deste artigo está limitado ao código gerenciado, não discutirei nada sobre código não gerenciado. Mas, apesar disso, podemos usar o atributo DllImport para ler a definição de código não gerenciado em seu ambiente gerenciado. Neste caso, estaremos usando a API User32.dll, que facilita a resolução dinâmica e possui duas funções relacionadas à alteração da resolução da tela.
- EnumDisplaySettings
- ChangeDisplaySettings
class User32
{
[DllImport("user32.dll")]
public static extern int EnumDisplaySettings (string deviceName, int modeNum, ref DEVMODE devMode );
[DllImport("user32.dll")]
public static extern int ChangeDisplaySettings(
ref DEVMODE devMode, int flags);
public const int ENUM_CURRENT_SETTINGS = -1;
public const int CDS_UPDATEREGISTRY = 0x01;
public const int CDS_TEST = 0x02;
public const int DISP_CHANGE_SUCCESSFUL = 0;
public const int DISP_CHANGE_RESTART = 1;
public const int DISP_CHANGE_FAILED = -1;
}
Como sabemos, o [DllImport("user32.dll")] é um trabalho explícito antes de injetar uma implementação não gerenciada em nosso ambiente gerenciado.
public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE devMode);
DEVMODE é uma estrutura explicada na documentação da plataforma, bem como incluída no Visual Studio .NET. A estrutura é definida em C#, por isso não se preocupar!
[StructLayout(LayoutKind.Sequential)]
public struct DEVMODE
{
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
...
}
Você pode dar uma olhada no código-fonte clicando aqui e aplicar essa lógica a qualquer evento desejado.
Esteja ciente de que, os tipos têm o tamanho certo e que as seqüências de comprimento fixo são apropriadamente definida. Neste caso, WORD mapeia para short, DWORD para int e short permanece como short.
DEVMODE dm = new DEVMODE();
dm.dmDeviceName = new String(new char[32]);
dm.dmFormName = new String(new char[32]);
dm.dmSize = (short)Marshal.SizeOf (dm);
if (0 !=User32.EnumDisplaySettings(null,User32.ENUM_CURRENT_SETTINGS,ref dm))
{
Neste ponto, a estrutura DEVMODE será decorado com as configurações padrão e pode modificá-la em qualquer instância.
dm.dmPelsWidth = iWidth;
dm.dmPelsHeight = iHeight;
int iRet = User32.ChangeDisplaySettings(ref dm, User32.CDS_UPDATEREGISTRY);
O bloco de código fechado faz isso um pouco diferente de lidar com várias condições de erro. Gostaria de incentivá-lo a olhar para o arquivo fonte completo e ver o que ele faz. Isso é tudo que existe para isso.















