从 SQL Server 数据库填充 DataTable

Posted

技术标签:

【中文标题】从 SQL Server 数据库填充 DataTable【英文标题】:Fill DataTable from SQL Server database 【发布时间】:2013-06-02 05:29:58 【问题描述】:

这个对我来说是个谜,我知道我从别人那里得到的代码,在我的情况下它返回的数据表是空的

conSTR为连接字符串,设置为全局字符串

public DataTable fillDataTable(string table)
    
        string query = "SELECT * FROM dstut.dbo." +table;

        SqlConnection sqlConn = new SqlConnection(conSTR);
        sqlConn.Open();
        SqlCommand cmd = new SqlCommand(query, sqlConn);

        DataTable dt = new DataTable();
        dt.Load(cmd.ExecuteReader());
        sqlConn.Close();
        return dt;
    

编辑 1 重点是稍后在选项卡控件上的数据网格视图中显示此表,这是关于那个的问题 displaying multiple datatable in tabcontrol C#

这里只是给我一个空白的数据网格视图

编辑 2 都试过了,当我尝试显示表格时,datagridview 是空的,有正确数量的行但现在值

【问题讨论】:

变量表的值是多少? 表里有记录吗? @Steve table = 数据库中的表名(有好几个) @Freelancer 数据库中的表不是空的,有趣的是我可以获得表的行数(测试过)但不是它的值 @iakovl2 试试下面的代码。 【参考方案1】:

如果变量table 包含无效字符(如空格),则应在变量周围添加方括号。

public DataTable fillDataTable(string table)

    string query = "SELECT * FROM dstut.dbo.[" + table + "]";

    using(SqlConnection sqlConn = new SqlConnection(conSTR))
    using(SqlCommand cmd = new SqlCommand(query, sqlConn))
    
        sqlConn.Open();
        DataTable dt = new DataTable();
        dt.Load(cmd.ExecuteReader());
        return dt;
    

顺便说一句,这种代码要非常小心,因为它对 Sql Injection 是开放的。我希望你的表名不是来自用户输入

【讨论】:

它来自我创建的列表,那里没有无效选项。还是有同样的问题 @iakovl2 很遗憾,这没有帮助 - 但请学习史蒂夫在这里对using 的使用;正确使用using 实际上真的很重要。如果我很挑剔,我会提到史蒂夫错过了一个(围绕读者)......但显然我还不够粗俗,甚至顺便提到这一点......;p @MarcGravell 但这里读者直接传递给负载。您的意思是最好将行分成两部分以将 using 应用于 SqlDataReader 对象? @Steve 个人,是的,我更喜欢这样 - 以便通过 using 明确处理它。 DataTable 不保证会处理它(尽管它确实有一个 Close() - 仅在成功情况下)。但实际上,除非您依靠CommandBehavior.CloseConnection 关闭连接(您不在这里),否则它可能并不重要。我对IDisposable 有一个非常简单但有效的方法:如果我的代码对IDisposable 对象负责,那么我的代码负责确保它得到处理。【参考方案2】:

尝试以下:

public DataTable fillDataTable(string table)
    
        string query = "SELECT * FROM dstut.dbo." +table;

        SqlConnection sqlConn = new SqlConnection(conSTR);
        sqlConn.Open();
        SqlCommand cmd = new SqlCommand(query, sqlConn);
        SqlDataAdapter da=new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        sqlConn.Close();
        return dt;
    

希望对你有帮助。

【讨论】:

如果这有什么改变,我会有点惊讶;当然值得一试,但DataTable.Load 方法也可以正常工作。另外:你为什么ExecuteNonQuery那个?你不应该执行cmd 根本 - 适配器会这样做。 @MarcGravell 可能是。我不知道上面的编码风格。我总是以这种风格编码。所以我推荐了这个。

以上是关于从 SQL Server 数据库填充 DataTable的主要内容,如果未能解决你的问题,请参考以下文章

从视图填充或创建表的 SQL Server 过程 - 性能问题

如何从填充 DataTable 的 SELECT 中获取 SQL Server 上的原始架构?

我需要帮助从SQL Server表中排序日期并将它们填充到字符串中

如何使用json从sql server ASP.net中检索数据

如何使用 json 从 sql server ASP.net 中检索数据

SQL server 表填充源