java - PreparedStatement - 如何指定使用列的默认值

标签 java sql-server

我有一个这样创建的表:

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

因此“date_current”列默认为当前日期和时间。

我有这样一个准备好的声明:

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

对于如何指定准备好的语句的第一个参数,我有点不知所措,而且在任何地方都找不到类似的例子。

如果我尝试省略默认参数:

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

我收到一条错误消息,指出“classname”和“output”是无效的列名。

我应该怎么做?谢谢。

最佳答案

查询中的问题是您使用单引号 ' ' 用于字符串文字而不是对象名称,您想要使用方括号 [ ] 或什么都不用根本。由于您定义了默认值,因此您可以跳过插入语句中的该列:

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

or 

"INSERT INTO LogInfo (classname,output) VALUES(?,?)"

只有当您的列名由于某种原因无效时才真正需要使用定界标识符(它可能是保留关键字,或以无效字符开头,或包含空格等)。您的专栏不需要任何内容​​,因此您应该/可以跳过它们。

参见 MSDN:Database Identifiers有关 SQL Server 命名规则的更多信息。

关于java - PreparedStatement - 如何指定使用列的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31749285/

相关文章:

java - serialversionUID 不匹配

sql - 像处理任何其他表一样处理 sys 表

Java将变量添加到字符串数组

java - 创建自定义计划作业监视器 ATG

sql - SQL SERVER 中的分组依据/打印相关查询

sql - 如何在SQL Server中查找与给定字符串相似的字符串?

sql - SSIS OLE DB 记录可用。源 : "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005, 无法确定元数据

sql-server - SQL Server 索引 View 问题

java - 为什么 CompletableFuture.supplyAsync 会成功随机次数?

java - Spring @Transaction 不会在抛出异常时回滚