Szintaktikai hiba az INSERT INTO utasításban.

Szintaktikai hiba az INSERT INTO utasításban.
2013-11-28T11:23:07+01:00
2013-12-01T01:38:45+01:00
2022-11-30T03:15:35+01:00
Wowbagger78
Sziasztok!

Van két táblám és az egyikből a másikba szeretném az adatokat átpumpálni (kiexportálni). Konkrét esetünkben ez egy SQL Server => MS ACCESS irányú export lenne.

Ezt a kódot hoztam össze:

private void btnExport_Click(object sender, EventArgs e) { //SQL kapcsolat SqlConnection conSql = new SqlConnection(connStrSql); conSql.Open(); SqlDataAdapter daSql = new SqlDataAdapter("select * from Orders", conSql); DataTable tblSql = new DataTable(); daSql.Fill(tblSql); //ACCESS kapcsolat OleDbConnection conAcc = new OleDbConnection(connStrAcc); conAcc.Open(); //Töröljük a rendeléseket OleDbCommand cmdAcc = new OleDbCommand("DELETE * FROM Rendelések", conAcc); cmdAcc.ExecuteNonQuery(); //Lekérjük a rendeléseket OleDbDataAdapter daAcc = new OleDbDataAdapter("select * from Rendelések", conAcc); OleDbCommandBuilder cbAcc = new OleDbCommandBuilder(daAcc); daAcc.DeleteCommand = cbAcc.GetDeleteCommand(); daAcc.InsertCommand = cbAcc.GetInsertCommand(); daAcc.UpdateCommand = cbAcc.GetUpdateCommand(); DataTable tblAcc = new DataTable(); daAcc.Fill(tblAcc); //Végigmegyünk a forráson és soronként hozzáadjuk az adatokat foreach (DataRow drw in tblSql.Rows) { DataRow NewData = tblAcc.NewRow(); NewData["Rendelés AZ"] = drw["OrderID"]; NewData["Vevő AZ"] = drw["CustomerID"]; NewData["Alkalmazott AZ"] = drw["EmployeeID"]; NewData["Címzett"] = drw["ShipName"]; NewData["Cím"] = drw["ShipAddress"]; NewData["Város"] = drw["ShipCity"]; NewData["Körzet"] = drw["ShipRegion"]; NewData["Irányítószám"] = drw["ShipPostalCode"]; NewData["Ország"] = drw["ShipCountry"]; NewData["Fuvarozó"] = drw["ShipVia"]; NewData["Rendelés dátuma"] = drw["OrderDate"]; NewData["Határidő"] = drw["RequiredDate"]; NewData["Szállítás dátuma"] = drw["ShippedDate"]; NewData["Szállítási költség"] = drw["Freight"]; tblAcc.Rows.Add(NewData); } daAcc.Update(tblAcc); //ITT HIBÁT DOB!!!! } }
A fenti kódot mikor futtatom akkor a daAcc.Update(tblAcc) sornál a következő hibát dobja:
Szintaktikai hiba az INSERT INTO utasításban.


Mi az amit benézek, de nagyon?

W.
Mutasd a teljes hozzászólást!
Keressél olyan metódust, amivel megtudod nézni, hogy néz ki az az INSERT utasítás, amit a program neked automágikusan előállított... (Off: Nyilván remek dolog, hogy egyik program írja a másik programot, csak éppen az nem látszik, hogy mi történik... pl hogy a szóközt tartalmazó mezőnév milyen gondot okoz),
Mutasd a teljes hozzászólást!

  • Bocsi, de tán egyszerűbben is megoldhatnád ezt a pumpálást.
    Pl. tárolt eljárással, ahol adottak az eszközök az átvitelhez.
    Linked server biztosítja a kapcsolatot, a pakolás pedig Insert vagy insert into-val egyszerűen megoldható.
    Using the Microsoft OLE DB Provider for Microsoft Access
    Mutasd a teljes hozzászólást!
  • Szia!

    Szeretném így megoldani, ha lehetséges.

    Ennek a feladatnak nem csak az lenne az értelme, hogy kirakom az SQL adatot Access-be, hanem hogy tudjam az adatokat tábla szintjén, soronként kezelni (szerkesztés, hozzáadás, törlés), mint az Access Recordset-jével.

    Ahogyan utánanéztem ez a megoldás közelíti meg legjobban a recordset jellegű adathozzáférést.

    Tehát kérdésem ismét: Miért dob hibát, mit rontok el?

    W.
    Mutasd a teljes hozzászólást!
  • Ahogyan utánanéztem ez a megoldás közelíti meg legjobban a recordset jellegű adathozzáférést.

    Bocsi, de tán tévedsz.
    Ha a C#-ból kívánod a rekordokat (sorokat) manipulálni, akkor szvsz a típusos dataset (+bindingsource) vagy linq használatával egyszerűbb megoldáshoz juthatsz.
    Felesleges néked command-okat gyártani, s bóklászni a kódrengetegben.
    Mutasd a teljes hozzászólást!
  • Vonatkoztassunk el attól, hogy az SQL serveres konkrét táblát pakolom át Access-be.

    Tekintsünk rá mint olyanra amit kódból szeretnék Row-onként feltölteni a fenti metódus szerint. Nem kerülő utat szeretnék, hanem a fenti metódust működve. Elvileg ennek működnie kell. Kérdés, hogy miért nem működik mégsem...

    Szóval mit szúrok el a fenti kódban? Mert, ha nem tévedek a fenti megközelítésnek jónak kellene lennie.

    W.
    Mutasd a teljes hozzászólást!
  • Szintaktikai hiba az INSERT INTO utasításban.

    Bocsi, de részletesebb hibalistát kaphatsz, ha használod a kivételkezelést.
    Tedd meg, s írd meg a részleteket.
    Mutasd a teljes hozzászólást!
  • Okosabbak nem lettünk, ugyanazt írja ki:)

    try { daAcc.Update(tblAcc); } catch (Exception ex) { MessageBox.Show(ex.Message); }

    Ez egy OleDBException. (lásd csatolt kép)

    A OleDbCommandBuilder által automatikusan legenerált commandok:

    DeleteCommand = "DELETE FROM Rendelések WHERE ((Rendelés AZ = ?) AND ((? = 1 AND Vevő AZ IS NULL) OR (Vevő AZ = ?)) AND ((? = 1 AND Alkalmazott AZ IS NULL) OR (Alkalmazott AZ = ?)) AND ((? = 1 AND Címzett IS NULL) OR (Címzett = ?)) AND ((? = 1 AND Cím IS NULL) OR (Cím = ?)) AND ((? = 1 AND Város IS NULL) OR (Város = ?)) AND ((? = 1 AND Körzet IS NULL) OR (Körzet = ?)) AND ((? = 1 AND Irányítószám IS NULL) OR (Irányítószám = ?)) AND ((? = 1 AND Ország IS NULL) OR (Ország = ?)) AND ((? = 1 AND Fuvarozó IS NULL) OR (Fuvarozó = ?)) AND ((? = 1 AND Rendelés dátuma IS NULL) OR (Rendelés dátuma = ?)) AND ((? = 1 AND Határidő IS NULL) OR (Határidő = ?)) AND ((? = 1 AND Szállítás dátuma IS NULL) OR (Szállítás dátuma = ?)) AND ((? = 1 AND Szállítási költség IS NULL) OR (Szállítási költség = ?)))"

    InsertCommand = "INSERT INTO Rendelések (Rendelés AZ, Vevő AZ, Alkalmazott AZ, Címzett, Cím, Város, Körzet, Irányítószám, Ország, Fuvarozó, Rendelés dátuma, Határidő, Szállítás dátuma, Szállítási költség) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

    UpdateCommand = "UPDATE Rendelések SET Rendelés AZ = ?, Vevő AZ = ?, Alkalmazott AZ = ?, Címzett = ?, Cím = ?, Város = ?, Körzet = ?, Irányítószám = ?, Ország = ?, Fuvarozó = ?, Rendelés dátuma = ?, Határidő = ?, Szállítás dátuma = ?, Szállítási költség = ? WHERE ((Rendelés AZ = ?) AND ((? = 1 AND Vevő AZ IS NULL) OR (Vevő AZ = ?)) AND ((? = 1 AND Alkalmazott AZ IS NULL) OR (Alkalmazott AZ = ?)) AND ((? = 1 AND Címzett IS NULL) OR (Címzett = ?)) AND ((? = 1 AND Cím IS NULL) OR (Cím = ?)) AND ((? = 1 AND Város IS NULL) OR (Város = ?)) AND ((? = 1 AND Körzet IS NULL) OR (Körzet = ?)) AND ((? = 1 AND Irányítószám IS NULL) OR (Irányítószám = ?)) AND ((? = 1 AND Ország IS NULL) OR (Ország = ?)) AND ((? = 1 AND Fuvarozó IS NULL) OR (Fuvarozó = ?)) AND ((? = 1 AND Rendelés dátuma IS NULL) OR (Rendelés dátuma = ?)) AND ((? = 1 AND Határidő IS NULL) OR (Határidő = ?)) AND ((? = 1 AND Szállítás dátuma IS NULL) OR (Szállítás dátuma = ?)) AND ((? = 1 AND Szállítási költség IS NULL) OR (Szállítási költség = ?)))"

    W.


    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Keressél olyan metódust, amivel megtudod nézni, hogy néz ki az az INSERT utasítás, amit a program neked automágikusan előállított... (Off: Nyilván remek dolog, hogy egyik program írja a másik programot, csak éppen az nem látszik, hogy mi történik... pl hogy a szóközt tartalmazó mezőnév milyen gondot okoz),
    Mutasd a teljes hozzászólást!
  • Most hogy nézem ezeket az automatikusan generált SQL kódokat a mezőneveket nem teszi [] jelek közé. Ez lehet a gond...

    Ennyire buta lenne a CommandBuilder...?

    Még masszirozm egy kicsit a kódot...

    W.
    Mutasd a teljes hozzászólást!
  • Okosabbak nem lettünk, ugyanazt írja ki:)

    Mert nem kattintottál a View Detail..-re
    Mutasd a teljes hozzászólást!
  • Itt is ugyanaz a probléma...

    És mintha megoldás is lenne...

    W.
    Mutasd a teljes hozzászólást!
  • Használd a (dataset) varázslót, s nem lesz gondod..
    Mutasd a teljes hozzászólást!
  • cbAcc.QuotePrefix = "[";
    cbAcc.QuoteSuffix = "]";
    Mutasd a teljes hozzászólást!
  • MŰKÖDIK:)

    cbAcc.QuotePrefix = "[";
    cbAcc.QuoteSuffix = "]";

    Ezek kellettek.

    Köszönöm a segítő szándékot mindenkinek.

    W.

    ui.: Amint látom NevemTeve is hasonlót javasolt mint amire én is rájöttem vele párhuzamosan. Mivel Ő adta meg elsőnek a választ (bár mikor rájöttem még nem olvastam azt) így őt illetné a pont, de már bepontoztam magam. Hogyan lehet visszavonatni?
    Mutasd a teljes hozzászólást!
  • Hogyan lehet visszavonatni?

    Kérd a moderator-t (kattints rá, s üzenj).
    nyitotta: Wowbagger78 , idő: 2013.11.28. 11:23 , moderátor: moderator , megoldás elfogadva: 2013.11.28. 12:35


    Bocsi, de továbbra is az a véleményem, hogy rossz irányba haladsz..
    Mutasd a teljes hozzászólást!
  • (Értékelem a jószándékot, de nincs rá szükség; fő, hogy működik.)
    Mutasd a teljes hozzászólást!
  • Korrigáltam az elfogadást.
    Mutasd a teljes hozzászólást!
  • Szia Riha!

    Most is, mint mindig megtisztelsz a válaszaiddal.

    Én is érzem, hogy jelen esetben OleDbCommand-al többre mennék, hisz ez csak új adat beszúrás (insert + Parameters). Részemről annyi lenne a feladat, hogy modellezzem valahogy az access recordset-jét.

    De, ha rossz irányba haladom akkor mutasd meg nekem az irányt.

    Válaszod megtisztel, mint mindig.

    Köszönöm iránymutatásod előre is:)

    W.




    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd