我已将此程序连接到我的数据库,每次尝试运行它时都会显示此错误:
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
,而且工作正常。
表ENCOMENDAS
中的列DETALHES_ENCOMENDA
是一个类似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);
}
}
答案 0 :(得分:0)
首先,您必须验证NR
中的内容是否为数字,而不是不能用作数字的字符串。
int num = Integer.parseInt( NR );
下面有一个包罗万象的声明,所以如果你在该声明中得到NumberFormatException
,它就会被它捕获。但是,当然,如果您愿意,可以添加内部catch
来处理情况并要求用户输入新内容。
下一阶段不使用单引号。而不是:
" WHERE ENCOMENDA = '"+ NR +"' ";
你必须使用
" WHERE ENCOMENDA = "+ num +" ";
没有单引号告诉数据库系统这是字符串'3'
而不是数字3
。使用包含您之前解析的数字的num
变量。
这应该可以解决您的问题。但是,强烈建议use a prepared statement而不是尝试直接从用户输入构建查询。准备好的语句可以保护您免受各种黑客攻击或普通用户错误的影响,并且当您一次又一次地重复相同的查询时也会更有效。