65.9K
CodeProject 正在变化。 阅读更多。
Home

通过存储过程插入和检索数据

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.33/5 (20投票s)

2007 年 2 月 16 日

CPOL

4分钟阅读

viewsIcon

300771

downloadIcon

5765

关于存储过程的所有信息

Sample image

引言

与标准的 SQL 语句相比,使用存储过程有几个优点。首先,存储过程提供了更多的灵活性,具有条件逻辑等功能。其次,由于存储过程存储在 DBMS 中,因此可以减少带宽和执行时间。这是因为单个存储过程可以执行一组复杂的 SQL 语句。第三,SQL Server 会预编译存储过程,使其执行效率最高。第四,客户端开发人员可以摆脱复杂的代码设计。他们只需要知道存储过程的名称以及它返回的数据类型。

创建存储过程?

企业管理器提供了一种创建存储过程的简便方法。首先,选择要创建存储过程的数据库。展开数据库节点,右键单击“存储过程”,然后选择“新建存储过程...”。您应该会看到以下内容

CREATE PROCEDURE [OWNER].[PROCEDURE NAME] AS

将 OWNER 替换为“dbo”(数据库所有者),将 PROCEDURE NAME 替换为过程的名称。例如:

CREATE PROCEDURE [dbo].[GetProducts] AS

到目前为止,我们指示 SQL Server 创建一个名为 GetProducts 的新存储过程。我们在 AS 子句后指定过程的主体

CREATE PROCEDURE [dbo].[GetProducts] AS SELECT ProductID, ProductName FROM Products

单击“检查语法”按钮以确认存储过程的语法是否正确。请注意,上面的 GetProducts 示例将在 SQL Server 附带的 Northwind 示例数据库上运行。请根据您使用的数据库进行必要的修改。

现在我们已经创建了一个存储过程,我们将研究如何在 C# 应用程序中调用它

调用存储过程

ADO.NET 的一个很好的方面是,它允许开发人员以几乎与标准 SQL 语句完全相同的方式调用存储过程。

1. 创建一个新的 C# Windows 应用程序项目。

2. 从工具箱中,将 DataGrid 拖放到窗体上。必要时调整其大小。

3. 双击窗体以生成 Form_Load 事件处理程序。在输入任何代码之前,在文件顶部添加“using System.Data.SqlClient”。

输入以下代码

private void Form1_Load(object sender, System.EventArgs e) {

SqlConnection conn = new SqlConnection("Data
Source=localhost;Database=db_first;Integrated Security=SSPI"
);
SqlCommand command = new SqlCommand("GetProducts", conn);
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds, "Products");
this.dg_Data.DataSource = ds;

this.dg_Data.DataMember = "Products";

将数据插入存储过程

使用 INSERT、UPDATE 或 DELETE 等其他 SQL 语句遵循相同的过程。首先,创建一个可能接受参数也可能不接受参数的存储过程,然后从代码中调用该存储过程,如果需要参数,则提供必要的值。以下示例说明了如何向具有用户名和密码字段的用户表中插入新用户。

SQL Server 代码

CREATE PROCEDURE [dbo].[InsertUser] (
@Username varchar(50), @Password varchar(50)
)
AS INSERT INTO Users VALUES(@Username, @Password)


C# 代码

string username = Username.Text // 从用户字符串中获取用户名
password = Password.Text // 从用户字符串中获取密码


SqlConnection conn = new SqlConnection"
DataSource=localhost;Database=db_First;Integrated Security=SSPI"
);
SqlCommand command = new SqlCommand("InsertUser", conn);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@Username", SqlDbType.VarChar).Value = username;
command.Parameters.Add("@Password", SqlDbType.VarChar).Value = password;
conn.Open(); int rows = command.ExecuteNonQuery();
conn.Close();

首先,我们从用户那里检索用户名和密码信息。这些信息可以输入到表单中、通过消息对话框或其他方法。关键在于,用户指定用户名和密码,应用程序将数据插入数据库。还请注意,我们调用了 Connection 对象的 ExecuteNonQuery() 方法。我们调用此方法是为了指示存储过程不返回查询结果,而是返回一个整数,指示受已执行语句影响的行数。ExecuteNonQuery() 用于 DML 语句,如 INSERT、UPDATE 和 DELETE。请注意,我们可以测试 rows 的值以检查存储过程是否成功插入了数据。

<code>if (rows == 1) {
MessageBox.Show("创建新用户成功!");
}
else {
MessageBox.Show("创建新用户失败!"); }

我们检查 rows 的值是否等于一。由于我们的存储过程只执行了一个插入操作,并且如果成功,ExecuteNonQuery() 方法应返回 1,表示插入的一行。对于其他 SQL 语句,尤其是影响多行的 UPDATE 和 DELETE 语句,存储过程将返回受该语句影响的行数。

结论

存储过程为开发人员提供了极大的灵活性,具有许多使用标准 SQL 无法使用的功能。ADO.NET 允许我们在应用程序中无缝地使用存储过程。这两者的结合使我们能够快速创建功能强大的应用程序。

尽情享受吧!

示例图片查看我的在线 个人资料
© . All rights reserved.