从SQL Server数据库填充DataTable

iak*_*vl2 7 c# sql sql-server 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;
    }
Run Code Online (Sandbox Code Playgroud)

编辑1
整点是稍后在tabcontrol的数据网格视图中显示此表,这是在tabcontrol C#显示多个数据表的问题

这里只显示一个空白的数据网格视图

编辑2
尝试了所有这些,当我尝试显示表时,datagridview为空,具有正确的行数但现在值

Ste*_*eve 29

如果变量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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Steve个人,是的我更喜欢 - 所以它通过`using`明确处理.`DataTable`不保证处理它(虽然它确实有一个'Close()` - 仅在成功场景中).实际上,除非你依靠`CommandBehavior.CloseConnection`来关闭连接(你不在这里),否则它可能并不重要.我只是对`IDisposable'有一个非常简单但有效的方法:如果我的代码对`IDisposable`对象负责*,那么我的代码负责确保它被处理掉. (2认同)

Fre*_*cer 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;
    }
Run Code Online (Sandbox Code Playgroud)

希望它有帮助。

  • 如果这改变了什么,我会有点惊讶;当然值得一试,但是“DataTable.Load”方法也可以正常工作。另外:你为什么要这样做?你根本不应该执行`cmd` - 适配器会这样做。 (2认同)