C# 一个数据集中的.NET 2个数据表

C# 一个数据集中的.NET 2个数据表,c#,asp.net,.net,datatable,dataset,C#,Asp.net,.net,Datatable,Dataset,我得到了一个填充gridview的数据集。gridview必须由一个数据集和多个查询(本例中为datatables)填充 正如您在代码中看到的,我使用了2个数据表。这些数据表由数据库(使用sql server)填充。数据表被添加到一个数据集中。在ASP代码中,您可以看到gridview中有3个标签和3列。前两列来自第一个datatable或第一个查询。第二个查询填充最后一列或第三列 当我运行此代码时,在数据集中找不到lblThreeLblThree在数据集中,但在第二个表中,我猜.NET不知道。

我得到了一个填充gridview的数据集。gridview必须由一个数据集和多个查询(本例中为datatables)填充

正如您在代码中看到的,我使用了2个数据表。这些数据表由数据库(使用sql server)填充。数据表被添加到一个数据集中。在ASP代码中,您可以看到gridview中有3个标签和3列。前两列来自第一个datatable或第一个查询。第二个查询填充最后一列或第三列

当我运行此代码时,在数据集中找不到
lblThree
LblThree
在数据集中,但在第二个表中,我猜.NET不知道。你们知道这个错误的解决方案吗?这样我就可以用一个数据集填充我的gridview了

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

namespace TwoDatatableToDataset
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {
                loadAll();
            }
        }

        private void loadAll()
        {   // STEP ONE Put one sql output in an empty dataset: (works well)
            //DataSet ds = new DataSet();
            //DataTable dt2 = new DataTable();
            //string sql = "select SID1 as lblOne, Charge_Amount as lblTwo from [xxx].[xxxx].[xxxx]";
            //SqlConnection Scon = new SqlConnection(ConfigurationManager.ConnectionStrings["testserver"].ConnectionString);
            //SqlCommand Scmd = new SqlCommand(sql, Scon);
            //Scmd.CommandType = CommandType.Text;
            //SqlDataAdapter adp = new SqlDataAdapter(Scmd); // all data in adapter
            //Scon.Open();
            //adp.Fill(ds); //Adapter in dataset
            //GridView1.DataSource = ds; //dataset in gridview
            //GridView1.DataBind();

            //STEP TWO Make 2 datatables set them in one dataset
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            DataTable dt2 = new DataTable();

            string sql = "select SID1 as lblOne, Charge_Amount as lblTwo from [xxxx].[xxxx].[xxxx]";            
            SqlConnection Scon = new SqlConnection(ConfigurationManager.ConnectionStrings["testserver"].ConnectionString);
            SqlCommand Scmd = new SqlCommand(sql, Scon);
            Scmd.CommandType = CommandType.Text;
            SqlDataAdapter adp = new SqlDataAdapter(Scmd); // all data in adapter
            Scon.Open();
            adp.Fill(dt); //Adapter in dataset

            sql = "select Currency as lblThree from [xxx].[dbo].[tbl_xx_NI]";            
            Scmd = new SqlCommand(sql, Scon);
            Scmd.CommandType = CommandType.Text;
            adp = new SqlDataAdapter(Scmd); // all data in adapter
            adp.Fill(dt2); //Adapter in dataset

            ds.Tables.Add(dt); //add data table to data set
            ds.Tables.Add(dt2);

            GridView1.DataSource = ds; //dataset in gridview
            GridView1.DataBind(); // ERROR: A field or property with the name 'lblThree' was not found on the selected data source.

            Scon.Close();
        }
    }
}





    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TwoDatatableToDataset._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
                    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                    AutoGenerateDeleteButton="False" AutoGenerateEditButton="False">
                     <Columns>
                        <asp:BoundField DataField="lblOne" HeaderText="One" SortExpression="lblOne">
                            <ItemStyle Width="20%"/>
                        </asp:BoundField>
                        <asp:BoundField DataField="lblTwo" HeaderText="Two" SortExpression="lblTwo">
                            <ItemStyle Width="20%" />
                        </asp:BoundField>
                        <asp:BoundField DataField="lblThree" HeaderText="Three" SortExpression="lblThree">
                            <ItemStyle Width="20%" />
                        </asp:BoundField>   
                     </Columns>       
                </asp:GridView>    
    </div>
    </form>
</body>
</html>
使用系统;
使用系统集合;
使用系统配置;
使用系统数据;
使用System.Linq;
使用System.Web;
使用System.Web.Security;
使用System.Web.UI;
使用System.Web.UI.HTMLControl;
使用System.Web.UI.WebControl;
使用System.Web.UI.WebControl.WebParts;
使用System.Xml.Linq;
使用System.Data.SqlClient;
命名空间TwoDatatableToDataset
{
公共部分类\u默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
loadAll();
}
}
私有void loadAll()
{//第一步将一个sql输出放入一个空数据集中:(工作正常)
//数据集ds=新数据集();
//DataTable dt2=新的DataTable();
//string sql=“选择SID1作为lblOne,从[xxx].[xxxx].[xxxx]收取金额作为lblTwo”;
//SqlConnection Scon=新的SqlConnection(ConfigurationManager.ConnectionString[“testserver”].ConnectionString);
//SqlCommand Scmd=新的SqlCommand(sql,Scon);
//Scmd.CommandType=CommandType.Text;
//SqlDataAdapter adp=新的SqlDataAdapter(Scmd);//适配器中的所有数据
//Scon.Open();
//adp.Fill(ds);//数据集中的适配器
//GridView1.DataSource=ds;//gridview中的数据集
//GridView1.DataBind();
//第二步,在一个数据集中设置两个数据表
数据集ds=新数据集();
DataTable dt=新的DataTable();
DataTable dt2=新的DataTable();
string sql=“选择SID1作为lblOne,从[xxxx].[xxxx].[xxxx]收取金额作为lblTwo”;
SqlConnection Scon=新的SqlConnection(ConfigurationManager.ConnectionString[“testserver”].ConnectionString);
SqlCommand Scmd=新的SqlCommand(sql,Scon);
Scmd.CommandType=CommandType.Text;
SqlDataAdapter adp=新的SqlDataAdapter(Scmd);//适配器中的所有数据
Scon.Open();
adp.Fill(dt);//数据集中的适配器
sql=“从[xxx].[dbo].[tbl_xx_NI]中选择作为LBLTree的货币”;
Scmd=新的SqlCommand(sql,Scon);
Scmd.CommandType=CommandType.Text;
adp=新的SqlDataAdapter(Scmd);//适配器中的所有数据
adp.Fill(dt2);//数据集中的适配器
ds.Tables.Add(dt);//将数据表添加到数据集中
ds.Tables.Add(dt2);
GridView1.DataSource=ds;//gridview中的数据集
GridView1.DataBind();//错误:在所选数据源上找不到名为“lbltree”的字段或属性。
Scon.Close();
}
}
}
无标题页

您可以调用
Merge

DataTable dt1 = ds.Tables[0];
DataTable dt2 = ds.Tables[1];
dt1.Merge(dt2);

似乎这就是您想要绑定的表。无论如何,请尝试此操作并中断merge方法。跨过去看看dt1的样子。

您可以调用
Merge

DataTable dt1 = ds.Tables[0];
DataTable dt2 = ds.Tables[1];
dt1.Merge(dt2);

似乎这就是您想要绑定的表。无论如何,请尝试此操作并中断merge方法。跨过去看看dt1的样子。

也许您可以在sql命令中使用UNION,如下所示:

选择SID1作为lblOne,从[xxxx].[xxxx].[xxxx]收取作为lblTwo的金额 联合
从[xxxx].[dbo].[tbl\u xx\u NI]

选择货币作为LBLTree,您可以在sql命令中使用UNION,如下所示:

选择SID1作为lblOne,从[xxxx].[xxxx].[xxxx]收取作为lblTwo的金额 联合
从[xxxx].[dbo].[tbl\U xx\U NI]

中选择货币作为LBLTree,正确的解决方案取决于您尝试执行的操作。不过,您可能需要研究两个主要选项:

  • 以编程方式查询
    数据集
    ,并使用LINQ合并结果
  • 使用嵌套的
    GridView
    ListView
    生成预期的输出
  • 就个人而言,我会选择LINQ选项,但这取决于你。下面的文章应该能帮助你找到正确的方向


    正确的解决方案实际上取决于您要做什么。不过,您可能需要研究两个主要选项:

  • 以编程方式查询
    数据集
    ,并使用LINQ合并结果
  • 使用嵌套的
    GridView
    ListView
    生成预期的输出
  • 就个人而言,我会选择LINQ选项,但这取决于你。下面的文章应该能帮助你找到正确的方向


    或者,您不能使用查询中使用的过滤器在数据库中创建一个视图,以便它表示一个包含您需要的所有信息的数据集,以便您可以查询vie吗