C# 用c语言中的参数调用存储过程#
我可以在我的程序中删除、插入和更新,我尝试通过调用数据库中创建的存储过程来执行插入 我做的这个纽扣嵌件很好用C# 用c语言中的参数调用存储过程#,c#,asp.net,sql-server,stored-procedures,ado.net,C#,Asp.net,Sql Server,Stored Procedures,Ado.net,我可以在我的程序中删除、插入和更新,我尝试通过调用数据库中创建的存储过程来执行插入 我做的这个纽扣嵌件很好用 private void btnAdd_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection(dc.Con); SqlCommand cmd = new SqlCommand("Command String", con);
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\u Add\u contact
的过程以添加联系人的按钮的开始。sp\u Add\u 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);
}
这与运行查询差不多。在原始代码中,您正在创建一个命令对象,将其放入
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(字符串参数名称,对象值)
现在已不推荐使用。而是使用cmd.Parameters.AddWithValue(字符串参数名称,对象值)
在功能上没有区别。他们为什么 不推荐使用
cmd.Parameters.Add(String parameterName,Object value)
支持AddWithValue(String parameterName,Object value)
是为了提供更多
清晰
作为替代方案,我有一个库,可以轻松使用PROC:
NET数据提供程序由许多用于连接数据源、执行命令和返回记录集的类组成。ADO.NET中的Command对象提供了许多执行方法,可用于以各种方式执行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);
上述代码将country参数从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();
}
}
}
使用系统;
使用系统数据;
使用System.Windows.Forms;
使用System.Data.SqlClient;
命名空间Windows窗体应用程序1
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
字符串connetionString=null;
SqlConnection连接;
SqlDataAdapter;
SqlCommand=newsqlcommand();
SqlParameter参数;
数据集ds=新数据集();
int i=0;
connetionString=“数据源=服务器名;初始目录=PUBS;用户ID=sa;密码=您的密码”;
连接=新的SqlConnection(connetionString);
connection.Open();
command.Connection=连接;
command.CommandType=CommandType.storedProcess;
command.CommandText=“SPCOUNTRY”;
param=新的SqlParameter(“@国家”,“德国”);
参数方向=参数方向输入;
param.DbType=DbType.String;
命令.Parameters.Add(param);
adapter=newsqldataadapter(命令);
适配器。填充(ds);
对于(i=0;i这是我想分享的技巧。只要你的clr属性类型是sql等价的类型,比如bool->bit,long->bigint,string->nchar/char/varchar/nvarchar,decimal->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();
}
}
}
但是如果此过程返回数据,我如何在C#?@M009:中捕获它,然后使用ExecuteReader
或ExecuteScalar
调用它。@M009:是的,这是做同样事情的另一种方法。数据适配器使用ExecuteReader
@DylanChen:这取决于数据库设置。默认设置是标识符为否t case sensetive。@DylanChen:是数据库的排序规则设置决定标识符是否为case sensetive。AddWithValue是一个坏主意;SQL Server并不总是为nvarchar或varchar使用正确的长度,导致发生隐式转换。最好显式指定参数的长度,然后添加值e分别使用parameter.Value=txtfirstname
。只是额外的一点信息-您不应该像上面使用sp_uadd_contact那样使用sp_u前缀命名应用程序存储过程。sp_u前缀是一种系统存储过程命名约定,当SQL看到它时,将在任何应用程序之前首先搜索所有系统存储过程应用程序或用户空间存储过程。就性能而言,如果您关心应用程序中的这一点,则sp_uu前缀将降低您的响应时间。您是否有链接或来源表明cmd.Parameters.Add
已被弃用?@TonyG:不是这样,接受的答案使用首选重载Add
,该重载也没有弃用。AddWithValue
也不是最好的方法,因为它从paramater值推断参数的类型。这通常会导致错误的执行计划或不正确的转换。它也不会首先验证参数(例如,键入ifDatetime
,但传递的是字符串
)。您可以看到,只有将对象
作为第二个参数的Add
被弃用。AddWithValue
的功能与Add
与对象
的功能相同,但这不是首选方式。两者都需要推断类型。您完全正确,@TimSchmelter。我对文本的阅读有缺陷.
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();
}
}
}
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();
}
}
}