当前位置:首页 > 行业动态 > 正文

如何在C中高效获取数据库表数据?

C#可通过ADO.NET或ORM框架(如Entity Framework)获取数据库表数据,使用SqlConnection建立连接后,执行SQL查询或调用存储过程,通过DataAdapter填充DataSet/DataTable,或通过DataReader逐行读取,也可通过LINQ查询实体模型直接操作表对象,实现数据访问与映射。

在开发C#应用程序时,访问数据库表是高频操作,以下内容将系统化讲解如何通过C#获取数据库表结构及数据,涵盖主流数据库类型(SQL Server、MySQL、SQLite),并提供可直接运行的代码示例,本文遵循技术实践规范,所有方法均通过微软官方文档及行业验证。


核心准备步骤

  1. 安装必要组件

    • SQL Server:使用System.Data.SqlClient命名空间(.NET内置)
    • MySQL:通过NuGet安装MySql.Data
    • SQLite:通过NuGet安装System.Data.SQLite
  2. 建立数据库连接
    通过ConnectionString配置连接参数,示例如下:

    // SQL Server连接字符串
    string sqlServerConn = "Server=服务器地址;Database=数据库名;User Id=用户名;Password=密码;";
    // MySQL连接字符串
    string mysqlConn = "Server=服务器地址;Database=数据库名;Uid=用户名;Pwd=密码;";
    // SQLite连接字符串
    string sqliteConn = "Data Source=数据库文件路径;Version=3;";

获取表结构的3种方法

▨ 方法1:查询系统表(通用性强)

通过SQL直接查询数据库的系统元数据表:

using (SqlConnection connection = new SqlConnection(sqlServerConn))
{
    connection.Open();
    string query = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'";
    SqlCommand cmd = new SqlCommand(query, connection);
    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            Console.WriteLine("表名:" + reader["TABLE_NAME"]);
        }
    }
}

▨ 方法2:使用ADO.NET内置方法(SQL Server专有)

通过GetSchema方法获取元数据:

DataTable tables = connection.GetSchema("Tables");
foreach (DataRow row in tables.Rows)
{
    Console.WriteLine("表名:" + row["TABLE_NAME"]);
}

▨ 方法3:LINQ to SQL(需预配置模型)

适用于已建立实体模型的场景:

DataContext db = new DataContext(connection);
var tableNames = db.Mapping.GetTables().Select(t => t.TableName);

完整代码示例(MySQL环境)

using MySql.Data.MySqlClient;
public List<string> GetMySQLTables()
{
    List<string> tables = new List<string>();
    using (MySqlConnection conn = new MySqlConnection(mysqlConn))
    {
        conn.Open();
        string sql = "SHOW TABLES";
        MySqlCommand cmd = new MySqlCommand(sql, conn);
        using (MySqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                tables.Add(reader[0].ToString());
            }
        }
    }
    return tables; //返回所有表名列表
}

关键技术要点

  1. 连接池管理
    务必使用using语句自动释放连接资源,避免内存泄漏。

  2. 异常处理
    添加try-catch块处理数据库操作异常:

    try
    {
        // 数据库操作代码
    }
    catch (SqlException ex)
    {
        Console.WriteLine($"错误代码:{ex.Number},详情:{ex.Message}");
    }
  3. 安全建议

    • 将连接字符串存储在appsettings.json或环境变量中
    • 生产环境禁用SA账户且使用加密传输

常见问题解决方案

  • 问题1:出现“找不到列”错误
    检查数据库权限,确保账户有SELECT权限

  • 问题2:连接超时
    调整连接字符串中的Connect Timeout=30参数

  • 问题3:中文乱码
    在MySQL连接字符串中添加Charset=utf8mb4


通过上述方法,开发者可稳定获取各类数据库的表结构信息,实际应用中需根据具体数据库类型选择最优方案,并遵循安全开发规范。

引用说明
本文代码示例参考:

  1. 微软ADO.NET官方文档
  2. MySQL Connector/NET开发者指南
  3. SQLite官方.NET实现文档
0