Kopírovaní databází   otázka

VB.NET

Dobrý den!

Obracím se na Vás s problémem kopírování tabulky z databáze do jiné. Do tabulky (typu dataTable) načítam některé stĺpce z Oraclovské databáze na serveru pomocí ODBC. Tuto tabulku chci uložit do MDB souboru, kde již mám předdefinovanou tabulky s rovnakým počtem stloupců a taky s rovnakými jmény. Ukládám pomocí OleDB, vytvořením dataAdapteru a commandBuilderu.

comBuilder mi vytvoří příkazy ale do MDB se nic neuloží. V MDB souboru je zadef. primární klíč jako číslo (ne auto). Je potřebné zadef. prim klíč aj samotné tabulce nebo ´je potřebná nejaká konverze tabulky?

    Sub Write_to_MDB(ByVal dtPom As DataTable, ByVal strTabName As String)

        Dim OleDbCon As New OleDbConnection
        Dim da As New OleDbDataAdapter
        Dim cmdBuilder As New OleDbCommandBuilder
        Dim strQuery As String = "SELECT * FROM " & strTabName ' TABULKA
        Dim strPOM As String = ""


        OleDbCon = New OleDbConnection(CONST_strMDB)
        da.SelectCommand = New OleDbCommand(strQuery, OleDbCon)
        cmdBuilder = New OleDbCommandBuilder(da)
        da.InsertCommand = cmdBuilder.GetInsertCommand()
        da.DeleteCommand = cmdBuilder.GetDeleteCommand()
        da.UpdateCommand = cmdBuilder.GetUpdateCommand()

        Try
            da.Update(dtPom)
            dtPom.AcceptChanges()

        Catch ex As Exception
            MsgBox(ex.Message)
            OleDbCon.Close()
        End Try
    End Sub

Ďěkuji!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V MDB souboru je zadef. primární klíč jako číslo (ne auto).

Pokud tam máte nadefinovaný primární klíč jako číslo a není automatické (tzn. nedoplňuje se automaticky), musíte samozřejmě toto číslo vložit sám a bez duplicit. Co vám to teď dělá? Pokud se pokoušíte vložit záznam bez primárního klíče do tabulky kde je nadefinovaný, měla by vyskočit chyba kde bude něco ve smyslu že ve sloupci který je nastaven jako primary key nesmí být hodnota null.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Z Oraclovske databaze načtu 5 stloupců , první z nich obsahuje identifikační čísla, která zároveň slouží jako primární klíč (jde o 4 místní číslo které nemusí narůstat o rovnakou hodnotu). Tato číslo pro primární klíč jsou jedinečná. Pro pokus jsem si do programu doplnil datagridview a zjistil jsem že kdyš nezadám do stloupce s prim klíčem číslo objeví se chyba jak jste předpokládál" Požadované změny tabulky nebyly úspěšné, protože by vytvořily duplicitní hodnoty v indexu, primárním klíči nebo relaci. Změňte hodnoty v polích obsahující duplicitní údaje nebo odstraňte či znovu nadefinujte index tak, aby mohl obsahovat duplicitní hodnoty, a poté operaci opakujte." Zjistil jsem ovšem, že kdyš cez datagrid doplním nový záznam se vším tak jse mi uloží do mdb, ale pouze tento ručne přidaný řádek.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A kde je tedy problém? Tipuji že pouze při vkládání (insert). Pokud vložíte do sloupce který je v mdb nadefinovaný jako PK hodnoty z toho prvního načteného sloupce kde má Oracle PK tak to taky neprojde? Pokud ne tak chyba bude zřejmě někde jinde. To že číslo nenarůstá o stejnou hodnotu je uplně jedno. Ve sloupci který je PK mohou být libovolná čísla, jen musí být unikátní.

Abych pravdu řekl, tak automaticky vygenerované dotazy nepoužívám, raději si je napíšu ručně, mám pak jistotu že query builder něco blbě nepochopil a nenasekal v dotazu nějáké chyby. Můžete sem hodit onen vygenerovaný dotaz (insert) ? Podle toho co píšete bych nejspíš hledal chybu tam.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Problém je, že kdyš načtu data z Ora (do dtPOM)tak jse mi tyto data neuloží do mdb. Uloží se jenom to co vložím cez datagrid do načtené dtPom. Vygenerovaný Insert je: "INSERT INTO TABULKA (IDDEF, JMENO, ZKRATKA, TYP, BLOK) VALUES (?, ?, ?, ?, ?)"

Chtěl jsem využít automatické generování protože chci mít jednu funkci pro zápis do různych tabulek s různym počtem sloupců v jednom mdb.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud na mdb soubor pošlete dotaz:

"INSERT INTO TABULKA (IDDEF, JMENO, ZKRATKA, TYP, BLOK)

VALUES (1, 'jmeno01', 'zkratka01', 'typ01', 'blok01')"

přičemž předpokládám že ve sloupci IDDEF hodnota 1 nikde v tabulce zatím vložená není a že se jedná o číselný datový typ (a u všech ostatních sloupců je datový typ pro text) tak to udělá co? Záznam se vloží, nebo vyskočí nějáká hláška?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak už vím. Po načtení tabulky nebyly udělané žádné změny proto byl parametr RowState nastavený na unchanged i když sem chtěl tabulku uložit na jiné místo. Proto sem každému řádku před uložením změnil RowState na Added.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback