ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 使用 Visual Basic 获取 SQLite 元数据 > 原文: [http://zetcode.com/db/sqlitevb/meta/](http://zetcode.com/db/sqlitevb/meta/) 元数据是有关数据库中数据的信息。 SQLite 中的元数据包含有关表和列的信息,我们在其中存储数据。 受 SQL 语句影响的行数是元数据。 结果集中返回的行数和列数也属于元数据。 可以使用`PRAGMA`命令获取 SQLite 中的元数据。 SQLite 对象可能具有属性,即元数据。 最后,我们还可以通过查询 SQLite 系统`sqlite_master`表来获取特定的元数据。 ```vb 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 ``` 在上面的示例中,我们获取查询返回的行数和列数。 ```vb Try Console.Write("Enter rows to fetch: ") nrows = Console.ReadLine() Catch e As FormatException Console.WriteLine(e.ToString()) End Try ``` 该示例要求在命令行上的行数。 ```vb cmd.CommandText = "SELECT * FROM Cars LIMIT @Id" cmd.Prepare() cmd.Parameters.AddWithValue("@Id", Int32.Parse(nrows)) ``` 我们选择的行数与在命令行中提供的一样多。 ```vb cols = rdr.FieldCount ``` 可以从`SqliteDataReader`对象的`FieldCount`属性检索返回的列数。 ```vb While rdr.Read() rows += 1 End While ``` 我们计算结果集中的行数。 ```vb $ mono fields_rows.exe Enter rows to fetch: 5 The query fetched 5 rows Each row has 3 cols ``` 输出。 ## 列标题 接下来,我们将展示如何使用数据库表中的数据打印列标题。 ```vb 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 行及其列名。 ```vb Dim rdr As SqliteDataReader = cmd.ExecuteReader() ``` 我们创建一个`SqliteDataReader`对象。 ```vb Console.WriteLine(String.Format("{0, -3} {1, -8} {2, 8}", _ rdr.GetName(0), rdr.GetName(1), rdr.GetName(2))) ``` 我们使用阅读器的`GetName()`方法获得列的名称。 `String.Format()`方法用于格式化数据。 ```vb 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 语句返回的数据打印到终端。 ```vb $ mono headers.exe Id Name Price 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 ``` 该程序的输出。 ## 受影响的行 在下面的示例中,我们将发现特定的 SQL 命令已进行了多少更改。 ```vb 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 命令影响的行数。 ```vb cmd.CommandText = "DELETE FROM Friends WHERE Id IN (3, 4, 5)" ``` 在此 SQL 语句中,我们删除三行。 ```vb Dim n As Integer = cmd.ExecuteNonQuery() ``` 我们找出上一条 SQL 语句完成的更改数量。 ```vb $ mono affected_rows.exe The statement has affected 3 rows ``` 示例输出。 ## 表架构 有`GetSchemaTable()`方法,它返回有关每一列的元数据。 它返回许多值,其中包括列名,列大小,基表名或列是否唯一。 ```vb 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 ``` 该示例打印有关表列的大量元数据。 ```vb Dim schemaTable As DataTable = rdr.GetSchemaTable() ``` 我们得到数据库架构表。 ```vb 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 ``` 我们浏览保存元数据的模式表行,并将其打印到控制台。 ```vb $ mono table_schema.exe ColumnName = Id ColumnOrdinal = 0 ColumnSize = 8 NumericPrecision = 19 NumericScale = 0 IsUnique = True IsKey = True ... ``` 摘自示例输出。 ## 表名 在与元数据有关的最后一个示例中,我们将列出`test.db`数据库中的所有表。 ```vb 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 ``` 该代码示例将所选数据库中的所有可用表打印到终端。 ```vb cmd.CommandText = "SELECT name FROM sqlite_master " _ & "WHERE type='table' ORDER BY name" ``` 表名称是从`sqlite_master`表中检索的。 ```vb $ mono table_names.exe Cars Friends2 Images ``` 这些是我们系统上的表。 在 SQLite Visual Basic 教程的这一部分中,我们使用了数据库元数据。