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

时间:2015-07-31 14:57:35

标签: 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'和'输出'是无效的列名。

我该怎么做?感谢。

4 个答案:

答案 0 :(得分:1)

来自API:

void setDate(int parameterIndex, Date x)

确保您的日期是日期对象。

参考:

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

您的第二个查询失败,因为列名称是单引号。尝试:

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

答案 1 :(得分:1)

不要引用列。您可以选择使用DEFAULT关键字:

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

答案 2 :(得分:1)

我相信你的错误在于你在classname和output周围有单引号。删除单引号,您的第二个解决方案应该有效。

答案 3 :(得分:1)

您的查询中的问题是您使用单引号' ',它们用于字符串文字而不是对象名称,您想要使用括号[ ]或根本不使用括号"INSERT INTO LogInfo ([classname],[output]) VALUES(?,?)" or "INSERT INTO LogInfo (classname,output) VALUES(?,?)" 。由于您已定义默认值,因此可以在insert语句中跳过该列:

TO_STRING(SYSTEM_DATE(), 'yyyyMMdd') AS [DateForFileName],

当您的列名由于某种原因(可能是保留关键字,或者以无效字符开头,或包含空格等)时,实际上只需要使用分隔标识符。您的列不需要任何列,因此您应该/可以跳过它们。

有关SQL Server命名规则的详细信息,请参阅MSDN:Database Identifiers