Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中连接数据表#_C#_.net_Datatable - Fatal编程技术网

C# 在C中连接数据表#

C# 在C中连接数据表#,c#,.net,datatable,C#,.net,Datatable,我对C#和.net还不熟悉。这是我的问题 我有两个数据表,每个数据表只有一列 dtTab1 - col1 a c dtTab2 - col2 p q 现在我想把它们合并到一个结果表中,这个结果表应该是这样的 dtResult - col1 col2 a p c q 我试

我对C#和.net还不熟悉。这是我的问题

我有两个数据表,每个数据表只有一列

dtTab1 - 
          col1 
           a    
           c    

dtTab2 - 
          col2
           p
           q
现在我想把它们合并到一个结果表中,这个结果表应该是这样的

dtResult - col1 col2 
           a    p    
           c    q    
我试过了

dtResult.Merge(dtTab1, false, MissingSchemaAction.Ignore);
dtResult.Merge(dtTab2, false, MissingSchemaAction.Ignore);
但出于某种原因,它会创建4行而不是两行

请帮忙


感谢表之间没有定义任何关系,因此
合并
只需将它们合并即可

您可以手动添加它们:

DataTable dtResult = new DataTable();
foreach (DataColumn col in dtTab1.Columns)
    dtResult.Columns.Add(col.ColumnName, col.DataType);
foreach (DataColumn col in dtTab2.Columns)
    dtResult.Columns.Add(col.ColumnName, col.DataType);

for (int r = 0; r < Math.Min(dtTab1.Rows.Count, dtTab2.Rows.Count); r++)
{
    DataRow r1 = dtTab1.Rows[r];
    DataRow r2 = dtTab2.Rows[r];
    DataRow row = dtResult.Rows.Add();
    foreach (DataColumn col in dtTab1.Columns)
        row.SetField(col.ColumnName, r1[col]);
    foreach (DataColumn col in dtTab2.Columns)
        row.SetField(col.ColumnName, r2[col]);
}
DataTable dtResult=newdatatable();
foreach(dtTab1.Columns中的数据列col)
dtResult.Columns.Add(col.ColumnName,col.DataType);
foreach(dtTab2.Columns中的数据列col)
dtResult.Columns.Add(col.ColumnName,col.DataType);
for(int r=0;r
表之间没有关系,但可以基于索引将它们连接起来

试试看:

DataTable dt1 = new DataTable();
DataColumn dc = new DataColumn("col1", Type.GetType("System.String"));
dt1.Columns.Add(dc);
dt1.Rows.Add(new Object[]{"a"});    
dt1.Rows.Add(new Object[]{"c"});

DataTable dt2 = new DataTable();
dc = new DataColumn("col2", Type.GetType("System.String"));
dt2.Columns.Add(dc);
dt2.Rows.Add(new Object[]{"p"});    
dt2.Rows.Add(new Object[]{"q"});

DataTable dtResult = new DataTable();
dc = new DataColumn("index", Type.GetType("System.Int32"));
dtResult.Columns.Add(dc);
dc = new DataColumn("col1", Type.GetType("System.String"));
dtResult.Columns.Add(dc);
dc = new DataColumn("col2", Type.GetType("System.String"));
dtResult.Columns.Add(dc);

var dtRows = from r1 in dt1.AsEnumerable().Select((x,y)=>new{col1 = x.Field<string>("col1"), index = y})
        join r2 in dt2.AsEnumerable().Select((x,y)=>new{col2 = x.Field<string>("col2"), index = y}) on r1.index equals r2.index
        select dtResult.LoadDataRow(new Object[]{r1.index, r1.col1, r2.col2}, true);
dtRows.CopyToDataTable();
dtResult.Dump();

这里有一个更紧凑(更简单)的版本,可以满足您的需求

        DataTable result = new DataTable();
        result.Columns.Add("col1", typeof(object));
        result.Columns.Add("col2", typeof(object));

        // assuming both data tables have the same length
        for (int row = 0; row < dtTab1.Rows.Count; row++)
        {
            DataRow dr;
            dr = result.NewRow();
            dr[0] = dtTab1.Rows[row][0];
            dr[1] = dtTab2.Rows[row][0];
            result.Rows.Add(dr);
        }

谢谢大家的帮助。蒂姆的解决方案让我最接近答案,但以下是我最终设法解决的方法

    DataTable dtResult = new DataTable();
    DataColumn col = null;
    string ColName = string.Empty;
    int i;
    int ColCnt = 1;

    dtResult.Clear();
    dtResult.Columns.Clear();

    for (i = 0; i < dtTab1.Columns.Count; i++)
    {
        ColName = dtTab1.Columns[i].ColumnName;
        col = new DataColumn(ColName);
        col.DataType = System.Type.GetType("System.String");
        dtResult.Columns.Add(col);
        ColCnt++;
    }

    for (i = 0; i < dtTab2.Columns.Count; i++)
    {
        ColName = dtTab2.Columns[i].ColumnName;
        col = new DataColumn(ColName);
        col.DataType = System.Type.GetType("System.String");
        dtResult.Columns.Add(col);
        ColCnt++;
    }


        object[] elems = new object[dtTab1.Columns.Count + dtTab2.Columns.Count];

        for (int r = 0; r < Math.Min(dtTab1.Rows.Count, dtTab2.Rows.Count); r++)
        {
            DataRow r1 = dtTab1.Rows[r];
            DataRow r2 = dtTab2.Rows[r];
            DataRow row ;

            int q = 0;
            for (; q < dtTab1.Columns.Count; q++)

                elems[q] = r1.ItemArray[q];


            int z = 0;
            for (; z < dtTab2.Columns.Count; z++)

                elems[q + z] = r2.ItemArray[z];


            row = dtResult.NewRow();
            row.ItemArray = elems;
            dtResult.Rows.Add(row);
        }

您确定要在应用程序代码中而不是在填充表的数据库命令中执行此操作吗?我看到这种简单方法的一个问题是,您没有告诉应用程序如何关联dtTab1和dtTab2中的值。您说“将这些表放在一起”,在您的脑海中,很明显您希望dtResult中的第一行包含两列,col1和col2,使用dtTab1中第一行的col1值和dtTab2中第一行的col2值,但是尽管这对您来说很明显,您必须为应用程序定义所有这些关系和规则。谢谢Mason,不幸的是,由于项目的性质,我必须在应用程序代码中这样做。谢谢Francine,您是对的。因为我不熟悉语法,所以在表达代码时遇到了麻烦。如果可能的话,你能提供一个样品吗?对我来说,先将数据存储在二维数组中,然后为结果表创建行是否有意义?很好。如果需要,可以使用
dtResult=dtTab1.Copy()
缩短代码。然后,您只需添加
dtTab2
中的列和数据@Heinzi:并不是很短,所以我希望两个表之间保持一致以避免混淆。您确定在目标表中获得了正确的数据类型吗?使用以下命令:col.DataType=dtTab1.Columns[i].DataType;(而不是col.DataType=System.Type.GetType(“System.String”);)谢谢Francine,你是对的,我应该使用你的方法。对于本例,我知道数据类型是什么,但接下来我应该按照您的建议执行。
result.Columns.Add(new DataColumn("col2", Type.GetType("System.String")));
    DataTable dtResult = new DataTable();
    DataColumn col = null;
    string ColName = string.Empty;
    int i;
    int ColCnt = 1;

    dtResult.Clear();
    dtResult.Columns.Clear();

    for (i = 0; i < dtTab1.Columns.Count; i++)
    {
        ColName = dtTab1.Columns[i].ColumnName;
        col = new DataColumn(ColName);
        col.DataType = System.Type.GetType("System.String");
        dtResult.Columns.Add(col);
        ColCnt++;
    }

    for (i = 0; i < dtTab2.Columns.Count; i++)
    {
        ColName = dtTab2.Columns[i].ColumnName;
        col = new DataColumn(ColName);
        col.DataType = System.Type.GetType("System.String");
        dtResult.Columns.Add(col);
        ColCnt++;
    }


        object[] elems = new object[dtTab1.Columns.Count + dtTab2.Columns.Count];

        for (int r = 0; r < Math.Min(dtTab1.Rows.Count, dtTab2.Rows.Count); r++)
        {
            DataRow r1 = dtTab1.Rows[r];
            DataRow r2 = dtTab2.Rows[r];
            DataRow row ;

            int q = 0;
            for (; q < dtTab1.Columns.Count; q++)

                elems[q] = r1.ItemArray[q];


            int z = 0;
            for (; z < dtTab2.Columns.Count; z++)

                elems[q + z] = r2.ItemArray[z];


            row = dtResult.NewRow();
            row.ItemArray = elems;
            dtResult.Rows.Add(row);
        }
row.SetField(col.ColumnName, r1[col]);