Szybkie dodawanie danych do bazy

0

Witam! Mam pewien problem z szybkim dodaniem wielu rekordów do bazy (plik .dbf).

Sytuacja wyglada tak, że mam obiekt DataTable i pustą bazę danych. Chcę wszystkie rekordy z DataTable dodać do bazy w możliwie krótkim czasie.

	
public void load(DataTable data)
{
    DataSet ds = new DataSet();

    string strAccessConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FolderPath + ";Extended Properties=dBASE IV;";
    string strAccessSelect = "SELECT * FROM " + TableName;

    OleDbConnection myAccessConn = null;
    try
    {
        myAccessConn = new OleDbConnection(strAccessConn);
    }
    catch (Exception e){throw;}
	
	OleDbDataAdapter myDataAdapter = null;
	OleDbTransaction myTransaction = null;
    try
	{
		OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);
		myDataAdapter = new OleDbDataAdapter(myAccessCommand);
		OleDbCommandBuilder custCB = new OleDbCommandBuilder(myDataAdapter);
		myDataAdapter.InsertCommand=custCB.GetInsertCommand();
		myDataAdapter.ContinueUpdateOnError=true;
		myAccessConn.Open();

		myDataAdapter.Fill(ds, TableName);
		ds.Merge(data);
		myTransaction = myAccessConn.BeginTransaction();
	  	myDataAdapter.InsertCommand.Transaction = myTransaction;		
		myDataAdapter.Update(ds, TableName);
		myTransaction.Commit();
	}
    catch (Exception ex){throw;}
    finally
    {
		myAccessConn.Close();
    }
}

Nie wiem dlaczego ale funkcja Update() trwa masakrycznie dużo czasu - dla 1 rekordu w tabeli to jest ok. 60 ms, dla 10 ok 600 ms.

Problem jest taki że docelowo ma być dodawane ponad 6000 rekordów, a w tym tempie to już kwestia minut.

Wiecie może dlaczego to działa tak wolno/ ew. jak to przyspieszyć?

0

zamiast adaptera wykonuj po prostu insert przez command
i zeby wszystkie te operacje byly na jendym connection (moze byc z transaction)

0

Sprawdzałem - nie ma to wpływu na prędkość wykonywania...

0

Odświeżam temat bo nie znalazłem jeszcze żadnego rozwiązania.

0

Ja swojego czasu uzywalem SQLBulkCopy, bardzo szybko wrzuca dane do tabeli:)

0
SQLbulkcopy napisał(a)

Ja swojego czasu uzywalem SQLBulkCopy, bardzo szybko wrzuca dane do tabeli:)

Ta... do DBase...

0

Znalazłem coś ciekawego:

Gdy ustawie wartość myDataAdapter.MissingMappingAction lub myDataAdapter.MissingSchemaAction na Error otrzymuje wyjątek.

Obstawiam zatem że problem jest z mapowaniem dataTable do bazy.

Tabela z danymi nie zawiera kolumn których nie ma w bazie - sprawdzam to wcześniej.
Jeśli chodzi o kolumny których w tabeli nie ma w bazie to myślałem że sprawę rozwiązuje Merge.

Nazwy danych w tabei i w bazie są odpowiadające więc nie sądziłem że będzie mi sie pojawiał jakiś wyjątek.

Przy ustawieniu MissingMappingAction na Error i wywołaniu Fill mam błąd: "Brak mapowania elementu SourceTable: 'ETYKIETY2'"

Przy MissingSchemaAction = Error w tym samym miejscu występuje "Brak elementu DataTable 'ETYKIETY2' dla elementu SourceTable 'ETYKIETY2'."

Dla MissingSchemaAction ustawionego na Ignore program nie dodaje żadnego wiersza do bazy.

może ktoś mi pomóc skonfigurować mapowanie?
Zarówno ścieżka, nazwa tabeli, nazwy kolumn i ich typ jest definiowany podczas działania programu (na podstawie pliku zewnętrznego).

1 użytkowników online, w tym zalogowanych: 0, gości: 1