如何用SQL表填充DataTable

17

我目前在Page_Load中使用以下代码创建和读取一个DataTable:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["AllFeatures1"] == null)
    {
        Session["AllFeatures1"] = GetData();
    }
    table = (DataTable)Session["AllFeatures1"];
    DayPilotCalendar1.DataSource = Session["AllFeatures1"];
    DayPilotNavigator1.DataSource = Session["AllFeatures1"];

    if (!IsPostBack)
    {
        DataBind();
        DayPilotCalendar1.UpdateWithMessage("Welcome!");
    }

    if (User.Identity.Name != "")
    {
        Panel1.Visible = true;
    }
}
我想知道如何将这段代码转换为从SQL查询读取数据?我正在尝试下面的代码,但我不确定如何连接它们,使得我的页面加载的datatable可以填充以下SQL命令的结果。
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["BarManConnectionString"].ConnectionString);
conn.Open();
string query = "SELECT * FROM [EventOne]";

SqlCommand cmd = new SqlCommand(query, conn);

DataTable t1 = new DataTable();
using (SqlDataAdapter a = new SqlDataAdapter(cmd))
{
    a.Fill(t1);
}

我卡在这里:

table = (DataTable)Session["AllFeatures1"]; 

我希望这样做:t1 = (DataTable)Session["AllFeatures1];

5个回答

43

SqlDataReaderDataTable 的有效数据源。因此,你只需要这样做:

public DataTable GetData()
{
    SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["BarManConnectionString"].ConnectionString);
    conn.Open();
    string query = "SELECT * FROM [EventOne]";
    SqlCommand cmd = new SqlCommand(query, conn);

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

2
这个回答完美地回答了“如何使用SQL表填充DataTable”的问题。如果它不是特定于OP的话,那么OP的标题就不够好。 - xpt
最好不要使用DataReader.Load()方法来读取所有类型的SQL Select查询。我曾经用它来读取一个带有一些LEFT JOIN的复杂SELECT,结果出现了“无法启用约束。一个或多个行包含违反非空、唯一或外键约束的值”的异常。之后我开始使用DataAdapter.Fill(DataTable)类型的查询,现在没有异常了。 - Jettero

11
你可以创建一个方法,该方法返回给定SQL查询的数据表格:
public DataTable GetDataTable()
{
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["BarManConnectionString"].ConnectionString);
conn.Open();
string query = "SELECT * FROM [EventOne] ";

SqlCommand cmd = new SqlCommand(query, conn);

DataTable t1 = new DataTable();
using (SqlDataAdapter a = new SqlDataAdapter(cmd))
{
    a.Fill(t1);
}
return t1;
}

现在可以像这样使用:

table = GetDataTable();

7
你需要修改方法GetData(),并在该方法中添加你的“实验”代码,并返回t1

是的...你说得对,当你说把你的工作代码放在GetData()里时,我陷入了Page_Load的思维僵局中,但我从“把所有东西都放在Page_Load”中解脱出来了。感谢你的提示。 - AhabLives

1
上面的答案是正确的,但我想扩展另一个答案,提供一种方法来实现同样的功能,如果您需要将参数传递到查询中。
SqlDataAdapter 快速简单,但仅适用于使用静态请求填充表格的情况,即:没有参数的简单 SELECT
这是我执行相同操作的方式,但使用参数来控制我需要在表格中显示的数据,并将其用于填充 DropDownList
//populate the Programs dropdownlist according to the student's study year / preference
DropDownList ddlPrograms = (DropDownList)DetailsView1.FindControl("ddlPrograms");
if (ddlPrograms != null)
{
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ATCNTV1ConnectionString"].ConnectionString))
    {
        try
        {
            con.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "SELECT ProgramID, ProgramName FROM tblPrograms WHERE ProgramCatID > 0 AND ProgramStatusID = (CASE WHEN @StudyYearID = 'VPR' THEN 10 ELSE 7 END) AND ProgramID NOT IN (23,112,113) ORDER BY ProgramName";
            cmd.Parameters.Add("@StudyYearID", SqlDbType.Char).Value = "11";
            DataTable wsPrograms = new DataTable();
            wsPrograms.Load(cmd.ExecuteReader());

            //populate the Programs ddl list
            ddlPrograms.DataSource = wsPrograms;
            ddlPrograms.DataTextField = "ProgramName";
            ddlPrograms.DataValueField = "ProgramID";
            ddlPrograms.DataBind();
            ddlPrograms.Items.Insert(0, new ListItem("<Select Program>", "0"));
        }
        catch (Exception ex)
        {
            // Handle the error
        }
    }
}

享受

你有几个问题。首先,尽管不必创建新的SqlDataAdapter是可取的,但SqlDataAdapter.Fill实际上可以处理复杂的SELECT命令(包括JOIN和参数)。其次,SqlParameterCollection.Add方法(在此处由cmd.Parameters引用)返回一个新的SqlParameter对象。这意味着当您分配给该对象的Value属性时,它不会传递到cmd.Parameters中的SqlParameter。干杯! - Kyllian Mobley

1
你可以像下面的代码一样填充数据表。我还使用预定义的包含所有连接的XML文件在运行时获取连接。
  public static DataTable Execute_Query(string connection, string query)
    {
        Logger.Info("Execute Query has been called for connection " + connection);
        connection = "Data Source=" + Connections.run_singlevalue(connection, "server") + ";Initial Catalog=" + Connections.run_singlevalue(connection, "database") + ";User ID=" + Connections.run_singlevalue(connection, "username") + ";Password=" + Connections.run_singlevalue(connection, "password") + ";Connection Timeout=30;";
        DataTable dt = new DataTable();
        try
        {
            using (SqlConnection con = new SqlConnection(connection))
            {
                using (SqlCommand cmd = new SqlCommand(query, con))
                {
                    con.Open();
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.SelectCommand.CommandTimeout = 1800;
                        da.Fill(dt);
                    }
                    con.Close();
                }
            }
            Logger.Info("Execute Query success");
            return dt;
        }
        catch (Exception ex)
        {
            Console.Write(ex.Message);
            return null;
        }
    }   

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