Błąd składniowy w instrukcji insert into.

0

Męczę się już kilka godzin, po wielu zmianach wyskakiwały różne błędy, w tym momencie, jak w temacie, stanąłem na błędzie składniowym, którego nigdzie nie widzę. Proszę o pomoc.

    private void buttonDodajKlient_Click(object sender, EventArgs e)
    {
        string łańcuchPołączenia = @"Provider=Microsoft.JET.OLEDB.4.0;data source=" + _path;
        OleDbConnection łączeOle = new OleDbConnection(łańcuchPołączenia);
        łączeOle.Open();

        DodanieKlienta(łączeOle);
        OdświeżenieZawartościGridu(łączeOle);

        łączeOle.Close();
    }
    private void DodanieKlienta(OleDbConnection łączeOle)
    {
        
        DataTable dopisywanyZestawDanych = new DataTable();  // tu można użyć DataSet7
        string kwerenda = "INSERT INTO Klient (Id_Klient, Imię, Nazwisko, Ulica, Nr Domu, Miasto, Telefon)" + " VALUES ({0},'{1}','{2}','{3}',{4},'{5}',{6});";
        kwerenda = string.Format(kwerenda, textBoxId_Klient.Text, textBoxImie.Text, textBoxNazwisko.Text, textBoxUlica.Text, textBoxNrDomu.Text, textBoxMiasto.Text, textBoxTelefon.Text);
        OleDbDataAdapter pośrednikOle = new OleDbDataAdapter(kwerenda, łączeOle);
        pośrednikOle.Fill(dopisywanyZestawDanych);
    }
0

Jeśli mam nie robić 'łączeOle' jak w takim razie zająć się połączeniem z bazą danych ?

0

Co jest w kwerenda ?

0

Tam jest :

"INSERT INTO Klient (Id_Klient, Imię, Nazwisko, Ulica, Nr Domu, Miasto, Telefon)" + " VALUES ({0},'{1}','{2}','{3}',{4},'{5}',{6});"

Następne podstawienie to format wartości.

0

po podstawieniu zmiennych! Use debugger luck
BTW numer domu i telefon jako liczba - ciekawe...

0

Up.
Nie bardzo rozumiem... Co po podstawieniu ? I dlaczego nr domu i tel. jako liczba jest według Ciebie złe ?

0
Konkurou napisał(a)

Up.
I dlaczego nr domu i tel. jako liczba jest według Ciebie złe ?

Bo numer domu może być 12a, a numer telefonu 111-222-333. Chociaż to drugie to już kwestia implementacji.

Konkurou napisał(a)

Up.
Nie bardzo rozumiem... Co po podstawieniu ?

To co dostajesz w wyniku funkcji string.Format() i co znajduje się w zmiennej kwerenda.

0

Podstawia mi wartości z textboxów pod '{0}' itd. Także myślę, że to działa dobrze, problemem jest 'Błąd składniowy instrukcji INSERT INTO', który nie wiem skąd się wziął.

0
Konkurou napisał(a)

Podstawia mi wartości z textboxów pod '{0}' itd. Także myślę, że to działa dobrze, problemem jest 'Błąd składniowy instrukcji INSERT INTO', który nie wiem skąd się wziął.

Ale posklejane zapytanie jest czytelniejsze i tak najłatwiej wychwycić błędy. Przeklej tu, a zobaczymy

0

Dopiero od niedawna siedzę w c# i jeszcze nie rozumiem dokładnie o co chodzi np. 'posklejane zapytanie' może po prostu wrzucę kod jaki do tej pory napisałem:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Data.SqlClient;
using System.Data.OleDb;

namespace SklepMuzyczny
{
public partial class Form1 : Form
{
private string _path;

    public Form1()
    {
        InitializeComponent();
        _path = @"SklepMuzyczny.mdb";
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'sklepMuzycznyDataSet.Zamówienia' table. You can move, or remove it, as needed.
        this.zamówieniaTableAdapter.Fill(this.sklepMuzycznyDataSet.Zamówienia);
        // TODO: This line of code loads data into the 'sklepMuzycznyDataSet.Sprzęt_Muzyczny' table. You can move, or remove it, as needed.
        this.sprzęt_MuzycznyTableAdapter.Fill(this.sklepMuzycznyDataSet.Sprzęt_Muzyczny);
        // TODO: This line of code loads data into the 'sklepMuzycznyDataSet.Klient' table. You can move, or remove it, as needed.
        this.klientTableAdapter.Fill(this.sklepMuzycznyDataSet.Klient);

    }

    private void gridAuta_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        textBoxId_Klient.Text = gridKlient.Rows[gridKlient.CurrentCell.RowIndex].Cells[0].Value.ToString();
        textBoxImie.Text = gridKlient.Rows[gridKlient.CurrentCell.RowIndex].Cells[1].Value.ToString();
        textBoxNazwisko.Text = gridKlient.Rows[gridKlient.CurrentCell.RowIndex].Cells[2].Value.ToString();
        textBoxUlica.Text = gridKlient.Rows[gridKlient.CurrentCell.RowIndex].Cells[3].Value.ToString();
        textBoxNrDomu.Text = gridKlient.Rows[gridKlient.CurrentCell.RowIndex].Cells[4].Value.ToString();
        textBoxMiasto.Text = gridKlient.Rows[gridKlient.CurrentCell.RowIndex].Cells[5].Value.ToString();
        textBoxTelefon.Text = gridKlient.Rows[gridKlient.CurrentCell.RowIndex].Cells[6].Value.ToString();
    }


    private void buttonDodajKlient_Click(object sender, EventArgs e)
    {
        string łańcuchPołączenia = @"Provider=Microsoft.JET.OLEDB.4.0;data source=" + _path;
        OleDbConnection łączeOle = new OleDbConnection(łańcuchPołączenia);
        łączeOle.Open();

        DodanieKlienta(łączeOle);
        OdświeżenieZawartościGridu(łączeOle);

        łączeOle.Close();
    }
    private void DodanieKlienta(OleDbConnection łączeOle)
    {
        
        DataTable dopisywanyZestawDanych = new DataTable();  // tu można użyć DataSet
        string kwerenda = null;
        kwerenda = string.Format("INSERT INTO Klient (Id_Klient, Imię, Nazwisko, Ulica, Nr Domu, Miasto, Telefon)  VALUES ({0},'{1}','{2}','{3}',{4},'{5}',{6});", textBoxId_Klient.Text, textBoxImie.Text, textBoxNazwisko.Text, textBoxUlica.Text, textBoxNrDomu.Text, textBoxMiasto.Text, textBoxTelefon.Text);
        OleDbDataAdapter pośrednikOle = new OleDbDataAdapter(kwerenda, łączeOle);
        pośrednikOle.Fill(dopisywanyZestawDanych);
    }
    private void OdświeżenieZawartościGridu(OleDbConnection łączeOle)
    {
        DataTable noweDaneTabeli = new DataTable();     // tu NIE można użyć DataSet
        string kwerenda = "SELECT * Klient";
        OleDbDataAdapter pośrednikOle = new OleDbDataAdapter(kwerenda, łączeOle);
        pośrednikOle.Fill(noweDaneTabeli);
        gridKlient.DataSource = noweDaneTabeli;
    }
}

}

0

Postaw breakpointa w OleDbDataAdapter pośrednikOle = new OleDbDataAdapter(kwerenda, łączeOle); i skopiuj nam wartość kwerenda.

0

Wartość po ustawieniu breakpoint-a:

INSERT INTO Klient (Id_Klient, Imię, Nazwisko, Ulica, Nr Domu, Miasto, Telefon) VALUES (1,'q','q','q',1,'q',1);

0
Konkurou napisał(a)

Wartość po ustawieniu breakpoint-a:

INSERT INTO Klient (Id_Klient, Imię, Nazwisko, Ulica, Nr Domu, Miasto, Telefon) VALUES (1,'q','q','q',1,'q',1);

Nazwę kolumny masz taką? Imię

0

Tak 'Imię'.

1
Konkurou napisał(a)

Wartość po ustawieniu breakpoint-a:

INSERT INTO Klient (Id_Klient, Imię, Nazwisko, Ulica, Nr Domu, Miasto, Telefon) VALUES (1,'q','q','q',1,'q',1);

Można sobie ot tak dawać spacje w nazwach kolumn (Nr Domu)? Nie trzeba jej wtedy ująć w nawiasy kwadratowe? (Chociaż ja za taką kolumnę zafundowałbym delikwentowi łamanie kołem. ;))
Druga sprawa - czy na ID-Klient nie ma czasem jakiejś autoinkrementacji inie trzeba podawać wartości ręcznie?

0

Tak na Id_Klient jest autonumeracja. Pierwotnie nie miałem tego w instrukcji, ale jak wyskoczył błąd ze złą składnią, pomyślałem, że może muszą być wszystkie kolumny, więc można to usunąć ?

A co do (Nr Domu) to powinienem zmienić nazwę kolumny, jak rozumiem ? ;)

1
  1. w nazwach zmiennych/kolumn/tabel ogólnie w programowaniu nie używa się znaków narodowych a jedynie znaków alfabetu angielskiego i nie używać spacji (jak napisał Somekind). Należy też unikać nadawania nazw takich samych jak słowa kluczowe danego języka. Unikniesz w ten sposób wielu błędów. Podejrzewam (nie wiem co to za baza), że pole imię, Nr domu trzeba wziąć w apostrofy (to pod escape `)
0

Okej rozwiązałem problem z błędnymi nazwami tabel i teraz pokazał się błąd w "odświeżaniu gridu" dokładniej:

"Błąd składniowy (brak operatora) w wyrażeniu kwerendy '* Klient'."

A kawałek kodu tego dotyczący to:

 private void OdświeżenieZawartościGridu(OleDbConnection łączeOle)
    {
        DataTable noweDaneTabeli = new DataTable();     // tu NIE można użyć DataSet
        string kwerenda = "SELECT * Klient";
        OleDbDataAdapter pośrednikOle = new OleDbDataAdapter(kwerenda, łączeOle);
        pośrednikOle.Fill(noweDaneTabeli);
        gridKlient.DataSource = noweDaneTabeli;
    }

To pytanie było trochę głupie... Niedopatrzenie... Przed nazwą tabeli 'Klient' zapomniałem wpisać "FROM"... Wstyd.

Dziękuję za pomoc. :) Temat do zamknięcia. ;)

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