我有一个像这样创建的表:
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'和'输出'是无效的列名。
我该怎么做?感谢。
答案 0 :(得分:1)
来自API:
void setDate(int parameterIndex, Date x)
确保您的日期是日期对象。
参考:
您的第二个查询失败,因为列名称是单引号。尝试:
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。