【问题标题】:Inserting numeric data type using SQL statement in Java在 Java 中使用 SQL 语句插入数值数据类型
【发布时间】:2013-02-07 01:51:38
【问题描述】:

我正在编写一个允许用户将他们的数据存储在我的数据库中的方法。

我遇到的问题是在我的数据库中存储一个数字数据类型,用于用户 ID。

首先,如何判断 ID 号是否自动递增?这些是它的属性:

Type: Numeric
Column size: 4
Decimal digits: 0
Part of primary key: true
Part of an index: true
Position: 1

我确定我在某处读到过,将其设置为索引的一部分 (true) 允许自动递增。谁能确认一下?

更重要的是,在我的表中插入数据时,我收到一条错误消息:

Columns of type 'NUMERIC' cannot hold values of type 'CHAR'. 

这是我的插入代码的 sn-p(如果需要,我可以透露更多):

Statement pStatement = conn.createStatement();
String selectSQL = ("INSERT INTO APP.PERSON VALUES ('" + '3' + "','" + user + "','" + pass + "','" + fName + "','" + sName + "','" + sQuestion + "','" + sAnswer + "') ");
pStatement.executeUpdate(selectSQL);

如您所见,我将 ID(第一个值)手动设置为 3。我相信这会引发错误,并且想知道如何使用 INSERT 命令插入数值。

我在 Mac OS X Mountain Lion 上使用 Netbeans 7.3 Beta 2 编写 Java 代码。我正在使用 Derby 数据库。

【问题讨论】:

  • 使用占位符:稍后你会感谢我的。但是,正如错误消息所述,其中一列包含无效值 - 例如,javadb 会将 '3' 转换为 3 吗?我知道 SQL Server 会,但是.. 另外,为了让生活更简单,请确保在INSERT包含列名。
  • 我会研究占位符的,谢谢。我有另一种方法以不同的方式做同样的事情,我相信我在那里使用占位符 - 虽然我不知道它们是什么,但我假设。我的编程知识并不惊人!我应该提到,我尝试了“3”-“3”和 3。它们都不起作用。
  • 这可能是一个完全不同的列 - 使用列名,例如INSERT INTO t (N1, N2) VALUES (V1, V2) 可以帮助“澄清”哪些值映射到哪些列。使用 [typed] 占位符进一步说明/加强了此说明,以便可以从上(表)到下(Java)快速直观地验证整个签名。
  • 有道理 - 我有更多代码要实现!谢谢。

标签: java sql numeric javadb


【解决方案1】:

嘿兄弟,我建议你使用 prepareStatement

String template = "INSERT INTO APP.PERSON VALUES (YOUR,TABLE,COLLUMN,NAME) values (?,?,?,?)";
           PreparedStatement stmt = yourConnection.prepareStatement(template);

所以如果你想将你的 ID 设置为整数,让 java 来做

       stmt.setInt(1, ID);
       stmt.setString(2, user);
       stmt.setString(3, fName);
       stmt.executeUpdate();

我不知道您的表结构如何,但如果您想使用 int,这是一个示例 使用stmt.setInt(1, 3);

1-->你在字符串模板中设置的位置

3--> 也许你想硬编码 ID

这是我使用 prepareStatement 的示例模式

String name = "shadrach"
Double price = "100.00"
int qty = 3;
    String template = "INSERT INTO PRODUCT (NAME,PRICE,QTY) values (?,?,?)";
                PreparedStatement stmt = connection.prepareStatement(template);
                stmt.setString(1, name);
                stmt.setDouble(2, price);
                stmt.setInt(3, qty);
                stmt.executeUpdate();

【讨论】:

  • 在我的其他方法中,我已经完全像这样写了它,但没有'VALUES(ID,NAME,AGE)'等......非常感谢。所有答案都有帮助 - 问题还没有解决,但我想我的工作已经完成了。我不知道选择哪个答案作为正确答案 - 他们都是!
  • 现已完全修复 - 完美运行,谢谢大家。这最有帮助,所以我在稍微编辑后选择了它作为答案,因为在 APP.PERSON 之后有一个不需要的“VALUE”。
  • 我很高兴帮助你兄弟:)
【解决方案2】:

当表格需要一个数字时,您正在插入 字符 3。

您可以使用ResultSetMetaData 的 isAutoIncrement 方法判断列是否为自动增量。希望对您有所帮助....

【讨论】:

    【解决方案3】:

    您不应该在数字周围加上单引号。我不确定其他列数据类型的类型,但任何数字都不应包含单引号。

    Statement pStatement = conn.createStatement();
    
    String selectSQL = ("INSERT INTO APP.PERSON VALUES (3,'" + user + "','" + pass + "','" + fName + "','" + sName + "','" + sQuestion + "','" + sAnswer + "') ");
    
     pStatement.executeUpdate(selectSQL);
    

    您还应该考虑将其切换为使用PreparedStatement,连接字符串以执行 SQL 将使您容易受到 SQL 注入攻击。准备好的报表将有助于降低这种风险。

    【讨论】:

    • 谢谢,但我仍然使用“3”时遇到同样的错误,如果这绝对是插入数值的正确方法,也许这毕竟不是我的 ID 的错误。正如你所看到的,我将我的 Statement pStatement 称为 PStatement,因为它曾经是 PreparedStatement,但遇到了困难,所以现在将其更改 - 一旦完成,我将其更改回来。
    • 你确定你去掉了(之后和,之前的单引号吗?
    • 我从字面上复制了您上面的一行(中间一行)- 不走运,同样的错误。
    • 我看到了您的更新并再次复制并尝试了 - 不幸的是再次出现同样的错误。
    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多