Вызовите хранимую процедуру с параметром в С#
Я могу удалить, вставить и обновить в своей программе, и я попытаюсь сделать вставку, вызвав созданную хранимую процедуру из моей базы данных.
Это вставка кнопки, я делаю работу хорошо.
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);
}
Это начало кнопки для вызова процедуры с именем sp_Add_contact
, чтобы добавить контакт. Два параметра для sp_Add_contact(@FirstName,@LastName)
. Я искал в Google для хорошего примера, но не нашел ничего интересного.
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);
}
Ответы
Ответ 1
Это почти то же самое, что и выполнение запроса. В исходном коде вы создаете объект команды, помещая его в переменную cmd
и никогда не используете ее. Здесь, однако, вы будете использовать это вместо da.InsertCommand
.
Кроме того, используйте using
для всех одноразовых объектов, чтобы вы были уверены, что они расположены правильно:
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();
}
}
}
Ответ 2
Вам нужно добавить параметры, так как это необходимо для выполнения SP для
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();
}
}
Ответ 3
cmd.Parameters.Add(String parameterName, Object value)
устарел. Вместо этого используйте cmd.Parameters.AddWithValue(String parameterName, Object value)
Добавить (String parameterName, Object value) устарел. Используйте AddWithValue (String parameterName, Object value)
Нет никакой разницы в функциональности. Причина, по которой они устарел cmd.Parameters.Add(String parameterName, Object value)
в пользу AddWithValue(String parameterName, Object value)
, чтобы дать больше ясность. Вот ссылка MSDN для того же
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();
}
}
}
Ответ 4
Добавление параметров по отдельности дало мне проблемы, поэтому я сделал это, и он отлично поработал:
string SqlQ = string.Format("exec sp_Add_contact '{0}', '{1}'", txtFirstName.Text, txtLastName.Text);
using (SqlConnection con = new SqlConnection(dc.Con)) {
using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
con.Open();
cmd.ExecuteNonQuery();
}
}
Ответ 5
В качестве альтернативы у меня есть библиотека, которая упрощает работу с procs: 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");
Ответ 6
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();
}
}
Ответ 7
Поставщики данных .NET состоят из нескольких классов, используемых для подключения к источнику данных, выполнения команд и возврата наборов записей. Объект Command в ADO.NET предоставляет несколько методов Execute, которые могут использоваться для выполнения SQL-запросов в различных моделях.
Хранимая процедура - это предварительно скомпилированный исполняемый объект, содержащий один или несколько операторов SQL. Во многих случаях хранимые процедуры принимают входные параметры и возвращают несколько значений. Значения параметров могут быть предоставлены, если хранимая процедура написана для их принятия. Пример хранимой процедуры с принимающим входным параметром приведен ниже:
CREATE PROCEDURE SPCOUNTRY
@COUNTRY VARCHAR(20)
AS
SELECT PUB_NAME FROM publishers WHERE COUNTRY = @COUNTRY
GO
Вышеуказанная хранимая процедура принимает имя страны (@COUNTRY VARCHAR (20)) в качестве параметра и возвращает всех издателей из страны ввода. Если для параметра CommandType установлено значение StoredProcedure, вы можете использовать коллекцию Parameters для определения параметров.
command.CommandType = CommandType.StoredProcedure;
param = new SqlParameter("@COUNTRY", "Germany");
param.Direction = ParameterDirection.Input;
param.DbType = DbType.String;
command.Parameters.Add(param);
Указанный выше код передает параметр страны хранимой процедуре из приложения С#.
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string connetionString = null;
SqlConnection connection ;
SqlDataAdapter adapter ;
SqlCommand command = new SqlCommand();
SqlParameter param ;
DataSet ds = new DataSet();
int i = 0;
connetionString = "Data Source=servername;Initial Catalog=PUBS;User ID=sa;Password=yourpassword";
connection = new SqlConnection(connetionString);
connection.Open();
command.Connection = connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "SPCOUNTRY";
param = new SqlParameter("@COUNTRY", "Germany");
param.Direction = ParameterDirection.Input;
param.DbType = DbType.String;
command.Parameters.Add(param);
adapter = new SqlDataAdapter(command);
adapter.Fill(ds);
for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
MessageBox.Show (ds.Tables[0].Rows[i][0].ToString ());
}
connection.Close();
}
}
}