PreparedStatement – comment spécifier d'utiliser la valeur par défaut de la colonne

J'ai une table créée comme ceci:

CREATE TABLE [dbo].[LogInfo]( [date_current] [datetime] NULL, [classname] [varchar](500) NULL, [output] [varchar](500) NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[LogInfo] ADD DEFAULT (getdate()) FOR [date_current] GO 

la colonne 'date_current' est donc par défaut la date et l'heure actuelles.

J'ai une déclaration préparée comme ceci:

 PreparedStatement psInsert_ = conn.prepareStatement("INSERT INTO LogInfo VALUES(?,?,?)"); psInsert_.setTimestamp(1, ????????); psInsert_.setSsortingng(2, "test text1"); psInsert_.setSsortingng(3, "test text2"); 

Je suis un peu perplexe quant à la façon de spécifier le premier paramètre de l'instruction préparée et je ne trouve aucun exemple de quelque chose comme ça nulle part.

Si j'essaie d'omettre le paramètre par défaut:

 PreparedStatement psInsert_ = conn.prepareStatement("INSERT INTO LogInfo ('classname','output') VALUES(?,?)"); psInsert_.setSsortingng(1, "test text1"); psInsert_.setSsortingng(2, "test text2"); 

J'obtiens une erreur en disant que 'classname' et 'output' sont des noms de colonnes invalides.

Comment dois-je faire cela? Merci.

Le problème dans votre requête est que vous utilisez des guillemets simples ' ' qui sont utilisés pour les littéraux de string et pas pour les noms d'objects, vous voulez utiliser des parenthèses [ ] ou rien du tout. Comme vous avez défini une valeur par défaut, vous pouvez ignorer cette colonne dans l'instruction d'insertion:

 "INSERT INTO LogInfo ([classname],[output]) VALUES(?,?)" or "INSERT INTO LogInfo (classname,output) VALUES(?,?)" 

L'utilisation d'identifiants délimités n'est réellement nécessaire que si le nom de votre colonne est invalide pour une raison quelconque (il peut s'agir d'un mot-key réservé, ou commencer avec un caractère invalide, ou contenir un espace, etc.). Vos colonnes n'en ont pas besoin, vous devriez donc pouvoir les ignorer.

Voir MSDN: Database Identifiers pour plus d'informations sur les règles de dénomination pour SQL Server.

De l'API:

 void setDate(int parameterIndex, Date x) 

Assurez-vous que votre date est un object Date.

Référence:

http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#setDate(int,%20java.sql.Date

Votre deuxième requête échoue car les noms de colonne sont entre guillemets simples. Essayer:

INSERT INTO LogInfo (nom de class, sortie) VALUES (?,?)

Ne pas citer les colonnes. Vous pouvez éventuellement utiliser le mot-key DEFAULT :

 INSERT INTO LogInfo (date_current, classname, output) VALUES(DEFAULT, ?, ?) 

Je crois que votre erreur réside dans le fait que vous avez des guillemets simples autour de classname et de sortie. Supprimez les guillemets simples et votre deuxième solution devrait fonctionner.