gpt4 book ai didi

java - 'INTEGER'和 'CHAR (UCS_BASIC)' java数据库比较

转载 作者:行者123 更新时间:2023-11-30 22:53:09 24 4
gpt4 key购买 nike

我已经将这个程序连接到我的数据库,每次我尝试运行它时它都会显示这个错误:

Selecione id da Encomenda: 
3
java.sql.SQLSyntaxErrorException: Comparisons between 'INTEGER' and 'CHAR (UCS_BASIC)' are not supported. Types must be comparable. String types must also have matching collation. If collation does not match, a possible solution is to cast operands to force them to the default collation (e.g. SELECT tablename FROM sys.systables WHERE CAST(tablename AS VARCHAR(128)) = 'T1')

构建成功(总时间:3 秒)

我的导入

import java.sql.*;
import java.io.*;
import java.math.BigDecimal;
import java.util.Scanner;

我还有一些查询,就像那个查询一样,但使用 VARCHAR 并且这些查询工作正常。

DETALHES_ENCOMENDA 表中的列 ENCOMENDAS 是一个像 ID 一样的 INTEGER 类型,我已经尝试了很多方法,但没有一个有效

你们能帮帮我吗?

谢谢!

try {

BufferedReader in;
in = new BufferedReader( new InputStreamReader( System.in ));
System.out.print("\nConsultar lista de artigos de uma encomenda.\n");
System.out.print("\nSelecione id da Encomenda: \n");
String NR = in.readLine();


Connection c = DriverManager.getConnection("jdbc:derby://localhost:1527/loja_inf/","luis","admin");
c.setAutoCommit(false);
Statement stmt = c.createStatement();
String query = " SELECT QUANTIDADE, IDPRODUTO, TIPOPRODUTO, FABRICANTE, MODELO, PRECO " +
" FROM DETALHES_ENCOMENDA " +
" INNER JOIN PRODUTOS " +
" ON DETALHES_ENCOMENDA.PRODUTO = PRODUTOS.IDPRODUTO " +
" WHERE ENCOMENDA = '"+ NR +"' ";

ResultSet rs = stmt.executeQuery(query);
System.out.println( "Artigos da encomenda nº:" + NR);
System.out.println( "---------------------------------------");
while ( rs.next() ) {
String FABRICANTE = rs.getString("FABRICANTE");
String MODELO = rs.getString("MODELO");
String PRECO = rs.getString("PRECO");
String TIPOPRODUTO = rs.getString("TIPOPRODUTO");
int QUANTIDADE = rs.getInt("QUANTIDADE");
int IDPRODUTO = rs.getInt("IDPRODUTO");
if( rs.wasNull() )
System.out.println( "A Encomenda nº:" + NR + " não existe.");
else
System.out.println("Id Produto: " + IDPRODUTO + " Tipo de Produto " + TIPOPRODUTO + " Fabricante: " + FABRICANTE + " Modelo: " + MODELO + " Preço: " + PRECO + " Quantidade: " + QUANTIDADE );
}

rs.close();
stmt.close();
c.close();
}
catch (Exception e) {
System.err.println( e.getClass().getName()+": "+ e.getMessage() );
System.exit(0);
}
}

最佳答案

首先,您必须验证NR 中的内容是一个数字,而不是不能用作数字的字符串。

int num = Integer.parseInt( NR );

您在下面有一个包罗万象的语句,所以如果您在该语句中遇到 NumberFormatException,它将被它捕获。但是,当然,如果您愿意,您可以添加一个内部 catch 来处理这种情况并要求用户提供新的输入。

下一步是不要使用单引号。而不是:

                    " WHERE ENCOMENDA = '"+ NR +"' ";

你必须使用

                    " WHERE ENCOMENDA = "+ num +" ";

没有告诉数据库系统这是字符串 '3' 而不是数字 3 的单引号。使用包含您之前解析的数字的 num 变量。

这应该可以解决您的问题。不过强烈推荐给use a prepared statement而不是尝试直接根据用户输入构建查询。准备好的语句可保护您免受各种黑客攻击或普通用户错误的侵害,并且在您一次又一次地重复相同查询时效率更高。

关于java - 'INTEGER'和 'CHAR (UCS_BASIC)' java数据库比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27464661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com