Как улучшить - Несколько вставок с разными идентификаторами, используя несколько OledbConnections - PullRequest
0 голосов
/ 17 января 2020

В настоящее время система создает кратные OledbConnections, и процесс занимает много времени, чтобы завершить sh, это подводит итог этому:

C# код:

  1. Выберите всех людей из таблицы A.
  2. ДЛЯ КАЖДОГО человека: ВЫБЕРИТЕ, чтобы увидеть, существует ли идентификатор «x» из таблицы A в таблице B.
  3. ДЛЯ КАЖДОГО человека: ВСТАВЬТЕ идентификатор из таблица A или новый идентификатор (если этот идентификатор уже существует в таблице B)

Все эти INSERTS создают новое OledbConnection для каждого человека, и, например, для 3k человек, это занимает слишком много времени.

Было бы проще, если бы мне не приходилось иметь дело с идентификаторами, но я не нахожу хорошего способа сделать это с помощью VFP.

- это способ массовой вставки этого или улучшить производительность?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Я не понимаю, зачем вам нужно использовать несколько OleDbConnections для этого. Одно соединение может сделать:

string sql = @"insert into tableB (id, f1, f2, f3)
select getNextId('tableB'), f1, f2, f3
from tableA
where exists (select * from tableA where tableA.id = tableB.id)";

using (OleDbConnection cn = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:\MyDataFolder"))
using (OleDbCommand cmd = new OleDbCommand(sql, cn))
{
  cn.Open();
  cmd.ExecuteNonQuery();
  cmd.CommandText = @"insert into tableB (id, f1, f2, f3)
select id, f1, f2, f3
from tableA
where not exists (select * from tableA where tableA.id = tableB.id)";
  cmd.ExecuteNonQuery();
  cn.Close();
}

Используемые SQL могут быть неправильными, потому что из вашего определения не ясно, что вы действительно пытаетесь сделать.

И кстати, вы не говорят о версии, если таблицы Foxpro означают таблицы VFP, тогда в поле autoin c int есть (но необязательно, вы всегда можете иметь собственную функцию getNextId, как в примере).

0 голосов
/ 17 января 2020

, если идентификатор в таблице2 имеет автонумерацию:

if exists(select * from table2 where id = idtable1)

    insert into table2(field1,field2...

else

    insert into table2(ID,field1,field2...
...