DataTable 从 C# 中的现有数据库结构自动填充

Posted

技术标签:

【中文标题】DataTable 从 C# 中的现有数据库结构自动填充【英文标题】:DataTable autofilled from existing database structure in C# 【发布时间】:2022-01-19 16:39:44 【问题描述】:

我有一个 WinForm 要求在文本框中插入电子邮件,单击搜索按钮后,sql 查询将搜索表中的记录并在 DataGridView 中显示结果。 这里是搜索按钮的代码

private void RegUnregSearchButton_Click(object sender, EventArgs e)
    
        var dataAccess = new DataAccess();
        var output = dataAccess.BindGrid(EmailTextBox.Text);

        DataGridView1.DataSource = output;
    

BindGrid 的目的是从查询结果中自动填充数据表的列和行,但现在我正在手动完成,因为我不明白如何从 Dapper 结果中检索列。

public class DataAccess

    public DataTable BindGrid(string param)
    
        DataTable dataTable = new DataTable();
        
        //Helper.connString("SqlConnectionString") will take the connection string from an app.config and return the value. Connection works.
        using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.connString("SqlConnectionString")))
        
            var result = connection.Query("SELECT Company, Email, Role, Id, Status from table WHERE Email = 'param'").ToList();
                    
            RegUnregUser user = new RegUnregUser();
            user.company = result.Select(x => x.Company).FirstOrDefault();
            user.email = result.Select(x => x.Email).FirstOrDefault();
            user.role = result.Select(x => x.Role).FirstOrDefault();
            user.id = result.Select(x => x.Id).FirstOrDefault();
            user.status = result.Select(x => x.Status).FirstOrDefault();

            dataTable.Columns.Add("Company");
            dataTable.Columns.Add("Email");
            dataTable.Columns.Add("Role");
            dataTable.Columns.Add("Id");
            dataTable.Columns.Add("Status");
            dataTable.Rows.Add(user.company, user.email, user.role, user.id, user.status);
            
            return dataTable;
        
    

RegUnregUser 类:

public class RegUnregUser

    public string company  get; set; 
    public string email  get; set; 
    public string role  get; set; 
    public object id  get; set; 
    public string status  get; set; 

【问题讨论】:

【参考方案1】:

Dapper 用于映射到自定义对象,而不是与 DataTables 一起使用。话虽如此,您应该可以这样做:

public class DataAccess

    public DataTable BindGrid(string param)
    
        //Helper.connString("SqlConnectionString") will take the connection string from an app.config and return the value. Connection works.
        using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.connString("SqlConnectionString")))
        
            var reader = connection.ExecuteReader("SELECT Company, Email, Role, Id, Status from table WHERE Email = @Email", 
               new Email=param);
            return new DataTable().Load(reader);
        
    

请注意,我正在使用参数化查询。您的代码易受 SQL 注入攻击。

【讨论】:

您可以使用 DataAdapter :docs.microsoft.com/en-us/dotnet/api/… 我知道它容易受到 SQL 注入的攻击,但它是供内部使用的 我使用了 DataAdapter,everythink 工作正常。现在我返回一个填充的数据表,并将结果放入 datagridview

以上是关于DataTable 从 C# 中的现有数据库结构自动填充的主要内容,如果未能解决你的问题,请参考以下文章

关于c#中的datatable,不知道如何清空里面的数据

从 C# 中的 DataTable 中获取 Distinct Column 以及其他列值

C# DataTable 更新 Access 数据库

如何使用 SQL 命令从我的 DataTable 对象中使用 foreach-loop 更新 C# 中的 MS Access 数据库?

C# 直接创建一个DataTable,并为之添加数据(自定义DataTable) 转

从 C# .NET 中的 DataTable 到 JSON