原文: http://zetcode.com/db/sqlitevb/meta/

元数据是有关数据库中数据的信息。 SQLite 中的元数据包含有关表和列的信息,我们在其中存储数据。 受 SQL 语句影响的行数是元数据。 结果集中返回的行数和列数也属于元数据。

可以使用PRAGMA命令获取 SQLite 中的元数据。 SQLite 对象可能具有属性,即元数据。 最后,我们还可以通过查询 SQLite 系统sqlite_master表来获取特定的元数据。

  1. Option Strict On
  2. Imports Mono.Data.Sqlite
  3. Module Example
  4. Sub Main()
  5. Dim cs As String = "URI=file:test.db"
  6. Dim nrows As String
  7. Try
  8. Console.Write("Enter rows to fetch: ")
  9. nrows = Console.ReadLine()
  10. Catch e As FormatException
  11. Console.WriteLine(e.ToString())
  12. End Try
  13. Using con As New SqliteConnection(cs)
  14. con.Open()
  15. Using cmd As New SqliteCommand(con)
  16. cmd.CommandText = "SELECT * FROM Cars LIMIT @Id"
  17. cmd.Prepare()
  18. cmd.Parameters.AddWithValue("@Id", Int32.Parse(nrows))
  19. Dim cols As Integer = 0
  20. Dim rows As Integer = 0
  21. Dim rdr As SqliteDataReader = cmd.ExecuteReader()
  22. Using rdr
  23. cols = rdr.FieldCount
  24. rows = 0
  25. While rdr.Read()
  26. rows += 1
  27. End While
  28. Console.WriteLine("The query fetched {0} rows", rows)
  29. Console.WriteLine("Each row has {0} cols", cols)
  30. End Using
  31. End Using
  32. con.Close()
  33. End Using
  34. End Sub
  35. End Module

在上面的示例中,我们获取查询返回的行数和列数。

  1. Try
  2. Console.Write("Enter rows to fetch: ")
  3. nrows = Console.ReadLine()
  4. Catch e As FormatException
  5. Console.WriteLine(e.ToString())
  6. End Try

该示例要求在命令行上的行数。

  1. cmd.CommandText = "SELECT * FROM Cars LIMIT @Id"
  2. cmd.Prepare()
  3. cmd.Parameters.AddWithValue("@Id", Int32.Parse(nrows))

我们选择的行数与在命令行中提供的一样多。

  1. cols = rdr.FieldCount

可以从SqliteDataReader对象的FieldCount属性检索返回的列数。

  1. While rdr.Read()
  2. rows += 1
  3. End While

我们计算结果集中的行数。

  1. $ mono fields_rows.exe
  2. Enter rows to fetch: 5
  3. The query fetched 5 rows
  4. Each row has 3 cols

输出。

列标题

接下来,我们将展示如何使用数据库表中的数据打印列标题。

  1. Option Strict On
  2. Imports Mono.Data.Sqlite
  3. Module Example
  4. Sub Main()
  5. Dim cs As String = "URI=file:test.db"
  6. Using con As New SqliteConnection(cs)
  7. con.Open()
  8. Using cmd As New SqliteCommand(con)
  9. cmd.CommandText = "SELECT * FROM Cars LIMIT 5"
  10. Dim rdr As SqliteDataReader = cmd.ExecuteReader()
  11. Using rdr
  12. Console.WriteLine(String.Format("{0, -3} {1, -8} {2, 8}", _
  13. rdr.GetName(0), rdr.GetName(1), rdr.GetName(2)))
  14. While rdr.Read()
  15. Console.WriteLine(String.Format("{0, -3} {1, -8} {2, 8}", _
  16. rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2)))
  17. End While
  18. End Using
  19. End Using
  20. con.Close()
  21. End Using
  22. End Sub
  23. 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 教程的这一部分中,我们使用了数据库元数据。