Python und MS SQL FILESTREAM

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du brauchst schon einen Platzhalter PRO Argument. Also 3 in deinem Fall.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

Hab ich ausprobiert, leider ohne erfolg. :(

Code: Alles auswählen

	if result is None:
                
                sql_eintrag = [(123,  test ,  bild1)]

                cur.execute("insert into " + tabelle + \
                "(Id, SerialNumber, Chart)values(?, ?, ?)", sql_eintrag)    
                
                
            else:
                print("weiter")
                tkinter.messagebox.showwarning("info", "Werkzeug schon vorhanden")
                
            con.commit()
            con.close()
            abbrechen()
Fehler:
"(Id, SerialNumber, Chart)values(?, ?, ?)", sql_eintrag)
pyodbc.ProgrammingError: ('The SQL contains 3 parameter markers, but 1 parameters were supplied', 'HY000')
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und dann musst du statt einer Liste von drei Parametern eben drei Parameter angeben.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

So, habe jetzt variablen einzeln hingesetzt

Code: Alles auswählen

	if result is None:
                
                sql_id = 1234

                cur.execute("insert into " + tabelle + \
                "([Id], [SerialNumber], [Chart])values(?, ?, ?)", sql_id, test,  bild1)    
                
                
            else:
                print("weiter")
                tkinter.messagebox.showwarning("info", "Werkzeug schon vorhanden")
                
            con.commit()
            con.close()
            abbrechen()
Fehler:
"([Id], [SerialNumber], [Chart])values(?, ?, ?)", sql_id, test, bild1)
pyodbc.DataError: ('22018', '[22018] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Operandentypkollision: bigint ist inkompatibel mit uniqueidentifier (206) (SQLExecDirectW); [22018] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Anweisung(en) konnte(n) nicht vorbereitet werden. (8180)')
>>>

Aber müsste sich Id nicht selbst generieren?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Keine Ahnung. Das ist jetzt ODBC/Microsoft spezifisch. Nicht meine Baustelle. Mein googeln so gut wie dein googeln.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist immer noch schlecht, dass tabelle eine Variable ist, normalerweise hat man keine Variablen Tabellennamen.

UniqueIdentifier über gibt man normalerweise nicht bei INSERT, weil die automatisch erstellt werden sollten. In Deinem ersten Post, ist der ja auch noch nicht da.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

@Sirius3: was meinst du mit UniqueIdentifier?

Außerdem muss die Tabelle eine Variable sein, da es verschiedene Tabellen später sind wo das gespeichert werden soll.

Z.B.: 23422
23491
Usw.

Da die Werkzeuge zu einer bestimmten Maschine gehören
Zuletzt geändert von badi113 am Samstag 13. April 2019, 12:38, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Das mußt Du doch selbst wissen, denn Du hast die Tabelle erzeugt.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

@Sirius3: Klick jetzt weiß ich wieder, das steht bei ID drinne.

Aber so ganz genau weiß ich das nicht da ich das so kopiert habe :|
Benutzeravatar
sparrow
User
Beiträge: 4184
Registriert: Freitag 17. April 2009, 10:28

Dein Tabellendesign ist kaputt, wenn die Struktur der Tabellen für verschiedene Maschinen gleicht ist und sich nur anhand des Namens der Relation unterscheidet.
In dem Fall gehört der Name der Relation in eine Spalte.

Stichworte zum Googeln: "Relationale Datenbanken" und "Normalisierung".

In deinem Fall heißt das: Die Tabelle muss eine Spalte "Maschine" haben statt lauter Tabellen mit dem Maschinennamen.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

Hy Leute,
habe den Rat befolgt so das alle Wkz in eine Tabelle kommen.

Nun habe Ich die Datenbank und die Tabelle neu erstellt, um noch mal ganz von vorne damit anzufangen.

Die Tabelle ist wie folgt aufgebaut.

Code: Alles auswählen

CREATE TABLE Datenbank.dbo.Werkzeuge
(
    [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
	[Name] VARCHAR(MAX) NOT NULL, 
    [SerialNumber] INTEGER UNIQUE,
    [Chart] VARBINARY(MAX) FILESTREAM NULL
)
GO

Code: Alles auswählen

	if result is None:
                
                sql = ("INSERT INTO Werkzeuge([Name], [SerialNumber], [Chart])values(?, ?, ?)")
                cur.execute(sql, s_name, manr,  bild1)    
                
                
            else:
                print("weiter")
                tkinter.messagebox.showwarning("info", "Werkzeug schon vorhanden")
                
            con.commit()
            con.close()
            abbrechen()
Nun hab ich Id nicht mit reingenommen in INTO und bekomme trotzdem die Fehlermeldung

pyodbc.IntegrityError: ('23000', '[23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Der Wert NULL kann in die Id-Spalte, Datenbank.dbo.Werkzeuge-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT. (515) (SQLParamData); [23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Die Anweisung wurde beendet. (3621)')


Obwohl id gar nicht erwähnt wird?.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@badi113: Naja, was wird denn in `id` eingetragen wenn kein Wert dafür übergeben wird? Das ist wohl etwas was Du auf Datenbankseite regeln musst.

Und der `execute()`-Aufruf ist falsch. Die drei Werte müssen als *ein* Argument übergeben werden. Die API sieht für diese Methode nur zwei Argumente vor – die SQL-Anweisung als erstes Argument und optional die Werte für Platzhalter als zweites Argument. Dass da keine Ausnahme kommt, liegt an dem konkreten Datenbankmodul.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

@__blackjack__: die Fehlermeldung die er vorher bekommen hat, suggeriert das er eben doch mehrere Argumente uebergeben muss. Ggf. ist pyodbc da nicht-standard?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: nein, die vorherige Fehlermeldung sagte, dass er keine Liste von Tuplen übergeben darf. Der OP hat etliche Varianten durchgeraten, aber nie die richtige erwischt.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ahhh. Nunja, der Rate-Raum ist ein grosser welcher....
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

@__blackjack__: Aber heißt nich uniqueidentifier das der SQL Server das selber macht? Also den eintrag generieren?

Code: Alles auswählen

if result is None:
                eintrag = (s_name, manr, bild1)
                sql = ("INSERT INTO Werkzeuge([Name], [SerialNumber], [Chart])values(?, ?, ?)")
                cur.execute(sql, eintrag)    

Meinst du in etwa so?
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@badi113: Ja genau so war das gemeint mit den Werten.

MS SQL ist nicht meine Baustelle, keine Ahnung wie man da die DB dazu bewegt selbstständig einen Schlüssel zu generieren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
sparrow
User
Beiträge: 4184
Registriert: Freitag 17. April 2009, 10:28

Meine MS SQL-Zeit ist lange vorbei und die machen viel seltsames Kram - weshalb man sich damit eigentlich nicht rumschlagen will.
Ich glaube das Schlüsselwort war "identity" um eine selbstinkrementierende ID zu erhalten.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

@sparrow: Von wollen kann keine rede sein, aber wir arbeiten nur mit ms sql :cry:

Eigentlich wahr es mal so gedacht dass alles in txt Dateien und Ordner gespeichert werden sollte, hatt auch alles geklappt. Bis jemand kam und meinte in SQL wäre besser.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist es auch. Die Menge an Fehlern, die du bei einer selbstgestrickten Loesung machen kannst ist mitnichten geringer.
Antworten