【问题标题】:How to fill DataTable with SQL Table如何用 SQL 表填充 DataTable
【发布时间】:2012-08-13 03:49:44
【问题描述】:

我目前正在我的 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 查询中读取?我正在试验下面的代码,但我不确定如何连接它们,以便我的页面加载中的数据表填充下面的 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];

【问题讨论】:

    标签: c# .net sql datatable


    【解决方案1】:

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

    【讨论】:

    • 完美回答了“如何用 SQL 表填充 DataTable”这个问题。如果它不是针对 OP 的,那么 OP 对他的问题的标题不够好。
    • 最好不使用 DataReader.Load() 方法来读取所有类型的 SQL Select Query。我用它来读出一个带有一些 LEFT JOIN 的复杂 SELECT,我得到“无法启用约束。一行或多行包含违反非空、唯一或外键约束的值”异常。在我开始使用 DataAdapter.Fill(DataTable) 类型的 Query 之后,现在也不例外。
    【解决方案2】:

    您可以创建返回给定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();
    

    【讨论】:

      【解决方案3】:

      您需要修改方法GetData() 并在那里添加您的“实验”代码,并返回t1

      【讨论】:

      • 是的......你是对的,当你说将工作代码放入 GetData() 时,我被 Page_Load 困住了,我从“将所有内容放入 Page_Load”冻结中弹出。感谢您的推动。
      【解决方案4】:

      上面的答案是正确的,但我想如果您需要将参数传递到查询中,我会通过提供一种方法来扩展另一个答案。

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

      享受

      【讨论】:

        【解决方案5】:

        您可以像下面的代码一样填写您的数据表。我还在运行时使用具有所有连接的预定义 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;
                }
            }   
        

        【讨论】:

          猜你喜欢
          • 2014-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多