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

  显示原文与译文双语对照的内容
0 0

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


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,我已经尝试了很多东西,但甚至没有一个工作

你们能帮我?

谢谢!


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

时间: 原作者:

0 0

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


int num = Integer.parseInt( NR );

在下面的语句中,如果获得了 NumberFormatException,则会捕获一个catch所有语句。 但当然,你可以添加一个内部 catch 来处理这种情况,并要求用户输入新的输入。

下一阶段是 ,不要使用单引号。 替代:


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

你必须用


" WHERE ENCOMENDA ="+ num +"";

如果没有告诉数据库系统这是字符串 '3' 而不是 3的单引号。 使用包含你先前分析过的数字的num 变量。

这应该能解决你的问题。 但是,强烈建议使用预准备语句,而不是直接从用户输入构建查询。 准备语句保护你防止所有黑客尝试或者普通用户错误,重复同一查询时更高效。

原作者:
...