gpt4 book ai didi

c# - 在特定条件下从两个数据表中构建一个

转载 作者:行者123 更新时间:2023-12-03 14:40:49 24 4
gpt4 key购买 nike

首先,我需要从 ODBC 获取所有数据(这已经在工作了)。

然后是最复杂的部分,我还不确定如何完成。
ODBC 中有两个数据表。我正在将它们与我当前的代码合并并使用某些参数过滤它们。

数据库中的表1:

NRO   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
123 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1

数据库中的表2:
NRO   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
463 BMW E64 SE0 JR KE OT PG OL J8 9 1

合并后的数据表如下所示:
NRO   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
463 BMW E64 SE0 JR KE OT PG OL J8 9 1
123 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1

但是合并的输出数据表应该是这样的(有可能进一步使用它):
NRO  NRO1   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
123 423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 463 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1

NAME 中查找重复项.只留下其中一个,从表 1 中分配一个数字给 NRO从表 2 到 NRO1 .表 1 数字应在 NRO 中, 表 2 编号应在 NRO1 .

连接到 ODBC 后,我正在用表 1 中的数据填充一张表
        DataTable dataTable = new DataTable("COMPANY");

using (OdbcConnection dbConnectionSE = new OdbcConnection(connectionStringSE))
{
dbConnectionSE.Open();
OdbcDataAdapter dadapterSE = new OdbcDataAdapter();
dadapterSE.SelectCommand = new OdbcCommand(queryStringSE, dbConnectionSE);

dadapterSE.Fill(dataTable);

}

然后我从另一个表 2 中获取数据并通过以下方式合并它们:
         using (OdbcConnection dbConnectionFI = new OdbcConnection(connectionStringFI))
{
dbConnectionFI.Open();
OdbcDataAdapter dadapterFI = new OdbcDataAdapter();
dadapterFI.SelectCommand = new OdbcCommand(queryStringFI, dbConnectionFI);

var newTable = new DataTable("COMPANY");
dadapterFI.Fill(newTable);

dataTable.Merge(newTable);
}

之后我正在执行过滤(我需要在 NRO 中只有以 4 和 1 开头的行,还有其他起始编号的行):
DataTable results = dataTable.Select("ACTIVE = '1' AND (NRO Like '1%' OR NRO Like '4%')").CopyToDataTable();

然后我再为 NRO1 添加一列(这也是添加零 (0) 我在列 NRO1 中不需要它们):
        results.Columns.Add("NRO1", typeof(int)).SetOrdinal(1);

foreach (DataRow row in results.Rows)
{
//need to set value to NewColumn column
row["NRO1"] = 0; // or set it to some other value
}

我可以使用此代码捕获重复项
var duplicates = results.AsEnumerable().GroupBy(r => r[2]).Where(gr => gr.Count() > 1);

但如何执行其余的?这应该通过构建新表的循环来执行吗?我如何执行加入和删除重复项 dataTable ?

最佳答案

您可以更换 merge()使用自定义方法调用,该方法同时进行合并和过滤。请参阅下面的示例。我认为这是比先合并(在结果表中引入重复行)然后过滤(即删除重复行)更好的方法。

这里,假设参数都具有相同的格式。 tTemp table用作临时存储表t2的内容但是有额外的列。这允许导入结果表中的行。

也许有一个更优雅的解决方案,但这应该按预期工作。请注意,我忽略了您对 NRO 的允许值的额外要求。 ,我相信您可以轻松添加。

static void merge_it(DataTable t1, DataTable t2, DataTable tResult, DataTable tTemp)
{
tResult.Merge(t1);
tResult.Columns.Add("NRO1", typeof(int));

tTemp.Merge(t2);
tTemp.Columns.Add("NRO1", typeof(int));

foreach (DataRow row in tTemp.Rows)
{
string name1 = row.Field<string>("NAME");
string name2 = row.Field<string>("NAMEA");
DataRow[] matches = tResult.Select($"NAME = '{name1}' AND NAMEA = '{name2}'");
if (matches.Length > 0)
{
matches[0].SetField<int>("NRO1", row.Field<int>("NRO"));
}
else
{
tResult.ImportRow(row);
}
}

foreach (DataRow row in tResult.Rows)
{
if (row["NRO1"] == DBNull.Value)
{
row["NRO1"] = 0;
}
}
}

关于c# - 在特定条件下从两个数据表中构建一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60799236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com