INCLUIR REGISTRO NO SQL SERVER

LUIS.HERRERA 27/02/2013 17:16:25
#419692
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?
LLAIA 27/02/2013 18:14:26
#419694
Resposta escolhida
Existe um vírgula depois de @INATIVO. Seria isso?

 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;
}
LUIS.HERRERA 28/02/2013 10:09:05
#419716
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.
Tópico encerrado , respostas não são mais permitidas