Problema ao Inserir no BD SQL Server 2005 com Procedures

Olá gente, tudo bem??

Estou tentando persistir alguns dados no banco mas estou tendo problema… Da uma exceção de java.lang.NullPointerException no catch (Exception)

Estou tentando inserir pelo meio de procedures do BD, mas msm pelo modo convencional, fazendo um INSERT INTO pelo java dá o mesmo problema…

vou colocar minhas classes abaixo

[color=red] DAO Paciente - Método Cadastrar[/color]

public class DAOPaciente extends DAO_Generico
{
	private static Connection connection;
	
	public boolean cadastrar(Pacientes pac) 
	{
		connection = Conexao.conectar();
		
		try
		{	 
			/*String sqlInsert = "INSERT INTO PFC_PACIENTES (NOME_PAC, RG_PAC,CPF_PAC,LOGRADOURO_PAC) VALUES ('"+pac.getNome()+"','"+
								pac.getRg()+"','"+pac.getCpf()+"','"+pac.getEndereco().getLogradouro()+"'";*/
			String sqlInsert = "EXEC INSEREPACIENTE '" +pac.getNome()+"','"+pac.getRg()+"','"+pac.getOrgaoExped()+"',"+pac.getDataExpedicao()+
					"','"+pac.getCpf()+","+pac.getEndereco().getLogradouro()+"','"+pac.getEndereco().getNumero()+"','"+pac.getEndereco().getComplemento()+
					"','"+pac.getEndereco().getCep()+"','"+pac.getEndereco().getBairro()+"','"+pac.getEndereco().getCidades().getID()+"','"+
					pac.getEndereco().getCidades().getEstados().getID()+"','"+pac.getContato().getTelefone1()+"','"+pac.getContato().getFax()+"','"+
					"','"+pac.getContato().getTelefone2()+"','"+pac.getEmail().getEmail()+"','"+pac.getDataNascimento()+",'"+pac.getSexo()+"','"+
					pac.getEstadoCivil()+"','"+pac.getEtnia()+"','"+pac.getProfissao()+"','"+pac.getNaturalidade()+"','"+pac.getNacionalidade()+
					"',"+pac.getStatus()+"',"+pac.getFoto()+"'";  
			
			JOptionPane.showMessageDialog(null, "-chegou aqui-");

			statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			
			
			int cadastrado=statement.executeUpdate(sqlInsert);
			if (cadastrado==1)
				{JOptionPane.showMessageDialog(null, "cadastrado");
				return true;}
			else
			{JOptionPane.showMessageDialog(null, "erro: ");
				return false;}
		}catch (SQLException erro)
		{
			JOptionPane.showMessageDialog(null, "Erro de Gravação dos dados. "+erro);
			return false;
		}catch (Exception erro)	
		{
			JOptionPane.showMessageDialog(null, "Erro: "+erro);
			return false;
		}
	}	 

[color=red]Classe de conexão[/color]

package br.com.sistemamedico.utilitarios;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.swing.JOptionPane;

public class Conexao
{	
			
			private static String driver="net.sourceforge.jtds.jdbc.Driver";
			private static String url="jdbc:jtds:sqlserver://localhost:1433/PFC";
			private static String usuario="sa";
			private static String senha="a1b2c3d4";
						
		public static Connection conectar()
		{
			try
			{
				Class.forName(driver);	
				return DriverManager.getConnection(url,usuario,senha);
				
			}catch(ClassNotFoundException Driver)
			{
				JOptionPane.showMessageDialog(null, "Driver do banco não foi encontrado. "+Driver);
			}catch (SQLException Banco)
			{
				JOptionPane.showMessageDialog(null, "Erro de Manipulação do banco. "+Banco);
			}
			return null;
		}
}

[color=red]Minha tabela do BD[/color]

CREATE TABLE PFC_Pacientes
(
	ID_Pac INT IDENTITY,
	Nome_Pac VARCHAR(200) NOT NULL,
	RG_Pac VARCHAR(12) NOT NULL,
	RG_OE_Pac VARCHAR(10),
	RG_Emissao_Pac SMALLDATETIME,
	CPF_Pac VARCHAR(11) NOT NULL,
	Logradouro_Pac VARCHAR(200) NOT NULL,
	Numero_Pac VARCHAR(5) NOT NULL,
	Complemento_Pac VARCHAR(150),
	CEP_Pac VARCHAR(9),
	Bairro_Pac VARCHAR(100) NOT NULL,
	Cidade_Pac INT NOT NULL,
	Estado_Pac INT NOT NULL,
	TelefoneR_Pac VARCHAR(11) NOT NULL,
	TelefoneComl_Pac VARCHAR(11),
	TelefoneC_Pac VARCHAR(11),
	Fax_Pac VARCHAR(11),
	Email_Pac VARCHAR(100),
	DataNasc_Pac SMALLDATETIME NOT NULL,
	Sexo_Pac VARCHAR(1) NOT NULL,
	EstadoCivil_Pac VARCHAR(20) NOT NULL,
	Etnia_Pac VARCHAR(20),
	Prof_Pac INT NOT NULL,
	Naturalidade_Pac VARCHAR(50),
	Nacionalidade_Pac VARCHAR(50),
	Status_Pac BIT NOT NULL,
	Foto_Pac VARCHAR(300),

	CONSTRAINT PK_Paciente PRIMARY KEY (ID_Pac),
	CONSTRAINT UQ_RG_Pac UNIQUE (RG_Pac),
	CONSTRAINT UQ_CPF_Pac UNIQUE (CPF_Pac),	
	CONSTRAINT FK_Estado_Pac FOREIGN KEY (Estado_Pac) REFERENCES PFC_Estados (ID_Estado),
	CONSTRAINT FK_Cidade_Pac FOREIGN KEY (Cidade_Pac) REFERENCES PFC_Cidades (ID_Cidade),
	CONSTRAINT FK_Prof_Pac FOREIGN KEY (Prof_Pac) REFERENCES PFC_Profissoes (ID_Prof)
)

[color=red]Minha Procedure do BD[/color]

CREATE PROCEDURE InserePaciente
@nome VARCHAR(200),
@RG VARCHAR(12),
@RG_OE VARCHAR(10),
@RG_Emissao SMALLDATETIME,
@CPF VARCHAR(11),
@logradouro VARCHAR(200),
@numero VARCHAR(5),
@complemento VARCHAR(150),
@CEP VARCHAR(9),
@bairro VARCHAR(100),
@cidade INT,
@estado INT,
@telefoneR VARCHAR(11),
@telefoneComl VARCHAR(11),
@telefoneC VARCHAR(11),
@fax VARCHAR(11),
@email VARCHAR(100),
@dataNasc SMALLDATETIME,
@sexo VARCHAR(1),
@estadoCivil VARCHAR(20),
@etnia VARCHAR(20),
@prof INT,
@naturalidade VARCHAR(50),
@nacionalidade VARCHAR(50),
@status BIT,
@foto VARCHAR(300)
AS
BEGIN TRANSACTION
	INSERT PFC_Pacientes (Nome_Pac,RG_Pac,RG_OE_Pac,RG_Emissao_Pac,CPF_Pac,Logradouro_Pac,
						Numero_Pac,Complemento_Pac,CEP_Pac,Bairro_Pac,Cidade_Pac,Estado_Pac,
						TelefoneR_Pac,TelefoneComl_Pac,TelefoneC_Pac,Fax_Pac,Email_Pac,
						DataNasc_Pac,Sexo_Pac,EstadoCivil_Pac,Etnia_Pac,Prof_Pac,Naturalidade_Pac,
						Nacionalidade_Pac,Status_Pac,Foto_Pac)
	VALUES (@nome,@RG,@RG_OE,@RG_Emissao,@CPF,@logradouro,@numero,@complemento,@CEP,@bairro,@cidade,
			@estado,@telefoneR,@telefoneComl,@telefoneC,@fax,@email,@dataNasc,@sexo,@estadoCivil,
			@etnia,@prof,@naturalidade,@nacionalidade,@status,@foto)
	IF (@@error <> 0)
	BEGIN
		ROLLBACK TRANSACTION
		RAISERROR('Erro de inserção na tabela "Pacientes"',16,1)
		RETURN
	END
COMMIT TRANSACTION
go

Explicando… minha view está em flex… faço os inserts pelo flex msm (possuo as classes espelhos em AS) e mando pro java… jah coloquei uns showmessagedialog para ver se os dados estão “setados” de forma certa e estão…

Qdo coloco o showmessage logo abaixo da String q recebe o comando SQL esse showmessage naum é apresentado e vai para a excessão… se coloco na linha acima ele aparece normal…

Se puderem me ajudar agradeço muito…

att.

Junior

Boa tarde.

NullPointerExcepetion, ou seja, está tentando acessar um valor através de uma referência/variavél nula. Provavél que seja a referência pac, em algum momento está dando um get sendo que ela possui um valor nulo.

Dê uma atenção a isso.
Abraços! :slight_smile:

na mosca, meu amigo…rs

mas deixe-me então fazer-lhe outra pergunta. Como não preciso preencher todos os campos que não são obrigatorios na minha view como faço para q, na hora de inserir não de esse problema?

deixo setado algum valor na classe msm ou vejo qual campo não foi preenchido na view e seto o atributo correspondente com NULL?

Pq vc não usa o CallableStatement do que o statement?

nas minhas pesquisas encontrei esse CALLABLESTATEMENT … não o conhecia…

qual a diference dele?

rs…bom não é?

Então, eu diria o seguinte: veja quais campos são obrigatórios para a inserção, caso um destes campos chegue ao seu DAO nulo, lance uma excessão indicando o campo. Os que não são obrigatórios, você pode fazer tratamento.
Utilize o StringBuffer ou StringBuilder para montar sua query com os if-else aninhados.

Exemplo:

[code]
StringBuffer sb = new StringBuffer();
sb.append(“Insert …”);
//aqui começa os seus if´s - elses

//transforma o StringBuffer em uma string - concatena todo o contéudo do StringBuffer.
String s = sb.toString();[/code]

Era mais ou menos isso que voce queria?
Abraçoss

A diferença do CallableStatement para Statement ou PreparedStatement, é que o CallableStatement é voltada para as Stored Procedures, então para isso ela herda todos os métodos set e get de PreparedStatement, mas ela é voltada para as Stored Procedures, a API do Java diz o seguinte: “A interface usada para executar Stored Procedures de SQL”. Enquanto no PreparedStatement nós colocamos as nossas instruções de SQL normalmente.
Bom, qualquer dúvida da uma conferida pela net para procurar exemplos de código feito com CallableStatement.

Bom, espero que tenha servido de ajuda.