Mogę usunąć, wstawić i zaktualizować w moim programie i spróbować wstawić, wywołując utworzoną procedurę składowaną z mojej bazy danych.
Ta wkładka guzikowa, którą wykonuję, działa dobrze.
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);
}
To jest początek przycisku wywołującego procedurę o nazwie w sp_Add_contact
celu dodania kontaktu. Dwa parametry dla sp_Add_contact(@FirstName,@LastName)
. Szukałem w Google dobrego przykładu, ale nie znalazłem nic interesującego.
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
źródło
źródło
Odpowiedzi:
To prawie to samo, co uruchomienie zapytania. W swoim oryginalnym kodzie tworzysz obiekt polecenia, umieszczasz go w
cmd
zmiennej i nigdy go nie używasz. Tutaj jednak użyjesz tego zamiastda.InsertCommand
.Użyj również
using
dla wszystkich przedmiotów jednorazowego użytku, aby mieć pewność, że są one prawidłowo utylizowane:źródło
ExecuteReader
lub,ExecuteScalar
aby to nazwać.ExecuteReader
.Musisz dodać parametry, ponieważ jest to potrzebne do wykonania SP
źródło
parameter.Value = txtfirstname
.cmd.Parameters.Add(String parameterName, Object value)
jest teraz przestarzała. Zamiast tego użyjcmd.Parameters.AddWithValue(String parameterName, Object value)
Funkcja Add (nazwa parametru ciągu, wartość obiektu) została wycofana. Użyj AddWithValue (nazwa parametru ciągu, wartość obiektu)
źródło
cmd.Parameters.Add
jest przestarzałe?Add
które również nie jest przestarzałe.AddWithValue
również nie jest najlepszym sposobem, ponieważ określa typ parametru z wartości parametru. Często prowadzi to do złych planów wykonania lub nieprawidłowych konwersji. Nie sprawdza też w pierwszej kolejności parametru (np. Wpisz if,Datetime
ale przekażesz aString
). Widać tutaj, że tylko ten,Add
który przyjmujeObject
jako drugi argument, jest przestarzały.AddWithValue
ma taką samą funkcjonalność jakAdd
zObject
, ale nie jest to preferowany sposób. Obaj muszą wywnioskować typ.Jako alternatywę mam bibliotekę, która ułatwia pracę z procs: https://www.nuget.org/packages/SprocMapper/
źródło
źródło
Dostawcy danych .NET składają się z wielu klas używanych do łączenia się ze źródłem danych, wykonywania poleceń i zwracania zestawów rekordów. Obiekt polecenia w ADO.NET udostępnia szereg metod Execute, których można używać do wykonywania zapytań SQL na różne sposoby.
Procedura składowana to wstępnie skompilowany obiekt wykonywalny, który zawiera co najmniej jedną instrukcję SQL. W wielu przypadkach procedury składowane akceptują parametry wejściowe i zwracają wiele wartości. Wartości parametrów można podać, jeśli zapisano procedurę składowaną w celu ich akceptacji. Przykładowa procedura składowana z akceptacją parametru wejściowego jest podana poniżej:
Powyższa procedura składowana akceptuje nazwę kraju (@COUNTRY VARCHAR (20)) jako parametr i zwraca wszystkich wydawców z kraju wejściowego. Po ustawieniu CommandType na StoredProcedure można użyć kolekcji Parameters do zdefiniowania parametrów.
Powyższy kod przekazujący parametr kraju do procedury składowanej z aplikacji C #.
źródło