Python und MS SQL FILESTREAM

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

Samstag 13. April 2019, 10:13

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

Samstag 13. April 2019, 11:05

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: 5792
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 13. April 2019, 11:34

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

Samstag 13. April 2019, 11:54

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: 5792
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 13. April 2019, 12:02

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

Samstag 13. April 2019, 12:17

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

Samstag 13. April 2019, 12:32

@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: 10008
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 13. April 2019, 12:37

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

Samstag 13. April 2019, 12:42

@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: 1198
Registriert: Freitag 17. April 2009, 10:28

Samstag 13. April 2019, 17:16

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

Montag 15. April 2019, 10:13

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: 3539
Registriert: Samstag 2. Juni 2018, 10:21

Montag 15. April 2019, 10:29

@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.
A train station is where trains stop.
A bus station is where busses stop.
A Work Station is where …
__deets__
User
Beiträge: 5792
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 15. April 2019, 10:42

@__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: 10008
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 15. April 2019, 10:50

@__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: 5792
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 15. April 2019, 10:55

Ahhh. Nunja, der Rate-Raum ist ein grosser welcher....
Antworten