使用 c # 中的参数调用存储过程

我能够删除,插入和更新我的程序,我尝试做一个插入通过调用一个创建的存储过程从我的数据库。

我做的这个按钮插入工作得很好。

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)的两个参数。我在谷歌上搜索了一些很好的例子,但没有发现任何有趣的东西。

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);
}
744214 次浏览

这与运行查询非常相似。在您的原始代码中,您将创建一个命令对象,将其放入 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();
}
}
}

您必须添加参数,因为 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.Text);
cmd.Parameters.AddWithValue("@LastName", txtlastname.Text);
con.Open();
cmd.ExecuteNonQuery();
}
}

现在不推荐使用 cmd.Parameters.Add(String parameterName, Object value),而是使用 cmd.Parameters.AddWithValue(String parameterName, Object value)

已经不推荐使用 Add (字符串参数名称,对象值)。请使用 AddWithValue (字符串参数名称,对象值)

在功能方面没有区别 不赞成的 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();
}
}
}
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();
}
}

作为一个替代方案,我有一个库,它使处理过程变得很容易: 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("StoredProcedureName");

那个。NET 数据提供程序由许多用于连接到数据源、执行命令和返回记录集的类组成。NET 中的 Command Object 提供了许多 Execute 方法,可用于以各种方式执行 SQL 查询。

存储过程是包含一个或多个 SQL 语句的预编译可执行对象。在许多情况下,存储过程接受输入参数并返回多个值。如果编写存储过程以接受参数值,则可以提供参数值。接受输入参数的示例存储过程如下:

  CREATE PROCEDURE SPCOUNTRY
@COUNTRY VARCHAR(20)
AS
SELECT PUB_NAME FROM publishers WHERE COUNTRY = @COUNTRY
GO

上面的存储过程接受一个国家名称(@COUNTRY VARCHAR (20))作为参数,并返回输入国的所有发布者。将 CommandType 设置为 StoredProcess 后,可以使用 Properties 集合来定义参数。

  command.CommandType = CommandType.StoredProcedure;
param = new SqlParameter("@COUNTRY", "Germany");
param.Direction = ParameterDirection.Input;
param.DbType = DbType.String;
command.Parameters.Add(param);

上面的代码将国家参数从 C # 应用程序传递到存储过程。

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();
}
}
}

下面是我想分享的技巧。只要 clr 属性类型是 sql 等效类型,例如 bool-> bit,long-> bigint,string-> nchar/char/varchar/nvarchar,decal-> money,就可以很好地工作

public void SaveTransaction(Transaction transaction)
{
using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConString"].ConnectionString))
{
using (var cmd = new SqlCommand("spAddTransaction", con))
{
cmd.CommandType = CommandType.StoredProcedure;
foreach (var prop in transaction.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
cmd.Parameters.AddWithValue("@" + prop.Name, prop.GetValue(transaction, null));
con.Open();
cmd.ExecuteNonQuery();
}
}
}