gpt4 book ai didi

c# - 使用 SQL 具有不同日期的复合条目

转载 作者:搜寻专家 更新时间:2023-10-30 21:37:00 26 4
gpt4 key购买 nike

我必须将一个大文本文件中的历史关税数据读入数据库,但数据有点乱。

关税由类型措施(实际费率和生效日期)组成

类型由类型代码和描述定义。措施包含费率、适用的地理区域、费率以及开始日期和结束日期。

问题是同一关税有多个条目且生效日期不同,需要合并为一个条目。

文本文件看起来像这样:

(TypeCode, Area, Rate, StartDate, EndDate, Description)
1: 01021000#GEN #FREE #20050101#20061231#纯种繁殖动物#
2: 01021000#GEN #FREE #20070101#20071231#纯种动物#
3: 01021000#GEN #FREE #20080101#99999999#纯种动物#
4: 01029000#GEN #00000040.000% #20050101#20061231#OTHER #
5: 01029000#GEN #00000040.000% #20070101#20071231#OTHER #
6: 01029000#GEN #00000030.000% #20080101#20091231#OTHER #
7: 01029000#EU #00000030.000% #20070101#20071231#OTHER #

在这个例子中:

  • 1、2、3需要复合与第一个小节合二为一开始日期和最后结束日期(01021000#GEN #FREE#20050101#99999999#纯种动物#)
  • 4、5需要合二为一用第一个开始日期衡量和最后结束日期(01029000#GEN#00000040.000% #20050101#20071231#OTHER #)
  • 6 必须分开,因为它有一个不同的比率
  • 7 必须分开,因为它是来自不同的地理区域

我正在使用 C# 和 Sql Compact Edition。我大部分时间都在使用它,但它非常慢......目前必须有一种更有效的方法来执行此操作,在我的 Intel i3 笔记本电脑上需要大约 40 分钟(66000 个条目)

我已经写下了我的步骤并给出了复合部分的代码。我还需要检查日期是否为后续日期。

步骤:
逐行读取文本文件
将行拆分为标记
将唯一的类型代码及其描述插入类型
使用以下代码将值插入 Measure 表:

// check to see if a measure with the same typecode, area and rate has already been inserted
String select = string.Format("SELECT TypeCode FROM Measure WHERE TypeCode = '{0}' AND AreaCode = '{1}' AND Rate = '{2}'", tokens[1], tokens[3], tokens[4]);//string.Format("SELECT TypeCode FROM Measure WHERE TypeCode = '{0}'", tokens[1]);
SqlCeDataAdapter adapter = new SqlCeDataAdapter(select, con);
DataTable table = new DataTable(); // Use DataAdapter to fill DataTable
adapter.Fill(table);

// if there are no similar records insert this one
if (table.Rows.Count <= 0)
{
string insert = "INSERT INTO Measure VALUES (@TypeCode, @UOM, @AreaCode, @Rate, @StartDate, @EndDate)";
SqlCeCommand com = new SqlCeCommand(insert, con);

com.Parameters.AddWithValue("@TypeCode", tokens[1]);
com.Parameters.AddWithValue("@UOM", tokens[2]);
com.Parameters.AddWithValue("@AreaCode", tokens[3]);
com.Parameters.AddWithValue("@Rate", tokens[4]);
com.Parameters.AddWithValue("@StartDate", tokens[5]);
com.Parameters.AddWithValue("@EndDate", tokens[6]);

com.ExecuteNonQuery();
}
else
{
// update the current record with the new enddate
string update = "UPDATE Measure SET EndDate = @EndDate WHERE TypeCode = @TypeCode AND AreaCode = @AreaCode AND Rate = @Rate";
SqlCeCommand com = new SqlCeCommand(update, con);

com.Parameters.AddWithValue("@EndDate", tokens[6]);
com.Parameters.AddWithValue("@TypeCode", tokens[1]);
com.Parameters.AddWithValue("@AreaCode", tokens[3]);
com.Parameters.AddWithValue("@Rate", tokens[4]);

com.ExecuteNonQuery();
}

如有任何帮助或建议,我们将不胜感激!

最佳答案

如果您使用的是 SQL Server 2008 CE,则可以使用 MERGE 语句仅遍历表一次 (http://blog.sqlauthority.com/2008/08/28/sql-server-2008-introduction -to-merge-statement-one-statement-for-insert-update-delete/)。您可能还想为 TypeCode、AreaCode 和 Rate 上的 Measures 创建索引以加快该过程。

关于c# - 使用 SQL 具有不同日期的复合条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4945017/

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