In this part of the SQLite Visual Basic tutorial, we work with database metadata.
last modified July 6, 2020
Metadata is information about the data in the database. Metadata in SQLite contains information about the tables and columns, in which we store data. Number of rows affected by an SQL statement is metadata. Number of rows and columns returned in a result set belong to metadata as well.
Metadata in SQLite can be obtained using the PRAGMA command. SQLite objects may have attributes, which are metadata. Finally, we can also obtain specific metatada from querying the SQLite system sqlite_master table.
Option Strict On
Imports Mono.Data.Sqlite
Module Example
Sub Main()
Dim cs As String = "URI=file:test.db"
Dim nrows As String
Try
Console.Write("Enter rows to fetch: ")
nrows = Console.ReadLine()
Catch e As FormatException
Console.WriteLine(e.ToString())
End Try
Using con As New SqliteConnection(cs)
con.Open()
Using cmd As New SqliteCommand(con)
cmd.CommandText = "SELECT * FROM Cars LIMIT @Id"
cmd.Prepare()
cmd.Parameters.AddWithValue("@Id", Int32.Parse(nrows))
Dim cols As Integer = 0
Dim rows As Integer = 0
Dim rdr As SqliteDataReader = cmd.ExecuteReader()
Using rdr
cols = rdr.FieldCount
rows = 0
While rdr.Read()
rows += 1
End While
Console.WriteLine("The query fetched {0} rows", rows)
Console.WriteLine("Each row has {0} cols", cols)
End Using
End Using
con.Close()
End Using
End Sub
End Module
In the above example, we get the number of rows and columns returned by a query.
Try Console.Write(“Enter rows to fetch: “) nrows = Console.ReadLine() Catch e As FormatException Console.WriteLine(e.ToString()) End Try
The example asks for the number of rows on the command line.
cmd.CommandText = “SELECT * FROM Cars LIMIT @Id” cmd.Prepare()
cmd.Parameters.AddWithValue("@Id”, Int32.Parse(nrows))
We select as many rows as we have provided on the command line.
cols = rdr.FieldCount
The number of returned columns can be retrieved from the FieldCount property of the SqliteDataReader object.
While rdr.Read()
rows += 1
End While
We count the number of rows in the result set.
$ mono fields_rows.exe Enter rows to fetch: 5 The query fetched 5 rows Each row has 3 cols
Output.
Next we will show, how to print column headers with the data from a database table.
Option Strict On
Imports Mono.Data.Sqlite
Module Example
Sub Main()
Dim cs As String = "URI=file:test.db"
Using con As New SqliteConnection(cs)
con.Open()
Using cmd As New SqliteCommand(con)
cmd.CommandText = "SELECT * FROM Cars LIMIT 5"
Dim rdr As SqliteDataReader = cmd.ExecuteReader()
Using rdr
Console.WriteLine(String.Format("{0, -3} {1, -8} {2, 8}", _
rdr.GetName(0), rdr.GetName(1), rdr.GetName(2)))
While rdr.Read()
Console.WriteLine(String.Format("{0, -3} {1, -8} {2, 8}", _
rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2)))
End While
End Using
End Using
con.Close()
End Using
End Sub
End Module
In this program, we select 5 rows from the Cars table with their column names.
Dim rdr As SqliteDataReader = cmd.ExecuteReader()
We create a SqliteDataReader object.
Console.WriteLine(String.Format("{0, -3} {1, -8} {2, 8}”, _ rdr.GetName(0), rdr.GetName(1), rdr.GetName(2)))
We get the names of the columns with the GetName method of the reader. The String.Format method is used to format the data.
While rdr.Read()
Console.WriteLine(String.Format("{0, -3} {1, -8} {2, 8}", _
rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2)))
End While
We print the data that was returned by the SQL statement to the terminal.
$ mono headers.exe Id Name Price 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000
Ouput of the program.
In the following example, we will find out how many changes have been done by a particular SQL command.
Option Strict On
Imports Mono.Data.Sqlite
Module Example
Sub Main()
Dim cs As String = "Data Source=:memory:"
Using con As New SqliteConnection(cs)
con.Open()
Using cmd As New SqliteCommand(con)
cmd.CommandText = "CREATE TABLE Friends(Id INT, Name TEXT)"
cmd.ExecuteNonQuery()
cmd.CommandText = "INSERT INTO Friends VALUES(1, 'Tom')"
cmd.ExecuteNonQuery()
cmd.CommandText = "INSERT INTO Friends VALUES(2, 'Jane')"
cmd.ExecuteNonQuery()
cmd.CommandText = "INSERT INTO Friends VALUES(3, 'Rebekka')"
cmd.ExecuteNonQuery()
cmd.CommandText = "INSERT INTO Friends VALUES(4, 'Lucy')"
cmd.ExecuteNonQuery()
cmd.CommandText = "INSERT INTO Friends VALUES(5, 'Robert')"
cmd.ExecuteNonQuery()
cmd.CommandText = "DELETE FROM Friends WHERE Id IN (3, 4, 5)"
Dim n As Integer = cmd.ExecuteNonQuery()
Console.WriteLine("The statement has affected {0} rows", n)
End Using
con.Close()
End Using
End Sub
End Module
We create a Friends table in memory. In the last SQL command, we delete three rows. The ExecuteNonQuery method returns the number of rows affected by the last SQL command.
cmd.CommandText = “DELETE FROM Friends WHERE Id IN (3, 4, 5)”
In this SQL statement, we delete three rows.
Dim n As Integer = cmd.ExecuteNonQuery()
We find out the number of changes done by the last SQL statement.
$ mono affected_rows.exe The statement has affected 3 rows
Example output.
There is a GetSchemaTable method which returns metadata about each column. It returns many values, among others the column name, column size, the base table name or whether the column is unique or not.
Option Strict On
Imports System.Data Imports Mono.Data.Sqlite
Module Example
Sub Main()
Dim cs As String = "URI=file:test.db"
Using con As New SqliteConnection(cs)
con.Open()
Using cmd As New SqliteCommand(con)
cmd.CommandText = "SELECT * FROM Cars LIMIT 4"
Dim rdr As SqliteDataReader = cmd.ExecuteReader()
Using rdr
Dim schemaTable As DataTable = rdr.GetSchemaTable()
For Each row As DataRow In schemaTable.Rows
For Each col As DataColumn In schemaTable.Columns
Console.WriteLine(col.ColumnName & " = " & row(col))
Next
Console.WriteLine()
Next
End Using
End Using
con.Close()
End Using
End Sub
End Module
The example prints lots of metadata about table columns.
Dim schemaTable As DataTable = rdr.GetSchemaTable()
We get the database schema table.
For Each row As DataRow In schemaTable.Rows
For Each col As DataColumn In schemaTable.Columns
Console.WriteLine(col.ColumnName & " = " & row(col))
Next
Console.WriteLine()
Next
We go through the schema table rows, which hold the metadata, and print them to the console.
$ mono table_schema.exe ColumnName = Id ColumnOrdinal = 0 ColumnSize = 8 NumericPrecision = 19 NumericScale = 0 IsUnique = True IsKey = True …
Excerpt from the example output.
In our last example related to the metadata, we will list all tables in the test.db database.
Option Strict On
Imports Mono.Data.Sqlite
Module Example
Sub Main()
Dim cs As String = "URI=file:test.db"
Using con As New SqliteConnection(cs)
con.Open()
Using cmd As New SqliteCommand(con)
cmd.CommandText = "SELECT name FROM sqlite_master " _
& "WHERE type='table' ORDER BY name"
Dim rdr As SqliteDataReader = cmd.ExecuteReader()
Using rdr
While (rdr.Read())
Console.WriteLine(rdr.GetString(0))
End While
End Using
End Using
con.Close()
End Using
End Sub
End Module
The code example prints all available tables in the chosen database to the terminal.
cmd.CommandText = “SELECT name FROM sqlite_master " _ & “WHERE type=‘table’ ORDER BY name”
The table names are retrieved from the sqlite_master table.
$ mono table_names.exe Cars Friends2 Images
These were the tables on our system.
In this part of the SQLite Visual Basic tutorial, we have worked with database metadata.