Dúvida BD

5 respostas
X

Bom dia pessoal,

Estou fazendo upload de arquivo para o servidor.
Depois de feito o upload, armazeno informações do arquivo em um BD. O BD vai gerar um número de ID.

Para mim consultar o ID deste documento estou fazendo informationFile(“nomeFile”);

MASSSS, o BD pode ter varios documentos com o mesmo nome… Tem como capturar o ID do arquivo logo quando os dados são gravados? ou existe outra prática para tratar o ID?

Agradecido…
Abço.

5 Respostas

xcah

Não sei como que você faz a conexão com o BD, ou qual BD é, mas você poderia usar Stored Procedures (como mexo com SQL Server não sei se em outros BDs é esse mesmo nome ou se tem algo do tipo) e criar um parâmetro de retorno (no SQL Server, tipo OUT). Aí você nessa stored procedure selecionava do banco de dados o id que foi posto (a não ser que você mesmo determine o id, não seja automático e tal) e jogava pra essa variável. No Java, você usando o CallableStatement você colocava cs.registerOutParameter(posiçãodoargumento, tiposql) e pegava o valor com cs.gettiposql

X

Saquei, parece que pode ser uma boa alternativa, por acaso tem algum exemplo simples que possa me dar?

Uso o mysql, o Id está sendo gerado pelo proprio banco.

xcah

Ok, então nunca mexi no mysql, então vou dar um exemplo do sql server mesmo… deve dar pra adaptar…

Aqui estou criando uma stored procedure que insere numa tabela de Usuarios apenas o nome, e retornará o id. Só constando, o @ antes do nome significa que é uma variável. As linhas depois da declaração da procedure estão declarando novas variáveis, a procedure receberá apenas o nome. Observe que tem o OUT após a segunda variável, indicando que ela é de retorno.

CREATE PROCEDURE [dbo].[pcIns_Usuario] 

	@nome VARCHAR(20),
	@retornaid INT OUT,
AS
BEGIN
				INSERT INTO tblUsuario VALUES (@nome)
				SELECT @retornaid = usuarioid FROM tblUsuario WHERE nome = @nome
			
END

No Java:

public int inserir(String strNome) // método inserir da classe UsuarioDAO
	{
		Connection conn = ConexaoCON.conectar(); // conecto com o BD
		int retorno; // retorno que será o id, retornarei para qualquer lugar que chamar este método 
				
		try {
			CallableStatement cs = conn.prepareCall("{call pcIns_Usuario(?,?)}"); // observe que a interrogação ("?") se refere aos parâmetros que serão passados/obtidos da procedure
			cs.setString(1, strNome); // aqui o parâmetro é o que será passado para a procedure para inserir 
			cs.registerOutParameter(2, java.sql.Types.INTEGER); // aqui é o que será recebido
                                                            // o 1 ou o 2 nesses métodos se refere a POSIÇÃO/ORDEM do parâmetro: cs.setString(1, strNome) o 1 é a posição, o strNome é a String que será o nome inserido na tabela tblUsuario, no cs.registerOutParameter(2, java.sql.Types.INTEGER) o 2 é a posição, o java.sql.Types.INTEGER é o tipo de parâmetro nos valores do sql que será retornado, no caso aqui inteiro
			
			cs.execute(); // executo a chamada à procedure
			
			retorno = cs.getInt(2); // jogo para a variável retorno o valor recebido (o id) 
			
			
			fecharConexao(); // método que eu chamo que fecha tudo 
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			retorno = 0;
			e.printStackTrace();
		}
		
		return retorno; // retorno o id se houver sucesso
	}

Eu aí fiz insert, mas com update é o mesmo esquema, basicamente o nome da procedure e a instrução nela que mudam, só que no update você não passa já o id?
Se for útil, tenho alguns links aqui com explicações/exemplos com CallableStatement e procedures:

http://javafree.uol.com.br/topic-861463-Executar-Stored-Procedure-Sql-Server-2005.html
http://docsrv.sco.com/JDK_guide/jdbc/getstart/callablestatement.doc.html
http://w3processing.com/index.php?subMenuItemId=218
http://onjava.com/pub/a/onjava/2003/08/13/stored_procedures.html

X

Cara, muito Obrigado, explicação igual essa vai ser dificil achar.
Mas se tiver 2 nomes iguais no banco?

Abraço, e mais uma vez, muito obrigado.

xcah

Nada ^^ …

ahh foi só um exemplo, provavelmente você deve ter outros campos diferentes que possam diferenciar… mas agora bem pensado, se tivesse apenas um campo que pudesse se repetir (como no meu exemplo) teria que ver… talvez tenha alguma outra forma de pegar o id junto com a inserção mesmo… você poderia pegar o último id inserido logo em seguida (não sei qual a função que se usa), se é autoincrement né, aí seria o que você acabou de colocar, mas tem um problema de que se houverem vários usuários inserindo ao mesmo tempo pode pegar errado, a não ser que você dê um lock de alguma forma na tabela (ou ela não permita mais de uma alteração simultânea automaticamente, ai tem que ver…) … enfim, se esse for o caso, de todos os campos poderem se duplicar na tabela (dois registros exatamente iguais, exceto o id) aí não saberia direito como funcionaria…

^^

Criado 5 de setembro de 2011
Ultima resposta 5 de set. de 2011
Respostas 5
Participantes 2