【发布时间】:2018-05-16 06:32:02
【问题描述】:
我有这个代码:
private void button1_Click(object sender, EventArgs e)
{
foreach(Int_String partner in partneri)
{
double danaBezProdaje = (DateTime.Today - Komercijalno.Partner.PoslednjaKupovina(partner._int)).TotalDays;
if (danaBezProdaje > 31 && danaBezProdaje < 1100)
{
NeaktivniPartner np = new NeaktivniPartner();
np.ppid = partner._int;
np.naziv = partner._string;
np.danaBezKupovine = danaBezProdaje;
neaktivniPartneri.Add(np);
}
}
dataGridView1.DataSource = M.List.ConvertToDataTable(neaktivniPartneri);
}
所以在这里我有List<Int_String> partneri,其中包含 5k 行。对于其中的每一个,我运行Komercijalno.Partner.PoslednjaKupovina(partner._int),其中包含如下所示的 SQL 语句:
public static DateTime PoslednjaKupovina(int ppid)
{
using (FbConnection con = new FbConnection(M.Baza.connectionKomercijalno2018))
{
con.Open();
using (FbCommand cmd = new FbCommand("SELECT DATUM FROM DOKUMENT WHERE PPID = @PPID ORDER BY DATUM DESC", con))
{
cmd.Parameters.AddWithValue("@PPID", ppid);
FbDataReader dr = cmd.ExecuteReader();
if (dr.Read())
return Convert.ToDateTime(dr[0]);
else
return new DateTime(1, 1, 1);
}
}
}
所以 SQL 语句执行了 5k 次,太慢了。
那么我如何将我的List<Int_String> 或只是整数数组传递给 sql 命令,以便我执行一次(在 foreach 内或其他方式)并返回dataAdapter,所以我只执行一次 SQL。
返回的 DataAdapter 应如下所示:
| ppid | datum |
假设我有表PARTNER(我用SELECT PPID, NAZIV FROM PARTNER填充列表partneri),其中包含以下数据:
| PPID | NAZIV |
| 1 | name001 |
| 2 | name002 |
| 3 | name003 |
| 4 | name004 |
假设我的 DOKUMENT 表有这些数据:
| ID | PPID | DATE |
| 1 | 2 | 12.03.2018 |
| 2 | 3 | 12.03.2018 |
| 3 | 2 | 05.03.2018 |
| 4 | 2 | 03.04.2018 |
| 5 | 1 | 26.03.2018 |
| 6 | 4 | 21.02.2018 |
| 7 | 4 | 06.05.2018 |
我想要的输出是:
| PPID | DATE |
| 1 | 26.03.2018 |
| 2 | 03.04.2018 |
| 3 | 12.03.2018 |
| 4 | 06.05.2018 |
【问题讨论】:
-
加入
idsby,并在 where 子句中使用in。 -
我应该如何将它传递给命令?
-
不是一个好方法@Aria。参数字符串可能会在极限处出错,这样会导致性能不佳..
-
@HüseyinBurakKaradag,我认为限制超过了
5k,但我不知道确切的限制,但它可以分隔in的块? -
@AleksaRistic 您在哪里填写“合作伙伴”数据?如果您在 DB 上获取数据,为什么要使用联接 DOKUMENT 表?如果您的答案是否定的,我的解决方案是,使用“批量插入”方法将 ids 数据插入会话临时表中,并将其与文档表连接。这要快得多