从SQL Server数据库中填充DataTable

9
这对我来说是个谜,我知道这段代码是从别人那里拿来的,在我的情况下,它返回的datatable为空。 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
重点是稍后在TabControl的数据网格视图中显示此表,以下是关于此问题的提问: C#中在TabControl中显示多个DataTable

这里只显示空白的DataGridView。

编辑 2
尝试了所有方法,但当我尝试显示表格时,DataGridView为空,行数正确但没有值。


2
这个表里面有记录吗? - Freelancer
1
@Steve 表格 = 数据库中的表格名称(有多个) - iakovl2
1
@自由职业者 数据库中的表不是空的,有趣的是我可以获取表的行数(已测试),但无法获取其值。 - iakovl2
1
@iakovl2,请尝试使用以下代码。 - Freelancer
@MarcGravell 当我获取表格后,我将其返回给另一个需要在TabControl DataGridView中显示它的函数,我获取了一列的值,每个表格的行数都正确,但是表格的显示效果很差。所以我去找源头,即“filldatatable”。 - iakovl2
显示剩余9条评论
2个回答

33

如果变量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注入攻击。希望你的表名不是来自用户输入。


它来自我创建的列表,没有无效选项。仍然存在相同的问题。 - iakovl2
@iakovl2 真遗憾那没帮上忙 - 但请从 Steve 在这里使用 using 的方式中学习;正确使用 using 实际上非常重要。如果我挑剔的话,我会提到 Steve 漏掉了一个(在 reader 周围)... 但显然我不够得体,甚至不会顺便提一下... ;p - Marc Gravell
@MarcGravell但在这里,阅读器直接传递给Load。您的意思是最好将该行拆分为两个部分,以将using应用于SqlDataReader对象吗? - Steve
2
@Steve 就我个人而言,是的,我更喜欢这样做 - 这样就可以通过 using 明确地处理它。 DataTable 不保证释放它(虽然它确实有一个 Close() - 只在成功的情况下)。 但实际上,除非你依靠 CommandBehavior.CloseConnection 来关闭连接(在这里不是),否则可能并不重要。 我只是对 IDisposable 有一个非常简单但有效的方法:如果我的代码负责一个 IDisposable 对象,那么我的代码负责确保它被处理。 - Marc Gravell

3

请尝试以下方法:

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;
    }

希望这有所帮助。


2
我会有点惊讶,如果这改变了什么;当然值得一试,但 DataTable.Load 方法也很好用。另外:你为什么要执行 ExecuteNonQuery?你根本不应该执行 cmd - 适配器会自动执行的。 - Marc Gravell
@MarcGravell 可能是。我之前不知道这种编码风格。我一直都是用这种风格编码的,所以我建议使用这种风格。 - Freelancer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接