本文將詳細介紹如何使用 C# 在 SQLite 數(shù)據(jù)庫中執(zhí)行 SELECT 操作。SELECT 操作是數(shù)據(jù)庫查詢中最常用和最重要的操作,用于從數(shù)據(jù)庫中檢索數(shù)據(jù)。
準備工作
首先,確保你的項目中已安裝 System.Data.SQLite
NuGet 包。在你的 C# 文件頂部添加以下 using 語句:
using System;
using System.Data;
using System.Data.SQLite;
連接到數(shù)據(jù)庫
在執(zhí)行任何查詢之前,我們需要建立與數(shù)據(jù)庫的連接。以下是一個建立連接的輔助方法:
public static SQLiteConnection ConnectToDatabase(string dbPath)
{
try
{
SQLiteConnection connection = new SQLiteConnection($"Data Source={dbPath};Version=3;");
connection.Open();
return connection;
}
catch (Exception ex)
{
Console.WriteLine($"連接數(shù)據(jù)庫時出錯:{ex.Message}");
return null;
}
}
基本的 SELECT 操作
查詢所有記錄
以下是一個查詢表中所有記錄的方法:
public static void SelectAllRecords(SQLiteConnection connection, string tableName)
{
try
{
string sql = $"SELECT * FROM {tableName}";
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
using (SQLiteDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write($"{reader.GetName(i)}: {reader[i]}, ");
}
Console.WriteLine();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"查詢所有記錄時出錯:{ex.Message}");
}
}
使用示例:
SelectAllRecords(connection, "Users");
使用條件查詢
以下是一個帶條件的查詢方法:
public static void SelectRecordsWithCondition(SQLiteConnection connection, string tableName, string condition)
{
try
{
string sql = $"SELECT * FROM {tableName} WHERE {condition}";
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
using (SQLiteDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write($"{reader.GetName(i)}: {reader[i]}, ");
}
Console.WriteLine();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"條件查詢記錄時出錯:{ex.Message}");
}
}
使用示例:
SelectRecordsWithCondition(connection, "Users", "Age > 30");
使用參數(shù)化查詢
為了防止 SQL 注入攻擊并提高性能,我們應該使用參數(shù)化查詢:
public static void SelectRecordsWithParameters(SQLiteConnection connection, string tableName, string condition, Dictionary<string, object> parameters)
{
try
{
string sql = $"SELECT * FROM {tableName} WHERE {condition}";
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
foreach (var param in parameters)
{
command.Parameters.AddWithValue(param.Key, param.Value);
}
using (SQLiteDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write($"{reader.GetName(i)}: {reader[i]}, ");
}
Console.WriteLine();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"參數(shù)化查詢記錄時出錯:{ex.Message}");
}
}
使用示例:
var parameters = new Dictionary<string, object>
{
{ "@minAge", 25 },
{ "@maxAge", 40 }
};
SelectRecordsWithParameters(connection, "Users", "Age BETWEEN @minAge AND @maxAge", parameters);
高級 SELECT 操作
使用聚合函數(shù)
SQLite 支持多種聚合函數(shù),如 COUNT, AVG, SUM 等。以下是一個使用聚合函數(shù)的示例:
public static void SelectWithAggregation(SQLiteConnection connection, string tableName, string aggregation)
{
try
{
string sql = $"SELECT {aggregation} FROM {tableName}";
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
object result = command.ExecuteScalar();
Console.WriteLine($"聚合結果:{result}");
}
}
catch (Exception ex)
{
Console.WriteLine($"執(zhí)行聚合查詢時出錯:{ex.Message}");
}
}
使用示例:
SelectWithAggregation(connection, "Users", "AVG(Age)");
使用 ORDER BY 和 LIMIT
以下是一個帶排序和限制結果數(shù)量的查詢方法:
public static void SelectWithOrderAndLimit(SQLiteConnection connection, string tableName, string orderBy, int limit)
{
try
{
string sql = $"SELECT * FROM {tableName} ORDER BY {orderBy} LIMIT {limit}";
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
using (SQLiteDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write($"{reader.GetName(i)}: {reader[i]}, ");
}
Console.WriteLine();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"執(zhí)行排序和限制查詢時出錯:{ex.Message}");
}
}
使用示例:
SelectWithOrderAndLimit(connection, "Users", "Age DESC", 5);
使用 JOIN
以下是一個使用 JOIN 的示例方法:
public static void SelectWithJoin(SQLiteConnection connection, string table1, string table2, string joinCondition)
{
try
{
string sql = $"SELECT * FROM {table1} INNER JOIN {table2} ON {joinCondition}";
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
using (SQLiteDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write($"{reader.GetName(i)}: {reader[i]}, ");
}
Console.WriteLine();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"執(zhí)行 JOIN 查詢時出錯:{ex.Message}");
}
}
使用示例:
SelectWithJoin(connection, "Users", "Orders", "Users.Id = Orders.UserId");
使用 DataTable 存儲結果
對于需要在內存中處理查詢結果的情況,我們可以使用 DataTable:
public static DataTable SelectToDataTable(SQLiteConnection connection, string sql)
{
try
{
DataTable dt = new DataTable();
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(command))
{
adapter.Fill(dt);
}
}
return dt;
}
catch (Exception ex)
{
Console.WriteLine($"查詢到 DataTable 時出錯:{ex.Message}");
return null;
}
}
使用示例:
DataTable dt = SelectToDataTable(connection, "SELECT * FROM Users WHERE Age > 30");
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
Console.Write($"{col.ColumnName}: {row[col]}, ");
}
Console.WriteLine();
}
完整示例
以下是一個完整的示例,展示了如何使用上述所有方法:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
class Program
{
static void Main(string[] args)
{
string dbPath = "C:\\example.db";
SQLiteConnection connection = ConnectToDatabase(dbPath);
if (connection != null)
{
// 查詢所有記錄
Console.WriteLine("所有用戶:");
SelectAllRecords(connection, "Users");
// 條件查詢
Console.WriteLine("\n30歲以上的用戶:");
SelectRecordsWithCondition(connection, "Users", "Age > 30");
// 參數(shù)化查詢
Console.WriteLine("\n25到40歲的用戶:");
var parameters = new Dictionary<string, object>
{
{ "@minAge", 25 },
{ "@maxAge", 40 }
};
SelectRecordsWithParameters(connection, "Users", "Age BETWEEN @minAge AND @maxAge", parameters);
// 聚合查詢
Console.WriteLine("\n用戶平均年齡:");
SelectWithAggregation(connection, "Users", "AVG(Age)");
// 排序和限制結果
Console.WriteLine("\n年齡最大的5個用戶:");
SelectWithOrderAndLimit(connection, "Users", "Age DESC", 5);
// JOIN 查詢
Console.WriteLine("\n用戶及其訂單:");
SelectWithJoin(connection, "Users", "Orders", "Users.Id = Orders.UserId");
// 查詢到 DataTable
Console.WriteLine("\n30歲以上的用戶(使用 DataTable):");
DataTable dt = SelectToDataTable(connection, "SELECT * FROM Users WHERE Age > 30");
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
Console.Write($"{col.ColumnName}: {row[col]}, ");
}
Console.WriteLine();
}
// 關閉連接
connection.Close();
}
}
// 在這里實現(xiàn)所有上述方法
}
注意事項
始終使用參數(shù)化查詢來防止 SQL 注入攻擊。
對于大型結果集,考慮使用分頁查詢或流式處理來避免內存問題。
正確處理 NULL 值,特別是在使用聚合函數(shù)時。
在完成操作后,記得關閉數(shù)據(jù)庫連接。
對于頻繁執(zhí)行的查詢,可以考慮使用預處理語句(prepared statements)來提高性能。
結論
本文詳細介紹了如何使用 C# 在 SQLite 數(shù)據(jù)庫中執(zhí)行各種 SELECT 操作,包括基本查詢、條件查詢、參數(shù)化查詢、聚合查詢、排序和限制結果、JOIN 操作以及使用 DataTable 存儲結果。這些操作覆蓋了大多數(shù)常見的數(shù)據(jù)檢索場景。
該文章在 2024/10/22 12:24:35 編輯過