Datastore (NoSQL database)

Cloud Datastore is a highly-scalable NoSQL database which Google promotes for scenarios that require high-availability and durability, and is capable of multiple features such as ACID transactions, SQL-like queries, indexes and many more. This in combination with the characteristic for the NoSQL database solutions of being able to handle different data types, great scalability and the great performance makes it a choice you should have in mind when considering the architecture of your application.

Step 1: Create the Application

First create the WinForms project, to do that create a blank Telerik UI for WinForms project and add a RadGridView and a button to it. The application design should look like this:

Step 2: Create the Database

The following tutorial shows how you can create the Datastore instance - Datastore Quickstart.

The process is strait forward and easy. You need to add some data as well. When ready your database should look like this.

Step 3: Install the NuGet package.

In order to use the classes needed for manipulating the database, you need to install the Google.Cloud.DataStore.V1 NuGet package. It can be found on Nuget's official package source server.

Step 4: Connect from the Application

Once you have the library installed, modifying the database is very straightforward. Here is how you set up a connection to your NoSql database:

DatastoreDb db;
public RadForm1()
{
    InitializeComponent();

    string projectId = "natural-oxygen-200712";
    db = DatastoreDb.Create(projectId);
}
Private db As DatastoreDb

Public Sub New()
    InitializeComponent()

    Dim projectId As String = "natural-oxygen-200712"
    db = DatastoreDb.Create(projectId)
End Sub

This would not work if you have not added the GOOGLE_APPLICATION_CREDENTIALS environment variable. This variable should point to your JSON credential file.

As a first step, you need to create the business object. Here is an example:

public class Book
{
    public Key Key { get; set; }
    public string Name { get; set; }
    public string Author { get; set; }
    public DateTime Published { get; set; }

}

Public Class Book
    Public Property Key() As Key
    Public Property Name() As String
    Public Property Author() As String
    Public Property Published() As Date

End Class

Now you you can use the above object to store the data from the database. The following code shows how you can retrieve the data:

private void radButtonLoad_Click(object sender, EventArgs e)
{
    radGridView1.DataSource = GetBooks();             
}
public List<Book> GetBooks()
{
    List<Book> books = new List<Book>();
    Query query = new Query("Books");

    DatastoreQueryResults tasks = db.RunQuery(query);

    foreach (var entity in tasks.Entities)
    {
        Book book = new Book();
        book.Author = (string)entity["Author"];
        book.Name = (string)entity["Name"];
        book.Published = (DateTime)entity["Published"];
        book.Key = entity.Key;
        books.Add(book);
    }
    return books;
}

Private Sub radButtonLoad_Click(ByVal sender As Object, ByVal e As EventArgs)
    radGridView1.DataSource = GetBooks()
End Sub
Public Function GetBooks() As List(Of Book)
    Dim books As New List(Of Book)()
    Dim query As New Query("Books")

    Dim tasks As DatastoreQueryResults = db.RunQuery(query)

    For Each entity In tasks.Entities
        Dim book As New Book()
        book.Author = CStr(entity("Author"))
        book.Name = CStr(entity("Name"))
        book.Published = CDate(entity("Published"))
        book.Key = entity.Key
        books.Add(book)
    Next entity
    Return books
End Function

Now you can view the data in your application:

Step 5: Update the database.

A proper place to handle and save any changes is the RowsChanged event. This way you will be able to handle the add, remove and edit operations. The main part is that you need to keep the key of the entity object in order to get the existing items from the database.

private void RadGridView1_RowsChanged(object sender, Telerik.WinControls.UI.GridViewCollectionChangedEventArgs e)
{
    if (e.Action == Telerik.WinControls.Data.NotifyCollectionChangedAction.Add)
    {
        Book newBook = ((GridViewDataRowInfo)e.NewItems[0]).DataBoundItem as Book;

        string kind = "Books";
        string name = "samplebook1";
        KeyFactory keyFactory = db.CreateKeyFactory(kind);
        Key key = keyFactory.CreateKey(name);

        var item = new Entity
        {
            Key = key,
            ["Author"] = newBook.Author,
            ["Published"] = newBook.Published.ToUniversalTime(),
            ["Name"] = newBook.Name

        };
        using (DatastoreTransaction transaction = db.BeginTransaction())
        {
            transaction.Upsert(item);
            transaction.Commit();
        }
    }
    else if (e.Action == Telerik.WinControls.Data.NotifyCollectionChangedAction.Remove)
    {
        Query query = new Query("Books");

        DatastoreQueryResults tasks = db.RunQuery(query);
        var book = ((GridViewDataRowInfo)e.NewItems[0]).DataBoundItem as Book;

        Entity itemToDelete = db.Lookup(book.Key);

        if (itemToDelete != null)
        {
            db.Delete(itemToDelete);
        }
    }
    else if (e.Action == Telerik.WinControls.Data.NotifyCollectionChangedAction.ItemChanged)
    {
        var book = ((GridViewDataRowInfo)e.NewItems[0]).DataBoundItem as Book;
        Entity editedItem = db.Lookup(book.Key);

        editedItem["Author"] = book.Author;
        editedItem["Published"] = book.Published.ToUniversalTime();
        editedItem["Name"] = book.Name;
        db.Update(editedItem);
    }
}

Private Sub RadGridView1_RowsChanged(ByVal sender As Object, ByVal e As Telerik.WinControls.UI.GridViewCollectionChangedEventArgs)
    If e.Action = Telerik.WinControls.Data.NotifyCollectionChangedAction.Add Then
        Dim newBook As Book = TryCast(CType(e.NewItems(0), GridViewDataRowInfo).DataBoundItem, Book)

        Dim kind As String = "Books"
        Dim name As String = "samplebook1"
        Dim keyFactory As KeyFactory = db.CreateKeyFactory(kind)
        Dim key As Key = keyFactory.CreateKey(name)

        Dim item = New Entity With {
            .Key = key,
            ("Author") = newBook.Author,
            ("Published") = newBook.Published.ToUniversalTime(),
            ("Name") = newBook.Name
        }
        Using transaction As DatastoreTransaction = db.BeginTransaction()
            transaction.Upsert(item)
            transaction.Commit()
        End Using
    ElseIf e.Action = Telerik.WinControls.Data.NotifyCollectionChangedAction.Remove Then
        Dim query As New Query("Books")

        Dim tasks As DatastoreQueryResults = db.RunQuery(query)
        Dim book = TryCast(CType(e.NewItems(0), GridViewDataRowInfo).DataBoundItem, Book)

        Dim itemToDelete As Entity = db.Lookup(book.Key)

        If itemToDelete IsNot Nothing Then
            db.Delete(itemToDelete)
        End If
    ElseIf e.Action = Telerik.WinControls.Data.NotifyCollectionChangedAction.ItemChanged Then
        Dim book = TryCast(CType(e.NewItems(0), GridViewDataRowInfo).DataBoundItem, Book)
        Dim editedItem As Entity = db.Lookup(book.Key)

        editedItem("Author") = book.Author
        editedItem("Published") = book.Published.ToUniversalTime()
        editedItem("Name") = book.Name
        db.Update(editedItem)
    End If
End Sub

See Also

In this article
Not finding the help you need? Improve this article