使用c#创建sql server的存储过程_c#应用2

来源:互联网 发布:上海科技大学考研 知乎 编辑:程序博客网 时间:2024/06/06 19:03

{
SqlConnection cnn = new SqlConnection
("context connection=true");
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "select * from customers";
SqlDataReader reader = cmd.ExecuteReader();
SqlContext.Pipe.Send(reader);
reader.Close();
cnn.Close();
}
这个GetAllCustomers()方法用了一个[SqlProcedure]属性来修饰。 在方法内创建一个SqlConnection和一个SqlCommand对象。 然后使用ExecuteReader()方法来执行SELECT语句。 接下来用Send()方法将取得的SqlDataReader数据发送到客户端。 最后就是关闭SqlDataReader和SqlConnection。 在这种方法中,是我们自己创建的SqlDataReader。 其实,我们也能够把这个任务交给SqlContext类去完成,代码如下:
[SqlProcedure]
public static void GetCustomerByID
(SqlString CustomerID)
{
SqlConnection cnn = new SqlConnection
("context connection=true");
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "select * from customers
where customerid=@p1";
SqlParameter p1 = new SqlParameter("@p1", CustomerID); 版权申明:本站文章均来自网络.
cmd.Parameters.Add(p1);
SqlContext.Pipe.ExecuteAndSend(cmd);
cnn.Close();
}
GetCustomerByID()方法需要一个参数 – CustomerID,他将从Customers表中返回某个customer的记录。 这个方法内的代码,除了ExecuteAndSend()方法外,您应该都已比较熟悉了。 ExecuteAndSend()方法接收一个SqlCommand对象作为参数,执行他就会返回数据集给客户端。 . 

 


有输出参数的存储过程
我们在使用存储过程时,经常会通过输出参数返回一个经过计算的值。 所以,现在让我们来看一看如何创建具备一个或多个输出参数的存储过程。
[SqlProcedure]
public static void GetCompanyName
(SqlString CustomerID,out SqlString CompanyName)
{
SqlConnection cnn = new SqlConnection
("context connection=true");
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "select companyname from
customers where customerid=@p1";
SqlParameter p1 = new SqlParameter
("@p1", CustomerID);
cmd.Parameters.Add(p1);
object obj = cmd.ExecuteScalar();
cnn.Close();
CompanyName = obj.ToString();
}
这是个名为GetCompanyName()的方法,他需要两个参数。 第一个参数是CustomerID,他是个输入参数;第二个参数是CompanyName,他是个输出参数(用关键字out来指明)。 这两个参数都是SqlString类型的。 GetCompanyName()方法会接收一个CustomerID参数,然后返回CompanyName(作为输出参数)。 !

该方法内的代码首先配置了SqlConnection和SqlCommand对象。 然后,使用ExecuteScalar()方法来执行SELECT语句。 ExecuteScalar()方法返回的值是个object类型,他其实就是公司名称。 最后将输出参数CompanyName配置为这个值。 版权申明:本站文章均来自网络.


返回一行或多行自定义数据的存储过程
我们在使用存储过程时,更多的还是从某些表中读取数据。 但是,某些情况下我们需要的数据可能不在任何表里。 例如,您可能会基于某些计算来生成一个数据表格。 因为他的数据不是从表中获得的,所以上面的方法就不在适用了。 幸运的是,SQL Server的CLR集成特性给我们提供了一个解决这个问题的方法。 请看如下代码:
[SqlProcedure]
public static void GetCustomRow()
{
SqlMetaData[] metadata = new SqlMetaData[2];
metadata[0] = new SqlMetaData
("CustomerID", SqlDbType.NVarChar,50);
metadata[1] = new SqlMetaData
("CompanyName", SqlDbType.NVarChar,50);
SqlDataRecord record = new SqlDataRecord(metadata);
record.SetString(0, "ALFKI");
record.SetString(1, "Alfreds Futterkiste");
SqlContext.Pipe.Send(record);
}
GetCustomRow()方法会返回一条记录并发送给客户端。 这个方法首先声明了一个SqlMetaData对象。 当您要用到自定义列的时候,就能够使用这个SqlMetaData类。 在我们的示例中,创建了两个类型为NVarChar,长度为50的列。然后创建了一个SqlDataRecord对象。 SqlDataRecord类能够用来表示一个自定义行。 他的构造函数需要一个SqlMetaData数组作为参数。 SqlDataRecord对象的SetString()方法用来配置列的值。 另外,更有许多不同的类似SetString()这样的方法,能够用来处理不同的数据类型。 最后,调用Send()方法将SqlDataRecord对象发送到客户端。 本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系。

在上面的示例中,我们只返回了一行数据给调用者。 那么,假如要返回多行呢? 请看下面的代码:
[SqlProcedure]
public static void GetMultipleCustomRows()
{
SqlMetaData[] metadata = new SqlMetaData[2];
metadata[0] = new SqlMetaData
("CustomerID", SqlDbType.NVarChar, 50);
metadata[1] = new SqlMetaData
("CompanyName", SqlDbType.NVarChar, 50);
SqlDataRecord record = new SqlDataRecord(metadata);
SqlContext.Pipe.SendResultsStart(record);
record.SetString(0, "ALFKI");
record.SetString(1, "Alfreds Futterkiste");
SqlContext.Pipe.SendResultsRow(record);
record.SetString(0, "ANATR");
record.SetString(1, "Ana Trujillo Emparedados y helados");
SqlContext.Pipe.SendResultsRow(record);
SqlContext.Pipe.SendResultsEnd();
}
GetMultipleCustomRows()方法将会返回多个SqlDataRecord对象到客户端。 接下来创建自定义列和配置列的值都和之前的例子相同。 但是,我们使用的是SendResutlsStart()方法来传输数据。 SendResultsRow()方法也是发送一个SqlDataRecord对象到客户端,但是我们能够多次调用他,从而做到发送多条记录。 最后,调用SendResultsEnd()方法用来标记已完成数据传输操作。 ..

我们已研发完了存储过程。 现在就能够将这个项目编译为一个程式集(.DLL)。 但是我们的工作并没有到此结束。 我们还需要部署这个程式集和存储过程到SQL

原创粉丝点击