Posso excluir, inserir e atualizar meu programa e tento fazer uma inserção chamando um procedimento armazenado criado do meu banco de dados.
Esta inserção de botão faz o trabalho bem.
private void btnAdd_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(dc.Con);
SqlCommand cmd = new SqlCommand("Command String", con);
da.InsertCommand = new SqlCommand("INSERT INTO tblContacts VALUES (@FirstName, @LastName)", con);
da.InsertCommand.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
da.InsertCommand.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;
con.Open();
da.InsertCommand.ExecuteNonQuery();
con.Close();
dt.Clear();
da.Fill(dt);
}
Este é o início do botão para chamar o procedimento nomeado sp_Add_contact
para adicionar um contato. Os dois parâmetros para sp_Add_contact(@FirstName,@LastName)
. Eu procurei no google por um bom exemplo, mas não achei nada interessante.
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(dc.Con);
SqlCommand cmd = new SqlCommand("Command String", con);
cmd.CommandType = CommandType.StoredProcedure;
???
con.Open();
da. ???.ExecuteNonQuery();
con.Close();
dt.Clear();
da.Fill(dt);
}
c#
asp.net
sql-server
stored-procedures
ado.net
FrankSharp
fonte
fonte
Respostas:
É praticamente o mesmo que executar uma consulta. No seu código original, você está criando um objeto de comando, colocando-o na
cmd
variável e nunca o utilizando. Aqui, no entanto, você usará isso em vez deda.InsertCommand
.Além disso, use a
using
para todos os objetos descartáveis, para ter certeza de que eles são descartados corretamente:fonte
ExecuteReader
ouExecuteScalar
para chamá-lo.ExecuteReader
.Você precisa adicionar parâmetros, pois é necessário que o SP execute
fonte
parameter.Value = txtfirstname
.cmd.Parameters.Add(String parameterName, Object value)
está obsoleto agora. Em vez disso, usecmd.Parameters.AddWithValue(String parameterName, Object value)
Add (String parameterName, Object value) foi preterido. Use AddWithValue (String parameterName, Object value)
fonte
cmd.Parameters.Add
foi descontinuada?Add
qual também não é preterida.AddWithValue
também não é a melhor maneira, pois infere o tipo do parâmetro a partir do valor do parâmetro. Isso geralmente leva a planos de execução incorretos ou conversões incorretas. Também não valida o parâmetro em primeiro lugar (tipo fe se,Datetime
mas você passa aString
). Você pode ver aqui que apenas o argumentoAdd
que levaObject
como segundo é preterido.AddWithValue
tem apenas a mesma funcionalidade queAdd
comObject
, mas não é a maneira preferida. Ambos precisam inferir o tipo.Como alternativa, tenho uma biblioteca que facilita o trabalho com procs: https://www.nuget.org/packages/SprocMapper/
fonte
fonte
Os .NET Data Providers consistem em várias classes usadas para conectar-se a uma fonte de dados, executar comandos e retornar conjuntos de registros. O objeto de comando no ADO.NET fornece vários métodos Execute que podem ser usados para executar as consultas SQL em uma variedade de modas.
Um procedimento armazenado é um objeto executável pré-compilado que contém uma ou mais instruções SQL. Em muitos casos, os procedimentos armazenados aceitam parâmetros de entrada e retornam vários valores. Os valores dos parâmetros podem ser fornecidos se um procedimento armazenado for gravado para aceitá-los. Um procedimento armazenado de amostra com aceitação do parâmetro de entrada é fornecido abaixo:
O procedimento armazenado acima está aceitando o nome de um país (@COUNTRY VARCHAR (20)) como parâmetro e retorna todos os editores do país de entrada. Depois que o CommandType estiver definido como StoredProcedure, você poderá usar a coleção Parameters para definir parâmetros.
O código acima passando o parâmetro country para o procedimento armazenado do aplicativo C #.
fonte