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

时间:2014-12-13 23:15:47

标签: java mysql sql string integer

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

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

1 个答案:

答案 0 :(得分:0)

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

int num = Integer.parseInt( NR );

下面有一个包罗万象的声明,所以如果你在该声明中得到NumberFormatException,它就会被它捕获。但是,当然,如果您愿意,可以添加内部catch来处理情况并要求用户输入新内容。

下一阶段不使用单引号。而不是:

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

你必须使用

                    " WHERE ENCOMENDA = "+ num +" ";

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

这应该可以解决您的问题。但是,强烈建议use a prepared statement而不是尝试直接从用户输入构建查询。准备好的语句可以保护您免受各种黑客攻击或普通用户错误的影响,并且当您一次又一次地重复相同的查询时也会更有效。