NOLOCK = READ UNCOMMITED = Leitura Suja

Trabalhando em alguns sistemas, nos foi recomendado, pelo próprio cliente, que fizéssemos uso do operador NOLOCK em todos os comandos de consulta que fizéssemos no banco de dados. Isso parece uma atitude exagerada, mas por experiência do cliente, com receio de deadlocks, tínhamos de seguir à risca essa indicação.

You no lock?

O SQL Server utiliza recursos de bloqueio (tanto para escrita quanto leitura) para garantir a integridade dos dados. Enquanto executamos uma transação seguimos o conceito ACID (se você não conhece este conceito, veja este post Entity Framework 6 – Database.BeginTransaction() e Database.UseTransaction(DbTransaction)). Por conta disso, dentro de uma transação qualquer comando paralelo que tente acessar os dados com os quais estamos trabalhando entram nesse bloqueio, e assim são forçados a aguardar o término de nossa transação.

Saiba mais

About these ads

Utilizando PowerShell para o acesso a bases de dados SQL

O Windows PowerShell é um prompt de comando muito poderoso. Com ele podemos criar scripts para automatização de tarefas, consumir componentes Microsoft .Net, objetos COM e outras APIs de aplicações Microsoft (como por exemplo Sharepoint, Exchange, Active Diretory, etc).

Devido ao seu uso bastante genérico, sempre surgem diferentes situações para o seu emprego. Gostaria de demonstrar nesse post como é feita a leitura e inclusão de dados em bases de dados SQL via Windows PowerShell.

Saiba mais

Transações

Transações são necessárias quando realizamos um conjunto de operações em um determinado recursos distribuído (banco de dados, serviço  de mensageria, serviço de gerenciamento de arquivos, etc) e queremos garantir a completude deste conjunto de operações ao seu término, evitando que qualquer possível erro durante a execução do conjunto de operações deixe os recursos distribuídos inconsistentes.

cjta_wstran1

Saiba mais

SQL Azure – Consultando dados

O SQL Azure é um conjunto de serviços que oferece capacidade de processamento e armazenamento de dados relacionais na nuvem. É a ferramenta que devemos utilizar para armazenarmos dados relacionais de nossa aplicação na plataforma Windows Azure.

No post anterior (http://ferhenriquef.com/2012/04/25/como-criar-um-banco-de-dados-no-sql-azure/) discutimos sobre como criar uma base de dados no SQL Azure, neste post vou demonstrar como acessar o SQL Azure.

Para acessar o SQL Azure não precisamos de nenhum SDK ou configuração especial, apenas precisamos modificar nossa connection string, definindo como server o nome do nosso servidor no Azure. Saiba mais

Como criar um Banco de Dados no SQL Azure

O SQL Azure representa um conjunto de serviços que fornecem a capacidade de processamento e armazenamento de dados relacionais no Windows Azure. O SQL Azure nos permite fazer uso dos mesmos recursos que estamos acostumados no SQL (persistência de dados, BI, relatórios, replicação e outros).

Neste post irei descrever como criar seu banco de dados no Windows Azure, nos próximos posts vou demonstrar como devemos fazer para consumir os dados deste banco de dados utilizando os recursos nativos do .Net Framework.

Vamos então a criação do banco de dados!

1 – Faça logon em sua conta do Windows Azure
2 – Vá até o painel de gerenciamento do Windows Azure e clique no ícone “Novo Servidor de Banco de Dados”

Capture02

Saiba mais

Windows Phone Mango e Microsoft SQL CE

Para armazenar e recuperar dados em um banco de dados local as aplicações Windows Phone utilizam LINQ to SQL. O LINQ to SQL é um recurso nativo do Framework 3.0 e foi um dos recursos que mais chamaram atenção no lançamento do Microsoft Visual Studio 2008. O LINQ to SQL, como já dito em outros posts, fornece mapeamento objeto-relacional entre a aplicação e bancos de dados relacionais, além disso é um recurso extremamente poderoso, que permite a construção de consultas utilizando sintaxe C# e VB.Net.

O Windows Phone Mango utiliza como base de dados o Microsoft SQL CE, versão compacta do famoso banco de dados Microsoft SQL, e própria para dispositivos móveis.

Aqui vamos apresentar o exemplo de uma aplicação que armazena e remove dados do banco de dados Microsoft SQL CE, utilizando como plataforma o Windows Phone Mango.

1o – Crie a aplicação utilizando o template Windows Phone Application.

2o – Ao ser perguntado sobre a versão da plataforma Windows Phone, selecione a opção Windows Phone OS 7.1.

3o – Dentro do projeto crie três pastas, sendo elas: DAO, Controller e Model.
windowsPhone01

4o – Faça referência a DLL System.Data.Linq.
windowsPhone02

5o – Dentro da pasta Model, criada anteriormente, crie a classe DataItem conforme a imagem a seguir.
windowsPhone03

6o – Adicione os atributos de mapeamento objeto-relacional LINQ para criar o mapeamento entre a classe e a tabela do banco de dados do Microsoft SQL CE. Faça referência ao namespace System.Data.Linq.Mapping.
windowsPhone04

7o – Dentro da pasta DAO crie uma classe chamada DataBaseContext, e a faça herda DataContext, classe presente no namespace System.Data.Linq. Esta classe será nosso data context e será responsável por fazer a ponte entre a aplicação e o banco de dados. Dentro da classe crie um atributo público chamado DataItems e que seja do tipo Table<DataItem>, este atributo representará nossa tabela no banco de dados. A classe DataBaseContext deverá se parecer com a seguinte implementação:
windowsPhone05

8o – Agora que temos nossa entidade e nosso data context, devemos criar uma classe que encapsule os comando com o banco de dados, por isso criaremos dentro da pasta DAO a classe DAOProvider. Esta classe representará nossa camada de acesso a dados e encapsulará os comandos feitos para o banco de dados. Nesta classe implementaremos quatro métodos, sendo eles: CreateDataBase, método que criará a base de dados; GetDataItems, método que retornará todos os dados que estiverem no banco de dados; Save, salva novos registros na base de dados; Remove, remove os dados do banco de dados. A implementação funcionará da seguinte forma:
windowsPhone06

9o - Para intermediar as chamadas entre a camada de visão e o repositório criaremos uma classe de controle que faça chamadas ao repositório. A vantagem de utilizar este tipo de classe é a possibilidade de encapsultar o repositório e poder adicionar filtros que intermediem o acesso aos dados do banco de dados. Esta classe deverá ser implementada como demonstrado a seguir:
windowsPhone07

10o – Finalmente vamos construir a interface do nosso aplicativo. Esta será uma interface bastante simples, deverão ser adicionados os seguintes itens: um textbox, um listbox e um botão (mais detalhes do layout poderão ser vistos no link para o download do exemplo, pois o layout do projeto não é o objetivo deste post).
windowsPhone08

11o – O único detalhe importante do layout é o modo como será feito o bind do listbox, pois na verdade ele será populado "na mão", isto é, os itens serão adicionados um-a-um (em um próximo post veremos como fazer isso de modo automático). Segue detalhe do XAML descrevendo o bind do listbox.
windowsPhone09

12o – A lógica da camada de visão deverá funcionar como o código apresentado a seguir. Como pode ser observado no código, ao clicar no botão Salvar um novo registro será incluso na base de dados, e ao clicar sobre qualquer item do listbox, o mesmo será removido do banco de dados.
windowsPhone10

Esta é uma introdução ao acesso a dados utilizando o Windows Phone e o Microsoft SQL CE. Espero que este post sirva como introdução para todos, e também espero que motive a construção de novos aplicativos para esta nova plataforma.

Para o download do exemplo acesse esse link: http://code.msdn.microsoft.com/Windows-Phone-Mango-e-SQL-81f15d55

[]s!

windowsPhone11

Microsoft – e-books grátis (free e-books)

A Microsoft disponibilizou vários livros, em versão digital, de forma gratuíta.
Resolvi compartilhar alguns links através deste post.
Seguem os links:

Own Your Space–Keep Yourself and Your Stuff Safe Online
http://www.microsoft.com/download/en/details.aspx?displayLang=en&id=1522

Windows Phone Programming in C# For Beginners
http://blogs.msdn.com/b/mvplead/archive/2011/01/28/free-ebook-windows-phone-programming-in-c-for-beginners.aspx

Silverlight for Windows Phone
http://blogs.msdn.com/b/lebanon/archive/2011/02/25/free-ebook-silverlight-for-windows-phone.aspx

Windows Phone Programming in C#
https://www.facultyresourcecenter.com/curriculum/pfv.aspx?ID=8729&c1=en-us&c2=0&Login=&wa=wsignin1.0

Programming Windows Phone 7
http://blogs.msdn.com/b/microsoft_press/archive/2010/10/28/free-ebook-programming-windows-phone-7-by-charles-petzold.aspx

Programming Windows Phone 7 (Special Excerpt 2)
http://blogs.msdn.com/b/microsoft_press/archive/2010/08/02/free-ebook-petzold-s-programming-windows-phone-7-special-excerpt-2.aspx

Own Your Future: Update Your Skills with Resources and Career Ideas from Microsoft
http://blogs.msdn.com/b/microsoft_press/archive/2010/03/03/free-ebook-own-your-future-update-your-skills-with-resources-and-career-ideas-from-microsoft.aspx

11 Steps to Create a Successful Web Site
http://blogs.msdn.com/b/officeliveguy/archive/2009/02/12/fre-ebook-11-steps-to-create-a-successful-web-site.aspx

Build a website that sells
http://blogs.msdn.com/b/officeliveguy/archive/2009/02/12/free-e-book-build-a-website-that-sells.aspx

Windows Azure
http://blogs.msdn.com/b/innov8showcase/archive/2010/07/06/free-e-book-on-windows-azure.aspx

First Look Microsoft Office 2010
http://blogs.msdn.com/b/microsoft_press/archive/2010/01/20/free-ebook-first-look-microsoft-office-2010.aspx

Microsoft Office 365: Connect and Collaborate Virtually Anywhere, Anytime
http://blogs.msdn.com/b/microsoft_press/archive/2011/08/17/free-ebook-microsoft-office-365-connect-and-collaborate-virtually-anywhere-anytime.aspx

Moving to Microsoft Visual Studio 2010
http://blogs.msdn.com/b/microsoft_press/archive/2010/09/13/free-ebook-moving-to-microsoft-visual-studio-2010.aspx

Windows 7 troubleshooting tips
http://blogs.msdn.com/b/microsoft_press/archive/2009/10/26/free-e-book-windows-7-troubleshooting-tips.aspx

Understanding Microsoft Virtualization Solutions
http://blogs.msdn.com/b/microsoft_press/archive/2010/02/16/free-ebook-understanding-microsoft-virtualization-r2-solutions.aspx

Introducing Microsoft SQL Server 2008 R2
http://blogs.msdn.com/b/microsoft_press/archive/2010/04/14/free-ebook-introducing-microsoft-sql-server-2008-r2.aspx

Mais livros em http://social.technet.microsoft.com/search/en-US?query=Free%20e-book%3a&startindex=0

Por
Fernando Henrique Inocêncio Borba Ferreira.

Blocos de código úteis para SQL Server

Aqui neste exemplo eu listo alguns blocos de código importantes para o desenvolvimento utilizando linguagem Transact SQL. Os blocos são simples, eles tem em sua maioria a intenção de evitar que a sintaxe e outros detalhes sejam esquecidos. Eu acredito que tenha criado esse documento por estar com saudade do Microsoft SQL Server, pois hoje estou trabalhando em um projeto onde as informações são armazenas no Sharepoint.

 

-- Validar itens pertencentes a tabela de metadados sysObjects
IF EXISTS(SELECT TOP 1 * FROM sysObjects WHERE NAME = 'fk_tbAccess_tbClient')
    ALTER TABLE tbAccess DROP CONSTRAINT fk_tbAccess_tbClient
IF EXISTS(SELECT TOP 1 * FROM sysObjects WHERE NAME = 'tbClient' AND TYPE = 'U')
    DROP TABLE tbClient
IF EXISTS(SELECT TOP 1 * FROM sysObjects WHERE NAME = 'tbAccess' AND TYPE = 'U')
    DROP TABLE tbAccess

-- Criação de uma tabela pragramaticamente
CREATE TABLE tbClient
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    UNIQUEID UNIQUEIDENTIFIER DEFAULT(NEWID()) UNIQUE,
    FIRSTNAME VARCHAR(50) NOT NULL,
    LASTNAME VARCHAR(200),
    OCURRENCY DATETIME DEFAULT(GETDATE()) NOT NULL
)

CREATE TABLE tbAccess
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    CLIENTID INT NOT NULL,
    OCURRENCY DATETIME DEFAULT(GETDATE()) NOT NULL
)

-- Adicionar uma Foreign Key entre duas tabelas da base de dados
ALTER TABLE tbAccess
ADD CONSTRAINT fk_tbAccess_tbClient
FOREIGN KEY (CLIENTID)
REFERENCES tbClient(ID)
ON DELETE CASCADE

-- Adicionar nova coluna na tabela programaticamente
ALTER TABLE tbClient ADD NEWCOLUMN INT

-- Alterar tipo de dados de uma tabela programaticamente
ALTER TABLE tbClient ALTER COLUMN NEWCOLUMN DECIMAL(18,2)

-- Remover coluna de uma tabela programaticamente
ALTER TABLE tbClient DROP COLUMN NEWCOLUMN

-- Inserção
INSERT INTO tbClient (FIRSTNAME, LASTNAME) VALUES ('Amazonia', 'Região Norte')

INSERT INTO tbClient
    (UNIQUEID, FIRSTNAME, LASTNAME, OCURRENCY)
    VALUES
    (NEWID(), 'Brasil', 'América Latina', DATEADD(DAY, -1, GETDATE()))

-- Seleção
SELECT * FROM tbClient;   
SELECT * FROM tbClient ORDER BY ID DESC
SELECT * FROM tbClient WHERE ISNULL(ID, 0) = 1

-- Declaração de variáveis
DECLARE @id INT
DECLARE @fistName  VARCHAR(50),
        @ocurrency DATETIME

-- Valorização de variáveis
SET @id = (SELECT TOP 1 ID FROM tbClient)
SELECT TOP 1 @ocurrency = OCURRENCY FROM tbClient

-- Escrever valores em tela
PRINT @id
PRINT @ocurrency

-- Modelos de formatação de data
SELECT CONVERT(VARCHAR, OCURRENCY, 103) FROM tbClient /* Formato de data dd/MM/yyyy */
SELECT CONVERT(VARCHAR, OCURRENCY, 108) FROM tbClient /* Formato de hora hh/mm/ss   */
SELECT CONVERT(VARCHAR, OCURRENCY, 112) FROM tbClient /* Formato de data yyyyMMdd   */
SELECT CONVERT(VARCHAR, OCURRENCY, 110) FROM tbClient /* Formato de data MM-dd-yyyy */
SELECT CONVERT(VARCHAR, OCURRENCY, 102) FROM tbClient /* Formato de data yyyy.MM.dd */

-- Looping
DECLARE @iterator INT
SET @iterator = 0
WHILE (@iterator < 50) BEGIN
    INSERT INTO tbAccess (CLIENTID, OCURRENCY) VALUES (1, DATEADD(DAY, @iterator, GETDATE()))
    SET @iterator = @iterator + 1
END

-- Inner Join
SELECT
    C.FIRSTNAME,
    A.OCURRENCY
FROM
    tbClient C
    INNER JOIN tbAccess A ON C.ID = A.CLIENTID

-- Left Join
SELECT
    C.FIRSTNAME,
    A.OCURRENCY
FROM
    tbClient C
    LEFT JOIN tbAccess A ON C.ID = A.CLIENTID

-- Group By e Inner Join
SELECT
    C.FIRSTNAME,
    MAX(A.OCURRENCY) AS "Máxima Data"
FROM
    tbClient C
    INNER JOIN tbAccess A ON C.ID = A.CLIENTID
GROUP BY
    C.FIRSTNAME

-- Group By e Left Join
SELECT
    C.FIRSTNAME,
    MAX(A.OCURRENCY) AS MAXIMA_DATA
FROM
    tbClient C
    LEFT JOIN tbAccess A ON C.ID = A.CLIENTID
GROUP BY
    C.FIRSTNAME

-- Best Praticie
-- Criação de procedure de captura de exceptions
-- http://msdn.microsoft.com/pt-br/library/ms175976.aspx
IF OBJECT_ID('spGetErrorInfo', 'P') IS NOT NULL
    DROP PROCEDURE spGetErrorInfo;
GO

CREATE PROCEDURE spGetErrorInfo
AS
SELECT
    ERROR_NUMBER() AS ErrorNumber,
    ERROR_SEVERITY() AS ErrorSeverity,
    ERROR_STATE() AS ErrorState,
    ERROR_PROCEDURE() AS ErrorProcedure,
    ERROR_LINE() AS ErrorLine,
    ERROR_MESSAGE() AS ErrorMessage;
GO

-- Bloco Try/Catch
BEGIN TRY   
    -- Simula uma exception
    SELECT 1/0;
END TRY
BEGIN CATCH
    -- Executa procedure de captura de exceptions   
    EXECUTE spGetErrorInfo;
END CATCH;

-- Função simples
IF EXISTS(SELECT * FROM sysObjects WHERE NAME = 'fnRetornaTriplo')
    DROP FUNCTION fnRetornaTriplo
GO

CREATE FUNCTION fnRetornaTriplo(@variavel INT)
    RETURNS INT
BEGIN

    RETURN @variavel * @variavel

END
GO

-- Função tabela
IF EXISTS(SELECT * FROM sysObjects WHERE NAME = 'fnRetornaTabela')
    DROP FUNCTION fnRetornaTabela
GO

CREATE FUNCTION fnRetornaTabela(@variavel INT)
    RETURNS @return TABLE(ID INT, CLIENTGUID UNIQUEIDENTIFIER)
BEGIN
   
    INSERT INTO @return
    SELECT ID, UNIQUEID
    FROM tbClient
    WHERE ID = @variavel

    RETURN

END
GO

-- Executa função
SELECT dbo.fnRetornaTriplo(10)
SELECT * FROM dbo.fnRetornaTabela(1)

-- Criar visão
IF EXISTS(SELECT * FROM sysObjects WHERE NAME = 'vwClient')
    DROP VIEW vwClient
GO

CREATE VIEW vwClient
AS
    SELECT
        ID,
        FIRSTNAME
    FROM
        tbClient
GO

-- Utilizando UNION
SELECT * FROM tbClient
UNION
SELECT * FROM tbClient
UNION
SELECT * FROM tbClient

-- Utilizando UNION ALL
SELECT * FROM tbClient
UNION ALL
SELECT * FROM tbClient
UNION ALL
SELECT * FROM tbClient

-- Consulta de metadados da base de dados
SELECT
    Objetos.name,
    Colunas.name,
    TipoDados.name,
    Colunas.length
FROM
    sysColumns Colunas
    INNER JOIN sysTypes TipoDados ON Colunas.xtype = TipoDados.xtype
    INNER JOIN sysObjects Objetos ON Colunas.id = Objetos.id
WHERE
    Objetos.Type = 'U'
ORDER BY
    Objetos.name,
    Colunas.colorder

Por

Fernando Henrique Inocêncio Borba Ferreira

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 63 outros seguidores