使用 Visual Basic 获取 SQLite 元数据
最后修改于 2020 年 7 月 6 日
元数据是关于数据库中数据的信息。SQLite 中的元数据包含关于存储数据的表和列的信息。SQL 语句影响的行数是元数据。结果集中返回的行数和列数也属于元数据。
SQLite 中的元数据可以使用 PRAGMA 命令获取。SQLite 对象可能具有属性,这些属性就是元数据。最后,我们还可以通过查询 SQLite 系统表 sqlite_master 来获取特定的元数据。
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
在上面的例子中,我们获取查询返回的行数和列数。
Try
Console.Write("Enter rows to fetch: ")
nrows = Console.ReadLine()
Catch e As FormatException
Console.WriteLine(e.ToString())
End Try
该示例要求在命令行上提供行数。
cmd.CommandText = "SELECT * FROM Cars LIMIT @Id"
cmd.Prepare()
cmd.Parameters.AddWithValue("@Id", Int32.Parse(nrows))
我们选择与我们在命令行上提供的数量相同的行数。
cols = rdr.FieldCount
返回的列数可以从 SqliteDataReader 对象的 FieldCount 属性中检索。
While rdr.Read()
rows += 1
End While
我们计算结果集中的行数。
$ mono fields_rows.exe Enter rows to fetch: 5 The query fetched 5 rows Each row has 3 cols
输出。
列标题
接下来,我们将展示如何使用数据库表中的数据打印列标题。
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
在这个程序中,我们从 Cars 表中选择 5 行及其列名。
Dim rdr As SqliteDataReader = cmd.ExecuteReader()
我们创建一个 SqliteDataReader 对象。
Console.WriteLine(String.Format("{0, -3} {1, -8} {2, 8}", _
rdr.GetName(0), rdr.GetName(1), rdr.GetName(2)))
我们使用阅读器的 GetName 方法获取列名。 String.Format 方法用于格式化数据。
While rdr.Read()
Console.WriteLine(String.Format("{0, -3} {1, -8} {2, 8}", _
rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2)))
End While
我们将 SQL 语句返回的数据打印到终端。
$ mono headers.exe Id Name Price 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000
程序的输出。
受影响的行
在下面的示例中,我们将了解某个 SQL 命令执行了多少更改。
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
我们在内存中创建一个 Friends 表。在最后一个 SQL 命令中,我们删除三行。ExecuteNonQuery 方法返回上一个 SQL 命令影响的行数。
cmd.CommandText = "DELETE FROM Friends WHERE Id IN (3, 4, 5)"
在这个 SQL 语句中,我们删除三行。
Dim n As Integer = cmd.ExecuteNonQuery()
我们找出上一个 SQL 语句所做的更改次数。
$ mono affected_rows.exe The statement has affected 3 rows
示例输出。
表模式
有一个 GetSchemaTable 方法,它返回关于每一列的元数据。它返回许多值,包括列名、列大小、基本表名,以及该列是否唯一等。
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
该示例打印了关于表列的大量元数据。
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
我们遍历保存元数据的模式表行,并将它们打印到控制台。
$ mono table_schema.exe ColumnName = Id ColumnOrdinal = 0 ColumnSize = 8 NumericPrecision = 19 NumericScale = 0 IsUnique = True IsKey = True ...
示例输出的摘录。
表名
在与元数据相关的最后一个示例中,我们将列出 test.db 数据库中的所有表。
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
代码示例将所选数据库中的所有可用表打印到终端。
cmd.CommandText = "SELECT name FROM sqlite_master " _
& "WHERE type='table' ORDER BY name"
表名从 sqlite_master 表中检索。
$ mono table_names.exe Cars Friends2 Images
这些是我们系统上的表。
在本 SQLite Visual Basic 教程中,我们使用了数据库元数据。