코딩하는호돌이
10
2021-11-25 21:54:06
3
110

부적합한 열뜨는데 한번만 봐주실수있을까요?


 


안녕하세요 한참 코딩배우고있는 학생입니다. 채팅프로그램 만들고있는데 DB에  데이터넣는게 쉽지가않네여.. 어케하면좋을지 알려주시면 감사하겠습니다.!!



  MessageCheck.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.PrintWriter" %>
<%@page import="catting.BoardDAO"%>
<%@page import="catting.BoardVO"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

</head>
<body>
	<%
		BoardDAO dao = new BoardDAO();
	   	BoardVO vo = new BoardVO();
		String message = request.getParameter("messageWindow");
		PrintWriter ou = response.getWriter();
		System.out.println("메세지받기완료");
		ou.print(message);
		String user_id="jun";//내아이디
		String id="ho";//상대아이디
		String name="hojun";
		dao.setMessage(name, message, user_id, id);
		
	%>
</body>
</html>


BoardDAO.java


package catting;

import user.UserVO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDAO {
	private Connection con;
    private PreparedStatement pstmt;
    private DataSource dataFactory;
    
    public BoardDAO() {
    	System.out.println("오류검출DB");
    	 try {
             Context ctx = new InitialContext();
             Context envContext = (Context) ctx.lookup("java:/comp/env");
             dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
          } catch (Exception e) {
        	
             e.printStackTrace();
          }
    }
    public  ArrayList<UserVO> friendlist() {
		
        String query = "select * from chat_members";
        ArrayList<UserVO> list = new ArrayList<UserVO>();
    	try {
    		con = dataFactory.getConnection();
    		pstmt = con.prepareStatement(query);
            ResultSet rs = pstmt.executeQuery();
    
            while(rs.next()) {
            
            	UserVO vo = new UserVO();
            	vo.setId(rs.getString(1));
            	vo.setPw(rs.getString(2));
            	vo.setName(rs.getString(3));
            	vo.setPhone1(rs.getString(4));
            	vo.setPhone2(rs.getString(5));
            	vo.setPhone3(rs.getString(6));
            	list.add(vo);
            	
            }
    	}catch(Exception e) {
    	
    		e.printStackTrace();
    	}
    	return list;
    }
    
	public int getNext() {
		//현재 게시글을 내림차순으로 조회하여 가장 마지막 글의 번호를 구한다.
		String sql="select indexid from chatting order by indexid desc";
		try {
			 pstmt=con.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			if(rs.next()) {
				System.out.println("번호부여");
				return rs.getInt(1)+1;
			
			}	
			return 1;
		}catch(Exception e) {
			e.printStackTrace();
		}
		return -1;//데이터베이스 오류
	}
	public void setMessage(String name,String message,String user_id,String id) {
		String sql="insert into chatting values(?, ?, ?, ?, ?)";
		try {

			 con = dataFactory.getConnection();
			 pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, getNext());
			System.out.println(name);
			pstmt.setString(2,"임의값");
			pstmt.setString(3,"임의값");
			pstmt.setString(4,"임의값");
			pstmt.setString(5,"김호준");
			System.out.println("데이터입력");
			 pstmt.executeUpdate();
		}catch(Exception e) {
			e.printStackTrace();
		}
	
	}

 
}


oracle 테이블 이름은 오타없구요
속성은 indexid(number),name(varchar2),context(varchar2),id(varchar2),id2(varchar2)입니다 
제가 확인한다고 진짜 수십번을봤는데 모르겠네여
오류는 부적합한 열하면서  pstmt.setString(2,"임의 값");데이터 넣을때부터 안되더라구여 ㅜㅜ

선생님들 부탁드리겠습니다!! 

0
  • 답변 3

  • 라이칸
    814
    2021-11-26 09:51:36

    들어가는 자리수가 몇자리인지 보시고 아스키값설정 한번확인하시고

    아니면 영어문자한번넣어보시고 

    그냥 디비에서 쿼리로 insert 도 되는지 확인해보시고 다시 생각해보시는것도 좋을거같네요..

  • Unknown_
    501
    2021-11-26 10:04:19

    조금 더 정확한 오류 내역이 필요하겠는데요... 다만, 저도 그랬고 저를 거쳐간 후배님들도 그랬고 주변 지인들도 그랬던 것이, 처음에는 오류 내역 해석하는데 어려움이 당연히 있습니다. 천천히 번역기 돌려가면서 구글링 하시다보면 금방 찾으실거에요.

    부적합한 열 오류라면, 거의 대부분 개발자 잘못입니다. 스키마 설계가 잘못 되었거나, 본인은 정말로 눈치채기 힘든 오타라던가... ㅋㅋ 위엣분 말씀대로, 작성하신 query를 db에 깡으로 insert 해보세요. 아마 거기서 문제를 찾으실 확률이 높습니다.

  • 코딩하는호돌이
    10
    2021-11-27 19:13:14
     private PreparedStatement pstmt;

    이걸 전역변수? 로선언해서 밑에서

    public int getNext() {
    		//현재 게시글을 내림차순으로 조회하여 가장 마지막 글의 번호를 구한다.
    		String sql="select indexid from chatting order by indexid desc";
    		try {
    			 pstmt=con.prepareStatement(sql);
    			ResultSet rs = pstmt.executeQuery();
    			if(rs.next()) {
    				System.out.println("번호부여");
    				return rs.getInt(1)+1;
    			
    			}	
    			return 1;
    		}catch(Exception e) {
    			e.printStackTrace();
    		}
    		return -1;//데이터베이스 오류
    	}
    	public void setMessage(String name,String message,String user_id,String id) {
    		String sql="insert into chatting values(?, ?, ?, ?, ?)";
    		try {
    
    			 con = dataFactory.getConnection();
    			 pstmt = con.prepareStatement(sql);
    			pstmt.setInt(1, getNext());
    			System.out.println(name);
    			pstmt.setString(2,"임의값");
    			pstmt.setString(3,"임의값");
    			pstmt.setString(4,"임의값");
    			pstmt.setString(5,"김호준");
    			System.out.println("데이터입력");
    			 pstmt.executeUpdate();
    		}catch(Exception e) {
    			e.printStackTrace();
    		}
    	
    	}

    setMessage 에서 쿼리한번쓰는데 그담에 getNext에서 또 쿼리 넣어줘서 부적합한 열뜬거였어요 각 메소드마다 PreparedStatement pstmt; 이거 선언해주고하니까 잘됩니다!! 답변 감사드려요 담에 참고할때 쓰도록하겠습니다!



  • 로그인을 하시면 답변을 등록할 수 있습니다.