INCLUIR REGISTRO NO SQL SERVER
Tentei 2 exemplos que achei, mas ambos dão erro e não inclui o dado na tabela.
A tabela é simples
ID ( smallint, autoincremento), DEPTO(nvarchar,50), INATIVO (bit)
Teste 1
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandType = CommandType.StoredProcedure;
// nome da stored procedure
cmd.CommandText = [Ô]insere_departamento[Ô];
// parâmetros da stored procedure
SqlParameter pid = new SqlParameter([Ô]@ID[Ô], SqlDbType.SmallInt);
pid.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pid);
SqlParameter pdepto = new SqlParameter([Ô]@DEPTO[Ô], SqlDbType.NVarChar, 50);
pdepto.Value = departamento.DEPTO;
cmd.Parameters.Add(pdepto);
SqlParameter pinativo = new SqlParameter([Ô]@INATIVO[Ô], SqlDbType.Bit);
pinativo.Value = departamento.INATIVO;
cmd.Parameters.Add(pinativo);
AbrirConexao();
cmd.ExecuteNonQuery();
departamento.ID = (Int32)cmd.Parameters[[Ô]@id[Ô]].Value;
Teste 2
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
AbrirConexao();
cmd.CommandText = [Ô]insert into DEPARTAMENTOS(DEPTO,INATIVO) values (@DEPTO,@INATIVO,); select @@IDENTITY;[Ô];
cmd.Parameters.AddWithValue([Ô]@DEPTO[Ô], departamento.DEPTO);
cmd.Parameters.AddWithValue([Ô]@INATIVO[Ô], departamento.INATIVO);
departamento.ID = Convert.ToInt32(cmd.ExecuteScalar());
Em ambos os caso o Servidor SQL retorna o erro 512 ou 102 dependendo de mudanças que faço no código. O registro não é gravado.
O que quero fazer é inserir os dados da camada modelos, com uma instrução SQL e retornar o número gerado no banco.
Nota: tenho preferência em incluir o SQL no código e não por Store Procedure.
alguém pode ajudar?
A tabela é simples
ID ( smallint, autoincremento), DEPTO(nvarchar,50), INATIVO (bit)
Teste 1
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandType = CommandType.StoredProcedure;
// nome da stored procedure
cmd.CommandText = [Ô]insere_departamento[Ô];
// parâmetros da stored procedure
SqlParameter pid = new SqlParameter([Ô]@ID[Ô], SqlDbType.SmallInt);
pid.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pid);
SqlParameter pdepto = new SqlParameter([Ô]@DEPTO[Ô], SqlDbType.NVarChar, 50);
pdepto.Value = departamento.DEPTO;
cmd.Parameters.Add(pdepto);
SqlParameter pinativo = new SqlParameter([Ô]@INATIVO[Ô], SqlDbType.Bit);
pinativo.Value = departamento.INATIVO;
cmd.Parameters.Add(pinativo);
AbrirConexao();
cmd.ExecuteNonQuery();
departamento.ID = (Int32)cmd.Parameters[[Ô]@id[Ô]].Value;
Teste 2
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
AbrirConexao();
cmd.CommandText = [Ô]insert into DEPARTAMENTOS(DEPTO,INATIVO) values (@DEPTO,@INATIVO,); select @@IDENTITY;[Ô];
cmd.Parameters.AddWithValue([Ô]@DEPTO[Ô], departamento.DEPTO);
cmd.Parameters.AddWithValue([Ô]@INATIVO[Ô], departamento.INATIVO);
departamento.ID = Convert.ToInt32(cmd.ExecuteScalar());
Em ambos os caso o Servidor SQL retorna o erro 512 ou 102 dependendo de mudanças que faço no código. O registro não é gravado.
O que quero fazer é inserir os dados da camada modelos, com uma instrução SQL e retornar o número gerado no banco.
Nota: tenho preferência em incluir o SQL no código e não por Store Procedure.
alguém pode ajudar?
Existe um vÃrgula depois de @INATIVO. Seria isso?
Vi esse exemplo no site da MS, em que em vez de usar SQL IDENTITY, usa o scope_identity, talvez ajude:
cmd.CommandText = [Ô]insert into DEPARTAMENTOS(DEPTO,INATIVO) values (@DEPTO, @INATIVO , ); select @@IDENTITY;[Ô];
Vi esse exemplo no site da MS, em que em vez de usar SQL IDENTITY, usa o scope_identity, talvez ajude:
static public int AddProductCategory(string newName, string connString)
{
Int32 newProdID = 0;
string sql =
[Ô]INSERT INTO Production.ProductCategory (Name) VALUES (@Name); [Ô]
+ [Ô]SELECT CAST(scope_identity() AS int)[Ô];
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add([Ô]@Name[Ô], SqlDbType.VarChar);
cmd.Parameters[[Ô]@name[Ô]].Value = newName;
try
{
conn.Open();
newProdID = (Int32)cmd.ExecuteScalar();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return (int)newProdID;
}
]static public int AddProductCategory(string newName, string connString)
{
Int32 newProdID = 0;
string sql =
[Ô]INSERT INTO Production.ProductCategory (Name) VALUES (@Name); [Ô]
+ [Ô]SELECT CAST(scope_identity() AS int)[Ô];
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add([Ô]@Name[Ô], SqlDbType.VarChar);
cmd.Parameters[[Ô]@name[Ô]].Value = newName;
try
{
conn.Open();
newProdID = (Int32)cmd.ExecuteScalar();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return (int)newProdID;
}
Leandro funcionou perfeitamente seu exemplo.
Sobre o Entity Framework, là uma introdução do Macoratti e achei (a princÃpio) meio complicado e até mais trabalhoso do que a forma padrão, por exibir o uso de outras ferramentas, assistentes, etc...e talvez com uma manutenção mais complicada?
Obrigado por enquanto, pois outras dúvidas surgirão com certeza.
Sobre o Entity Framework, là uma introdução do Macoratti e achei (a princÃpio) meio complicado e até mais trabalhoso do que a forma padrão, por exibir o uso de outras ferramentas, assistentes, etc...e talvez com uma manutenção mais complicada?
Obrigado por enquanto, pois outras dúvidas surgirão com certeza.
Tópico encerrado , respostas não são mais permitidas