Controle com Banco de Dados NoSQL

Olá a todos, nesse tópico vou mostrar como ter um controle dos dados de uma collection em um banco de dados NoSQL, nesse post sera usado o MongoDb como exemplo.

No NoSQL pode se ter diferentes Objetos para a mesma Collection.
Exemple:

Na Collection teste posso ter os seguintes Objetos:

{
    _id: 1,
    nome: 'Rafael',
    idade: 22
},
{
   _id: 2,
   nome: 'Fulano',
   idade: '50',
   nascimento: 'Jul 14, 1992',
   sexo: 'M'
}

Isso pode dar muita dor de cabeça na hora de tratar os dados na aplicação, e pode comprometer o desempenho de sua aplicação caso trate a inserção dos dados no código.

Uma maneira simples é criar uma função em JavaScript para inserir todos os dados nas Collections, assim todo o processamento ficara no banco, tornando sua aplicação mais rápida e evitando códigos gigantes.

O primeiro passo é criar uma Collection que ficara salva o modelo do seu banco de dados.

var document = { Namecollection: 'pessoa', nome: 'string', idade: 'int' };
db.collection.save(document);

Agora vamos criar nossa função no banco, que ira inserir os dados no banco.

db.system.js.insert( {
    _id: 'InsertFunction',
    value: 
    function(listObj) 
    {
        var objId = ObjectId();
        var data = '{ _id: ' + "ObjectId(objId.valueOf())";
        var valorColumn;
        var myCursor = db.getCollection('collection').find({ Namecollection: listObj["Namecollection"] });
        var myDocument = myCursor.hasNext() ? myCursor.next() : null;

        if(!myDocument)
            throw { name : "FunctionError", message : "Collection não existe!" }; 

        for(var doc in myDocument)
        {
            if (doc != "Namecollection" && doc != "_id")
            {
                switch(myDocument[doc])
                {
                    case('string'):
                        valorColumn = listObj[doc] ? '\"' + listObj[doc]  + '\"' : null;
                        break;
                    case('int'):
                        valorColumn = parseInt(listObj[doc]) ? parseInt(listObj[doc]) : 0;
                        break;
                    default:
                        valorColumn = listObj[doc] ? '\"' + listObj[doc] + '\"' : null;
                        break;
                }

                data = data + ', ' + doc + ': ' + valorColumn;
            }
        }

        var document = eval('(' + data + '}' + ')');
        db.getCollection(listObj["Namecollection"]).save( document );
    }
});

Agora é so testar so testar nossa function.

db.loadServerScripts();
var document = {
   Namecollection: 'pessoa',
   nome: 'Siclano',
   idade: '50',
   nascimento: 'Jul 14, 1992',
   sexo: 'M'
};
InsertFunction(document);
db.pessoa.find();

Nesse exemplo nossa Function ira ignorar os campos, nascimento e sexo, que não existem no nosso modelo da Collection “collection”, e também irá transformar o valor de idade para que int, como está definido na nossa collection. Portanto nosso resultado da pesquisa sera o seguinte:

{
    _id: ObjectId("553a86fcc6364b83e5d99b81"),
    nome: "Siclano",
    idade: 50
}

Para ver o código completo acesse meu repositório no GitHub https://github.com/rafaellincoln/Control-For-Mongodb

Se gostou compartilhe esse post e colabore com o projeto no GitHub.

Faça sugestões:
Através do meu Facebook: https://www.facebook.com/Rafael.Lincoln13
Ou através do meu Email: rafaellincolnpereira@gmail.com

Consulta Dinâmica ao Banco de Dados

Olá a todos, nesse tópico vou ensinar como se criar uma consulta dinâmica no banco de dados e retornar uma lista.

Neste exemplo eu usarei o postgres como banco de dados e o Npgsql como Driver para conexão com o banco de dados.

Primeiramente iremos criar um método para abrir e fechar a conexão com o banco de dados.

public NpgsqlConnection ConnectionHelper(bool Open)
{
	try
	{
		if (Open)
		{
			if (con == null)
				con = new NpgsqlConnection(stringConnection);

			if (con.State != ConnectionState.Open)
				con.Open();
		}
		else
		{
			if (con == null || con.State == ConnectionState.Closed)
				return null;

			con.Close();
		}
	}
	catch (Exception e)
	{
		throw new Exception(e.Message, e);
	}
        return con;
}

Agora iremos criar o método que executara as querys no banco de dados que receba o resultado e grave dinamicamente em uma lista.

Para isso vamos usar uma variável do tipo “dynamic”, que nos permite carregar uma lista sem conhecer as propriedades.

public object ExecutaComando()
{
	try
	{
		NpgsqlCommand comand = new NpgsqlCommand(comando, con);

		if (!returnList)
		{
			comand.ExecuteNonQuery();
			return null;
		}

		if (string.IsNullOrEmpty(typeReturn))
			throw new DynamicException("Defina um valor para o parametro TypeReturn!");

		Assembly asm = Assembly.GetCallingAssembly();

		Type type = asm.GetType(typeReturn, true);

		if (type == null)
			throw new DynamicException("Não encontrada a referencia " + typeReturn);

		PropertyInfo[] propInfo = type.GetProperties();

		dynamic _returnValue = CreateGeneric(typeof(List<>), type);

		IDataReader dr = comand.ExecuteReader();

		while (dr.Read())
		{
			dynamic item = Activator.CreateInstance(type);

			foreach (PropertyInfo prop in propInfo)
			{
				string pName = prop.Name;
				Type pType = prop.PropertyType;

				var value = dr[pName.GetNameColumn()].ChangeType(pType);

				prop.SetValue(item, value);
			}

			_returnValue.Add(item);
		}
		

		return _returnValue;

	}
	catch (DynamicException e)
	{
		throw new DynamicException(e.Message, e);
	}
}

Neste método eu carrego o tipo passado através de um parâmetro e crio uma lista do tipo dynamic e gravo os dados em uma lista e a retorno.

Segue um exemplo de como fazer uma consulta dinâmica usando nosso exemplo:

static void Main(string[] args)
{
	try
	{
		HelperDba Dba = new HelperDba();

		Dba.Comando = "SELECT * FROM pessoa;";
		Dba.ReturnList = true;
		Dba.TypeReturn = "Dynamic_Query.Pessoa";
		Dba.StringConnection = "Server = 127.0.0.1; Port = 5432; Database = teste_db; User Id = postgres; Password = postgres; Timeout = 15;";

		Dba.ConnectionHelper(true);

		IList<Pessoa> list = (List<Pessoa>)Dba.ExecutaComando();

		foreach (Pessoa p in list)
			Console.WriteLine("Nome: " + p.Nome + " " + p.SobreNome + " - Idade: " + p.Idade);
	}
	catch(DynamicException e)
	{
		Console.WriteLine(e);
	}

	Console.ReadLine();
}

E nosso resultado será:

Resultado de uma consulta no banco usando métodos Dinâmicos.
Resultado de uma consulta no banco usando métodos Dinâmicos.

Para ver o código completo acesse meu repositório no GitHub https://github.com/rafaellincoln/Dynamic-Query

Se gostou compartilhe esse post e colabore com o projeto no GitHub.

Faça sugestões:
Através do meu Facebook: https://www.facebook.com/Rafael.Lincoln13
Ou através do meu Email: rafaellincolnpereira@gmail.com

Criando teste unitário para sua aplicação

Neste post irei ensinar como criar testes unitários para o seu código.

Vamos usar o simples código de fatorial a baixa:

public static int TestFatorial(int Number)
{
	int fatorial = Number;

	for (int i = 1; i > Number; i++)
	{
		fatorial *= i;
	}

	return fatorial;
}

Crie uma projeto Class Library e cole o nosso exemplo na sua classe.

Pronto, agora vamos criar um projeto para testarmos nosso exemplo.

Adicione um projeto do tipo Unit Test Project(Visual C# -> Teste -> Unit Test Project).

Todo método de Teste deve ter a notação [TestMethod].

Crie o seguinte método de Teste

public void TestFatorial()
{
	int Number = 8;
	int Expected = 40320;
	int result = TimerAsync.TestFatorial(Number);

	Assert.AreEqual(Expected, result, string.Format("O fatorial correto de {0} é {1} e o resultado retornado foi {2}", Number, Expected, result));
}

O método AreEqual da Classe Assert irá testar se o resultado é o correto.
Ao executar o teste você ira receber o seguinte erro: “O fatorial correto de 8 é 40320 e o resultado retornado foi 8”.

Para corrigir o erro você deve alterar a seguinte linha do nosso código de exemplo:

//Altere a linha
for (int i = 1; i > Number; i++)
//Para a seguinte linha
for (int i = 1; i < Number; i++)

Pronto, agora você tem um teste unitário pronto e pode testar todos os seu códigos

Capturar Fotos usando C# no Windows Phone 8.1

Nesse post irei ensinar como criar uma App para tirar fotos e salvar no dispositivo.

Não existe uma classe no Windows Phone 8.1 que abra o aplicativo da câmera no celular, portanto você deve criar um manualmente.

Crie um button na sua MainPage e use esse seguinte codigo:

private void Button1_Click(object sender, RoutedEventArgs e)
{
      NavigationService.Navigate(new Uri("/CameraPage.xaml", UriKind.Relative));
}

Crie uma nova Page chamada CameraPage, crie um elemento CaptureElement e um button nessa pagina e inicialize a câmera no método OnNavigatedTo

CaptureElement

<CaptureElement Name="capturePreview"
                HorizontalAlignment="Center"
                VerticalAlignment="Center"/>;

OnNavigatedTo

MediaCapture capture;

protected async override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
	base.OnNavigatedTo(e);
	
	capture = new MediaCapture();
	await capture.InitializeAsync();
	capturePreview.Source = capture;
	await capture.StartPreviewAsync();
}

Agora só resta capturar a foto usando o button que criou na sua pagina

private async void Capturar_Click(object sender, RoutedEventArgs e)
{
	if (capture == null)
		return;

	ImageEncodingProperties img = ImageEncodingProperties.CreateJpeg();
	StorageFile storege = await KnownFolders.CameraRoll.CreateFileAsync("testphoto.jpg", CreationCollisionOption.GenerateUniqueName);
	await capture.CapturePhotoToStorageFileAsync(img, storege);
}

Pronto, com isso você já é capaz de tirar fotos e salva-las pelo seu aplicativo.

Duvidas ou Sugestões
rafaellincolnpereira@gmail.com

FileOpenPicker Windows Phone 8.1

Neste primeiro post irei mostrar como abrir arquivos usando o FileOpenPicker no Windows Phone 8.1

Ao abrir o dialogo, para escolher os arquivos, usando o FileOpenPicker, o seu app entra em um modo de suspensão, até que o arquivo seja escolhido. Para isso você deve salvar o Status do seu app para que ele volte no mesmo estado apos o usuário escolher o arquivo.

Para salvar o estado do seu app você deve criar o seguinte método no seu App.xaml.cs

private async void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();

    await SuspensionManager.SaveAsync();
    deferral.Complete();
}

Caso o seu projeto não encontre a classe SuspensionManager você devera criar uma Blank Page no seu projeto para que ele crie a pasta Common, onde se encontra a classe SuspensionManager.

Também no App.xaml.cs você deverá criar um metodo override do OnActivated:

protected override void OnActivated(IActivatedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
         rootFrame = new Frame();
         Window.Current.Content = rootFrame;
    }

    if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
    {
         //Insira uma tratativa caso o programa finalize
    }

    var continuationEventArgs = e as IContinuationActivatedEventArgs;
    if (continuationEventArgs != null)
    {
        var mainPage = rootFrame.Content as MainPage;
        mainPage.Continue(continuationEventArgs);
    }

    Window.Current.Activate();
}

Agora na sua MainPage você deve criar o método Continue, que está sendo chamado no método OnActivated, para recuperar o arquivo que o usuário selecionou.

public async void Continue(IContinuationActivatedEventArgs args)
{
	if (args.Kind == ActivationKind.PickFileContinuation)
	{
		var openPickerContinuationArgs = args as FileOpenPickerContinuationEventArgs;

		// Recuperar a "Action" que está armazenada no ContinuationData, que é gravada na ação que chama o Picker.
		string action = (string)openPickerContinuationArgs.ContinuationData["Action"];

		var files = openPickerContinuationArgs.Files;

		//Caso o usuario possa selecionar mais de um arquivo, você deverar fazer um foreach com a variavel files
		if (files.Count > 0)
		{
			var file = files.FirstOrDefault();
		}
		else
		{
			// TODO: Escreva o codigo para caso o usuario cancele o picker
		}
	}
}

Agora só criar um botão para chamar o Picker.

private void OpenFile_Click(object sender, RoutedEventArgs e)
{
	var openPicker = new FileOpenPicker();
	openPicker.ContinuationData["Action"] = "SendPicture";
	openPicker.FileTypeFilter.Add(".jpg");
	openPicker.FileTypeFilter.Add(".bmp");
	openPicker.PickSingleFileAndContinue();
}

Com isso seu App você já ira conseguir abrir um arquivo salvo no Windows Phone do usuário.