Odczyt z bazy danych

0

Chcę zrobić:
aby po wybraniu z comboboxa jakiejś wartości[z kolumny 'nazwaproduktu' w bazie danych] pojawił się niżej w tekstboxie kod kreskowy, który jest przypisany temu produktowi[ w bazie znajduje sie kolumna 'kod'].

Napisałem funkcję:

public string wczytaj_tekst_box(string nazwaTabeli, string kod, string nazwa, string combo)
{
string sqlString = null;
sqlString = "SELECT " + kod + " FROM " + nazwaTabeli + " WHERE " + combo + " LIKE " + nazwa+";";

        return sqlString;
    }
I wywołanie na formatce:
<code class="c#">sql_cmd.CommandText = sqlselect.wczytaj_tekst_box("Towary", "kod_kreskowy","nazwa",comboBox1form1.Text);
            SQLiteDataReader wynik = sql_cmd.ExecuteReader();
            textBox1form1.Text = wynik.GetString(1);

Wyrzuca mi błąd przy kompilacji:
near "nazwa": syntax error

Co jest nie tak? Będę wdzięczny za odpowiedź.

0

nazwa powinna być w 'apostrofach'

0

to chyba nie to, bo jak zmienilem na apostrofy to podkreslilo mi na czerwono, a predzej nic nie podkreslalo

2
sqlString = "SELECT " + kod + " FROM " + nazwaTabeli + " WHERE " + combo + " LIKE '" + nazwa+"';";

Tak ma być.

0

ok, dzięki za pomoc, ale dalej wywala błąd: near "'nazwa'": syntax error

1

Co jest nie tak?

To, ze sklejasz recznie stringa z zapytaniem. http://www.csharp-station.com/Tutorial/AdoDotNet/lesson06
Druga rzecza nie tak, jest uzywanie "konwencji_z_palkami_powstawianymi_wszedzie".
No i po trzecie miloby bylo widziec kod, ktory powoduje to "nazwa": syntax error, bo albo ja jestem slepy, albo go nie wkleiles.

1

Piszesz z palca i robi się bałagan, pałki obowiazkowe ale wypadało by dla sprawdzenia napisać wyświetlanie złożonego zapytania wówczas byś złapał błąd.
Masz zamienione w Twojej funkcji składajacej ostatnie dwa parametry. Jeżeli nazwy pól lub tabel nie kolidują z innym nazwami i funkcjami to w SQLite pałki nie są obowiązkowe.
Poza tym zainstaluj darmowy dodatek do firefoxa SQLite Manager i zapytanie przećwiczysz zanim napiszesz złe zapytanie.

miałem chwilę to sprawdziłem (też sprawdzaj przed napisaniem kodu, będzie mniej kłopotów):

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Data;
using System.Data.SQLite;
using System.IO;
using System.Linq;
using System.Text;

class Script
{
    public static string roaming = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    public static string configPath = roaming+@"\\LottoCad232R\\config\\filterConfig.yml";
    public static string connectionString = @"Data Source = " + roaming + @"\\myDB\\sqlite\\mydb.sqlite;Version=3";

    public static SQLiteConnection openDatabase() {
            string connection_string = connectionString;
            return (new SQLiteConnection(connection_string));
            }

    public static string wczytaj_tekst_box(string nazwaTabeli, string kod, string nazwa, string combo)
        {
            string sqlString = null;
            sqlString = "SELECT " + kod + " FROM " + nazwaTabeli + " WHERE " + combo + " LIKE '" + nazwa+"';";
            return sqlString;
        }
                    
    [STAThread]
    static public void Main(string[] args)
    {
            SQLiteConnection sql_con = openDatabase();
            sql_con.Open();
            Console.WriteLine("Moje sklejanie");
            string sql = string.Format("SELECT name from FilterSet WHERE symbol LIKE '{0}'", "MDU");
            SQLiteCommand sql_cmd = new SQLiteCommand(sql, sql_con);
                SQLiteDataReader sqReader = sql_cmd.ExecuteReader();
                while (sqReader.Read()) {
                    Console.WriteLine("rekord = {0}",sqReader.GetString(0));
                }
            Console.WriteLine("Twoje sklejanie");
            string comboBox1form1Text = "MDU";
            sql = wczytaj_tekst_box("FilterSet","name", comboBox1form1Text, "symbol"); 
            Console.WriteLine(sql);            
            sql_cmd = new SQLiteCommand(sql, sql_con);
            sql_cmd.CommandType = System.Data.CommandType.Text;
            sqReader = sql_cmd.ExecuteReader();
                while (sqReader.Read()) {
                    Console.WriteLine("rekord = {0}",sqReader.GetString(0));
                } 
                
            Console.WriteLine("Bez sklejania, zalecane bo odporne na wstrzyknięcia.");
            sql = ("SELECT name from FilterSet WHERE symbol LIKE @isLike");
            
            sql_cmd = new SQLiteCommand(sql, sql_con);
            sql_cmd.Parameters.Add(new SQLiteParameter("@isLike", DbType.String) {Value = "MDU"});  
                SQLiteDataReader sqR = sql_cmd.ExecuteReader();
                while (sqR.Read()) {
                    Console.WriteLine("rekord = {0}",sqR.GetString(0));
                }                
    }
}

pozdr
AK

0

dzięki, ale problem ciągle się pojawia. w mojej bazie rekordy w kolumnie nazwa mają spacje np. advocat Gdański 500
Po wybraniu z comboboxa tej wartosci pojawia się błąd:

An unhandled exception of type 'System.Data.SQLite.SQLiteException' occurred in System.Data.SQLite.dll

Additional information: SQL logic error or missing database

near "Gdański": syntax error

Kiedy usunę spacje z rekordu to pojawia się:

An unhandled exception of type 'System.Data.SQLite.SQLiteException' occurred in System.Data.SQLite.dll

Additional information: SQL logic error or missing database

no such column: advocatGdański500

ktoś ma jakiś pomysł?

1

Podgladnij sobie w debugu tego SQLa, ktorego sklejasz. Podejrzewam, ze tam po prostu tzreba spacje pododawac

1
sangwinik napisał(a):

dzięki, ale problem ciągle się pojawia. w mojej bazie rekordy w kolumnie nazwa mają spacje np. advocat Gdański 500
Po wybraniu z comboboxa tej wartosci pojawia się błąd:

An unhandled exception of type 'System.Data.SQLite.SQLiteException' occurred in System.Data.SQLite.dll

Additional information: SQL logic error or missing database

near "Gdański": syntax error

Kiedy usunę spacje z rekordu to pojawia się:

An unhandled exception of type 'System.Data.SQLite.SQLiteException' occurred in System.Data.SQLite.dll

Additional information: SQL logic error or missing database

no such column: advocatGdański500

ktoś ma jakiś pomysł?

Coś kolego kręcisz bo spacje nie mają nic wspólnego. Posprawdzaj ty dokładnie ....
Wszystkie sposoby składania zapytań i parametrycznie działają ze spacjami ???.
Pewnie również nie sprawdziłeś swojej funkcji składającej w moim listingu jest poprawiona.

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Data;
using System.Data.SQLite;
using System.IO;
using System.Linq;
using System.Text;

class Script
{
    public static string roaming = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    public static string configPath = roaming+@"\\LottoCad232R\\config\\filterConfig.yml";
    public static string connectionString = @"Data Source = " + roaming + @"\\LottoCad232R\\sqlite\\LC2014.sqlite;Version=3";

    public static SQLiteConnection openDatabase() {
            string connection_string = connectionString;
            return (new SQLiteConnection(connection_string));
            }

    public static string wczytaj_tekst_box(string nazwaTabeli, string kod, string nazwa, string combo)
        {
            string sqlString = null;
            sqlString = "SELECT " + kod + " FROM " + nazwaTabeli + " WHERE " + combo + " LIKE '" + nazwa+"';";
            return sqlString;
        }


    [STAThread]
    static public void Main(string[] args)
    {
            SQLiteConnection sql_con = openDatabase();
            sql_con.Open();
            Console.WriteLine("Moje sklejanie");
            string sql = string.Format("SELECT value from advocat WHERE name LIKE '{0}'", "advocat Gdański 500");
            Console.WriteLine(sql); 
            SQLiteCommand sql_cmd = new SQLiteCommand(sql, sql_con);
                SQLiteDataReader sqReader = sql_cmd.ExecuteReader();
                while (sqReader.Read()) {
                    Console.WriteLine("rekord = {0}",sqReader.GetDouble(0));
                }
            Console.WriteLine("Twoje sklejanie");
            string comboBox1form1Text = "advocat Gdański 500";
            sql = wczytaj_tekst_box("advocat","value", comboBox1form1Text, "name"); 
            Console.WriteLine(sql);            
            sql_cmd = new SQLiteCommand(sql, sql_con);
            sql_cmd.CommandType = System.Data.CommandType.Text;
            sqReader = sql_cmd.ExecuteReader();
                while (sqReader.Read()) {
                    Console.WriteLine("rekord = {0}",sqReader.GetDouble(0));
                } 
                
            Console.WriteLine("Bez sklejania, zalecane bo odporne na wstrzyknięcia.");
            sql = ("SELECT value from advocat WHERE name LIKE @isLike");
            
            sql_cmd = new SQLiteCommand(sql, sql_con);
            sql_cmd.Parameters.Add(new SQLiteParameter("@isLike", DbType.String) {Value = "advocat Gdański 500"});  
            Console.WriteLine("zapytanie:{0}, parametr({1}) = {2}",sql_cmd.CommandText,sql_cmd.Parameters[0].ParameterName,   sql_cmd.Parameters[0].Value);
                SQLiteDataReader sqR = sql_cmd.ExecuteReader();
                while (sqR.Read()) {
                    Console.WriteLine("rekord = {0}",sqR.GetDouble(0));
                }                
    }
}

nawet zbudowałem tabele z tym trunkiem Gdańskim :-)

 
DROP TABLE IF EXISTS "advocat";
CREATE TABLE "advocat" ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , "name" VARCHAR, "value" DOUBLE);
INSERT INTO "advocat" VALUES(1,'advocat Gdański 500',500);
INSERT INTO "advocat" VALUES(2,'advokat Zielonogórski 1000',1000);

wynik powyższego :

Moje sklejanie
SELECT value from advocat WHERE name LIKE 'advocat Gdański 500'
rekord = 500
Twoje sklejanie
SELECT value FROM advocat WHERE name LIKE 'advocat Gdański 500';
rekord = 500
Bez sklejania, zalecane bo odporne na wstrzyknięcia.
zapytanie:SELECT value from advocat WHERE name LIKE @isLike, parametr(@isLike) = advocat Gdański 500
rekord = 500

pozdr AK

0

dzięki wielkie, problem rozwiązany. zadziałało w ten sposób:

sql_cmd.Parameters.Add(new SQLiteParameter("@kombo",comboBox1form1.Text));
            sql_cmd.CommandText = "SELECT kod_kreskowy,jednostka FROM towary WHERE nazwa LIKE @kombo;"; 

przepraszam za zamieszanie, ale za kilka dni mam z tego sprawdzian(ucze sie w technikum) i szybko szukam odpowiedzi na to co mi nie działa

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