【问题标题】:PreparedStatement - how specify to use default value of columnPreparedStatement - 如何指定使用列的默认值
【发布时间】:2015-07-31 14:57:35
【问题描述】:

我有一个这样创建的表:

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");

我收到一条错误消息,提示“类名”和“输出”是无效的列名。

我应该怎么做?谢谢。

【问题讨论】:

    标签: java sql-server


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      来自 API:

      void setDate(int parameterIndex, Date x)
      

      确保您的日期是一个 Date 对象。

      参考:

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

      您的第二个查询失败,因为列名用单引号括起来。试试:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          我相信你的错误在于你在类名和输出周围有单引号。删除单引号,您的第二个解决方案应该可以工作。

          【讨论】:

            猜你喜欢
            • 2013-07-19
            • 2011-11-24
            • 1970-01-01
            • 1970-01-01
            • 2013-07-25
            • 2014-11-12
            • 1970-01-01
            • 2011-03-25
            • 2016-10-29
            相关资源
            最近更新 更多