Usuário com melhor resposta
Erro na hora de cadastrar com sql server

Pergunta
-
Estou tendo problemas, mas não sei se é por que não está cadastrando ou não está funcionando o código de consultar...
Eu clico no botão consultar, mas não aparece nada, apenas a mensagem "Dados invalidos"...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;
using System.Drawing.Imaging;
using System.Drawing;
using Microsoft.VisualBasic;
namespace Matricula
{
public partial class telacadastrar : Form
{
public telacadastrar()
{
InitializeComponent();
}
SqlConnection con;
SqlCommand cmd;
SqlDataAdapter adapter;
DataSet ds;
int linhaNumero = 0;
MemoryStream ms;
byte[] foto_array;
void carregaDados()
{
cmd = new SqlCommand("getAlunos", con);
cmd.CommandType = CommandType.StoredProcedure;
adapter = new SqlDataAdapter(cmd);
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
ds = new DataSet();
adapter.Fill(ds, "Alunos");
}
private void telacadastrar_Load(object sender, EventArgs e)
{
if (ds.Tables[0].Rows.Count > 0)
{
texbmatricula.Text = ds.Tables[0].Rows[linhaNumero][0].ToString();
texbnome.Text = ds.Tables[0].Rows[linhaNumero][1].ToString();
texbendereco.Text = ds.Tables[0].Rows[linhaNumero][2].ToString();
picfoto.Image = null;
if (ds.Tables[0].Rows[linhaNumero][3] != System.DBNull.Value)
{
foto_array = (byte[])ds.Tables[0].Rows[linhaNumero][3];
MemoryStream ms = new MemoryStream(foto_array);
picfoto.Image = Image.FromStream(ms);
}
}
else
{
MessageBox.Show("Não há registros na tabela");
}
}
private void button2_Click(object sender, EventArgs e)
{
opf1.Filter = "jpeg|*.jpg|bmp|*.bmp|all files|*.*";
DialogResult res = opf1.ShowDialog();
if (res == DialogResult.OK)
{
picfoto.Image = Image.FromFile(opf1.FileName);
}
}
private void butcadastrar_Click(object sender, EventArgs e)
{
string strcon = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Cadastro.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
con = new SqlConnection(strcon);
cmd = new SqlCommand("inserir_Alunos", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@matricula", texbmatricula.Text);
cmd.Parameters.AddWithValue("@nome", texbnome.Text);
cmd.Parameters.AddWithValue("@endereco", texbendereco.Text);
con.Open();
int n = cmd.ExecuteNonQuery();
con.Close();
if (n > 0)
{
MessageBox.Show("registro inserido com sucesso.");
carregaDados();
}
else
MessageBox.Show("Erro ao inserir registro.");
}
private void butconsultar_Click(object sender, EventArgs e)
{
try
{
int n = Convert.ToInt32(Interaction.InputBox("Informe o código do Aluno:", "Procurar", "1", 450, 400));
DataRow drow;
drow = ds.Tables[0].Rows.Find(n);
if (drow != null)
{
linhaNumero = ds.Tables[0].Rows.IndexOf(drow);
texbmatricula.Text = drow[0].ToString();
texbnome.Text = drow[1].ToString();
texbendereco.Text = drow[2].ToString();
picfoto.Image = null;
if (drow[3] != System.DBNull.Value)
{
foto_array = (byte[])drow[3];
MemoryStream ms = new MemoryStream(foto_array);
picfoto.Image = Image.FromStream(ms);
}
}
else
MessageBox.Show("Registro não localizado.");
}
catch
{
MessageBox.Show("Dados inválidos.");
}
}
}
}
Respostas
-
Fabricio,
Troca o que está nas últimas linhas:
catch { MessageBox.Show("Dados inválidos."); }
e troca por:
Não é a resolução do seu problema, mas com certeza ajuda a resolver.catch(Exception ex) { throw new Exception("Dados inválidos.", ex); }
Samuel Fabel- Marcado como Resposta Fabricio C-Sharp sábado, 6 de novembro de 2010 02:37
Todas as Respostas
-
Olá,
Pelo que percebi, me parece que o problema é que você está tentando utilizar um DataSet nulo no evento clique do Botão de Consultar, ou seja, o seu DataSet é preenchido (fill) através do metodo carregaDados que somente é chamado através do clique do botão de cadastrar e não de consultar, sendo assim me parece que esté código somente funcionária caso você SEMPRE clicasse primeiramente em cadastrar para depois clique em consultar.
Você pode verificar se realmente é isto adicionando um BreakPoint ao evento de clique do botão consultar e veja se o erro ocorre na seguinte linha:
drow = ds.Tables[0].Rows.Find(n);
Fazendo com que caia no catch exibindo a mensagem "Dados inválidos"
Caso este realmente seja o problema, basta que você carregue o dataSet (ds) antes que seus valores sejam utilizados, fazendo a chamada ao metodo carregaDados a partir do evento de clique do botão consultar assim como é feito no clique do botao de cadastrar, ou simplesmente centralizando a carga do dataset no load do formulário.
Caso não consiga identificar que este seja o problema adicione um breakPoint no evento clique do botão cancelar e nos informe em qual linha está acontecendo o erro.
Só mais uma informação é que o metodo Find só encontrará o registro caso exista a chave primária, mas como logo me seguida você verifica se o DataRow é diferente de null não parece estar ai o problema.
Espero ter ajudado
Se o post foi útil marque como resposta. - Advanced Web Application - MCP -
Fabricio,
Troca o que está nas últimas linhas:
catch { MessageBox.Show("Dados inválidos."); }
e troca por:
Não é a resolução do seu problema, mas com certeza ajuda a resolver.catch(Exception ex) { throw new Exception("Dados inválidos.", ex); }
Samuel Fabel- Marcado como Resposta Fabricio C-Sharp sábado, 6 de novembro de 2010 02:37