Kopiowanie danych pomiędzy bazami¶
W celu ułatwienia przenoszenia danych pomiędzy bazami została stworzona metoda DB.CopyTable, która pozwala skopiować dane ze źródłowej tabeli w źródłowej bazie danych i wstawić je do (być może innej) tabeli w bazie docelowej. Metoda ta działa obsługuje na razie bazy danych Firebird i Microsoft SQL Server. Dane mogą być przenoszone w dowolnym kierunku (dozwolone jest przenoszenie Fb->Fb, MsSql->MsSql, Fb->MsSql i MsSql->Fb). Bazy te muszą być zarejestrowane w pliku smd pod odpowiednimi aliasami. Tabela docelowa musi zostać utworzona, przed wywołaniem metody i użytkownik bazodanowy musi mieć prawo do zapisu do niej. Przykładowe wywołanie kopiujące zawartość pewnych pól tabeli Inventory w bazie MsSql do odpowiedniej tabeli docelowej w Firebirdzie.
Struktura tabeli źródłowej
CREATE TABLE [dbo].[INVENTORY](
[ID] [int] IDENTITY(1,1) NOT NULL,
[PARENT] [int] NULL,
[CATEGORY] [smallint] NOT NULL,
[NAME] [nvarchar](256) NOT NULL,
[DESCRIPT] [nvarchar](4000) NULL,
[ACTIVE] [smallint] NOT NULL,
[FOROFFER] [smallint] NOT NULL,
[FORSALE] [smallint] NOT NULL,
...
[BASEPRICENET] [numeric](14, 4) NULL,
[CENAZAKUPU] [numeric](14, 4) NULL,
[MARZA] [numeric](14, 4) NULL,
[COLOR] [nvarchar](255) NULL,
CONSTRAINT [PK_INVENTORY] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Struktura tabeli docelowej
CREATE TABLE INVENTORY_PR82545 (
ID INTEGER NOT NULL,
PARENT INTEGER,
CATEGORY SMALLINT,
NAME STRING /* STRING = VARCHAR(255) DEFAULT '' */,
DESCRIPT STRING5000 /* STRING5000 = VARCHAR(5000) */,
LASTMODIFY TIMESTAMP,
BASEPRICENET MONEY /* MONEY = NUMERIC(14,2) */,
CENAZAKUPU MONEY /* MONEY = NUMERIC(14,2) */
);
ALTER TABLE INVENTORY_PR82545 ADD CONSTRAINT INVENTORY_PR82545 PRIMARY KEY (ID);
GRANT SELECT, INSERT, UPDATE, DELETE ON INVENTORY_PR82545 TO SENTE;
Wywołanie metody:
var res = DB.CopyTable("","INVENTORY_PR82545","ID,PARENT,CATEGORY,NAME,DESCRIPT,LASTMODIFY,BASEPRICENET,CENAZAKUPU","inventory",
"select ID,PARENT,CATEGORY,NAME,DESCRIPT,LASTMODIFY,BASEPRICENET,CENAZAKUPU from inventory");
Parametry wejściowe do procedury są intuicyjne:
- najpierw podajemy dane tabeli docelowej
- alias bazy danych (pusty oznacza bazę domyślną)
- nazwę tabeli do której będziemy wstawiać dane
- listę pól tej tabeli które będziemy wypełniać
- następnie podajemy dane zapytania z bazy źródłowej
- alias źródłowej bazy danych
- treść zapytania SQL służącego do ekstrakcji danych. UWAGA, nazwy pól wynikowych zapytania muszą się zgadzać z nazwami pól zadeklarowanymi w odpowiednim parametrze dla tabeli docelowej!. Możesz w tym celu użyć aliasów dla pól
W rezultacie otrzymasz ciąg znaków zawierający wszystkie błędy które wystąpiły przy kopiowaniu, jeżeli jest pusty to kopiowanie przebiegło bez błędów. Wywołanie metody jest blokujące. Transfer danych odbywa się paczkami po 100 rekordów, stąd jeżeli wystąpił błąd dla jednego rekordu w paczce, 100 rekordów nie zostanie przeniesionych. Obsługiwane są podstawowe typy danych:
- Łańcuchy
VARCHAR/NVARCHAR - Liczby całkowite typu
INTEGER/SMALLINT - Liczby zmiennoprzecinkowe typu
NUMERIC/DECIMAL(a nieDOUBLEiFLOAT!) - Daty
TIMESTAMP/DATETIME
Note
Aby zobaczyć podpowiadanie dla tej metody zaznacz we właściwościach metody używanie API DB