2016-07-15 16 views
0

Ich versuche, Parameter für eine DB2-Abfrage mit ODbc in C# zu verwenden, aber das Feld Timestamp gibt mir Probleme. Ich verwende DB2 Client 9.7 und updateDate ist ein DateTime-Typ. Hier ist mein Code:Verwenden von db2-odbc-Parametern mit Zeitstempel C#

string commandString = "INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES ('?', TIMESTAMP_FORMAT('?', 'YYYY-MM-DD HH24:MI:SS'))"; 

OdbcConnection con = new OdbcConnection(conString); 
OdbcCommand command = new OdbcCommand(commandString, con); 

command.Parameters.AddWithValue("?username", userName); 
command.Parameters.AddWithValue("?update_date", updateDate.ToString("yyyy-MM-dd HH:mm:ss")); 

//execute the stuff 
con.Open(); 
command.ExecuteNonQuery(); 
con.Close(); 

Dies ist der Fehler Ich erhalte:

ERROR [42815] [IBM][CLI Driver][DB2] SQL0171N The data type, length or value of the argument for the parameter in position "1" of routine "SYSIBM.TIMESTAMP_FORMAT" is incorrect. Parameter name: "". SQLSTATE=42815 

ich auch versucht haben, die regelmäßig TIMESTAMP() -Funktion in DB2 enthalten beide Formate verwenden sie akzeptiert (Ex Zeitstempel. ('2016-10-20-12.00.00.000000') TIMESTAMP ('2016.10.20 12.00.00')), aber das gibt mir diese Fehlermeldung:

ERROR [22007] [IBM][CLI Driver][DB2] SQL0180N The syntax of the string representation of a datetime value is incorrect. SQLSTATE=22007 

Wer weiß, wo ich bin falsch machen?

EDIT: Es funktioniert ohne Verwendung von Parametern, können Parameter nicht mit DB2 verwendet werden?

+0

Sie konvertieren 'updateDate', die eine Datetime ist, um Zeichenfolge in Ihrem C# -Code, dann versuchen Sie es in der SQL-Anweisung zurück zu Zeitstempel zu konvertieren. Warum liefern Sie den Parameter nicht als DateTime? – mustaccio

+0

@mustaccio Ändern meines Parameters zu so etwas? command.Parameters.AddWithValue ("? update_date", updateDate); Wenn ich das ausprobiert habe, erhalte ich den Fehler, dass "ein ungültiges Datum/Uhrzeit-Format verfälscht wurde, eine ungültige String-Repräsentation wurde angegeben". In meiner Befehlszeichenkette änderte ich mein updateDate auch, um ein regulärer Parameter anstelle einer Zeichenkette zu sein? gegen "?" mit immer noch keinem Glück. – Crobota

Antwort

1

Ich habe keine Möglichkeit, dies zu testen, aber ich denke, Sie sollten, sie sind Parameter, nicht Literale nicht Parameter-Markierungen in Anführungszeichen setzen. Ihre Aussage sollte wie folgt aussehen

string commandString = "INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES (?,?)"; 

und dann auch Sie nicht doppelte Umwandlung von DateTime bespannen zu TIMESTAMP benötigen:

command.Parameters.AddWithValue("?username", userName); 
command.Parameters.AddWithValue("?update_date", updateDate); 
+0

Wenn ich dies versuche, bekomme ich diesen Fehler, mein String-Wert ist auch nicht zu groß für die Zeichen erlaubt. 'ERROR [22001] [IBM] [CLI-Treiber] CLI0109E Abschneiden der Zeichenfolgedaten rechts. SQLSTATE = 22001' – Crobota

+0

Hoppla, ich hatte meine Reihenfolge der Parameterzuweisungen durcheinander gebracht. Das hat es behoben! Vielen Dank! – Crobota

+0

Code von mustaccio Arbeit? – Esperento57

0

möglicherweise ein Fehler im Zeitstempelformat.

Versuchen Sie updateDate.ToString ("yyyy-MM-dd.HH.mm.ss.ffffff"));

+0

Ich habe Ihren Vorschlag ausprobiert und musste auch meine Timestamp-Funktion ändern: TIMESTAMP_FORMAT ('?', 'JJJJ-MM-TT HH24: MI: SS: NNNNNN'). Ich erhalte immer noch meinen ursprünglichen Fehler von "Arument 1 ist falsches Format." – Crobota

0

es versuchen:

string commandString =string.format("INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES ('{0}', '{1}')", userName, updateDate.ToString("yyyy-MM-dd.HH.mm.ss.ffffff")); 

OdbcConnection con = new OdbcConnection(conString); 
OdbcCommand command = new OdbcCommand(commandString, con); 

//execute the stuff 
con.Open(); 
command.ExecuteNonQuery(); 
con.Close(); 
+0

Es gab mir immer noch einen Fehler, aber das Umschalten auf 'updateDate.ToString (" yyyy-MM-dd HH: mm: ss ") funktioniert. Warum kann ich das nicht mithilfe von Parametern tun? – Crobota

+0

Happy, seine Arbeit, wie ich dachte, das Problem ist eine Umwandlung von Formatzeichenfolge an TIMESTAMP_FORMAT übergeben oder wie Sie Ihren Parameter übergeben – Esperento57

+0

Vielen Dank! Weißt du, warum ich Parameter nicht verwenden kann, um dasselbe zu tun? – Crobota

0
 string commandString = "INSERT INTO DATABASENAME(USERNAME, UPDATE_DATE) VALUES ('?','?')"; 

     OdbcConnection con = new OdbcConnection(conString); 
     OdbcCommand command = new OdbcCommand(commandString, con); 

     OdbcParameter p1 = command.CreateParameter(); 
     p1.DbType = DbType.AnsiString; 
     p1.Value = userName; 
     command.Parameters.Add(p1); 

     OdbcParameter p2 = command.CreateParameter(); 
     p2.DbType = DbType.AnsiString; 
     p2.Value = updateDate.ToString("yyyy-MM-dd HH:mm:ss"); 
     command.Parameters.Add(p2); 


     con.Open(); 
     command.ExecuteNonQuery(); 
     con.Close(); 
+0

noch immer den gleichen Fehler für die updateDate geben möchten.Ich habe alle DBTypes versucht, die Datum miteinbeziehen. 'ERROR [22007] [IBM] [CLI-Treiber] [DB2] SQL0180N Die Syntax der Zeichenfolgendarstellung eines datetime-Werts ist falsch. SQLSTATE = 22007' Es ist, als würde ODBc keine Parameter korrekt eingeben. – Crobota

+0

Ja ODBC hat ein Problem, ich benutze idb2command im Allgemeinen mit C# .net. Und wenn Sie mit diesem Code versuchen und updateDate.ToString ("yyyy-MM-dd.HH.mm.ss.ffffff")); ?? – Esperento57

Verwandte Themen