Ich kann in meinem Programm ein Löschen, Einfügen und Aktualisieren durchführen, und ich versuche, ein Einfügen durch Aufrufen einer erstellten gespeicherten Prozedur aus meiner Datenbank durchzuführen.
Diesem Knopfeinsatz mache ich gut.
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);
}
Dies ist der Beginn der Schaltfläche, mit der die Prozedur sp_Add_contact
Aufgerufen wird, um einen Kontakt hinzuzufügen. Die beiden Parameter für sp_Add_contact(@FirstName,@LastName)
. Ich habe auf Google nach einem guten Beispiel gesucht, aber nichts Interessantes gefunden.
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);
}
Es ist so ziemlich dasselbe wie das Ausführen einer Abfrage. In Ihrem ursprünglichen Code erstellen Sie ein Befehlsobjekt, setzen es in die Variable cmd
und verwenden es niemals. Hier verwenden Sie jedoch das anstelle von da.InsertCommand
.
Verwenden Sie auch ein using
für alle Einwegobjekte, damit Sie sicher sind, dass sie ordnungsgemäß entsorgt werden:
private void button1_Click(object sender, EventArgs e) {
using (SqlConnection con = new SqlConnection(dc.Con)) {
using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;
con.Open();
cmd.ExecuteNonQuery();
}
}
}
Sie müssen Parameter hinzufügen, da dies für die Ausführung von SP erforderlich ist
using (SqlConnection con = new SqlConnection(dc.Con))
{
using (SqlCommand cmd = new SqlCommand("SP_ADD", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@FirstName", txtfirstname);
cmd.Parameters.AddWithValue("@LastName", txtlastname);
con.Open();
cmd.ExecuteNonQuery();
}
}
cmd.Parameters.Add(String parameterName, Object value)
ist jetzt veraltet. Verwenden Sie stattdessen cmd.Parameters.AddWithValue(String parameterName, Object value)
Es gibt keinen Unterschied in Bezug auf die Funktionalität. Der Grund, warum sie
cmd.Parameters.Add(String parameterName, Object value)
zugunsten vonAddWithValue(String parameterName, Object value)
abgelehnt haben, liegt in der besseren Übersichtlichkeit. Hier ist die MSDN-Referenz für das gleiche
private void button1_Click(object sender, EventArgs e) {
using (SqlConnection con = new SqlConnection(dc.Con)) {
using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
cmd.Parameters.AddWithValue("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;
con.Open();
cmd.ExecuteNonQuery();
}
}
}
Als Alternative habe ich eine Bibliothek, mit der es einfach ist, mit procs zu arbeiten: https://www.nuget.org/packages/SprocMapper/
SqlServerAccess sqlAccess = new SqlServerAccess("your connection string");
sqlAccess.Procedure()
.AddSqlParameter("@FirstName", SqlDbType.VarChar, txtFirstName.Text)
.AddSqlParameter("@FirstName", SqlDbType.VarChar, txtLastName.Text)
.ExecuteNonQuery("StoreProcedureName");
public void myfunction(){
try
{
sqlcon.Open();
SqlCommand cmd = new SqlCommand("sp_laba", sqlcon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
sqlcon.Close();
}
}