2023年6月21日发(作者:)

[翻译]使用C#创建SQL Server的存储过程(Visual Studio 2005 + SQL Server 2005)

介绍

通常,开发人员使用的是T-SQL来创建SQL Server的存储过程、函数和触发器。 而现在的SQL Server 2005已经完全支持.NET通用语言运行时(CLR)了。 这就意味着,你可以使用.NET的语言,如C#、之类的来开发SQL Server的存储过程、函数和触发器。 SQL Server 和 CLR 的集成给我们带来了n多好处,如实时编译、类型安全、增强的安全性以及增强的编程模型等。 本文中,我将向大家演示如何使用C#创建SQL Server的存储过程。

背景

我们在使用SQL Server存储过程时,最常做的工作就是从数据库中读取或保存数据。 其常用应用如下:

·执行一些简单的逻辑,没有任何返回值。 也没有输出参数。

·执行一些逻辑,并通过一个或更多的输出参数返回结果。

·执行一些逻辑,并返回从表中读取的一条或多条记录。

·执行一些逻辑,并返回一行或多行记录。 这些记录不是从表中读取的,而是你自定义的一些数据行。

为了演示如何用C#开发出这几种应用的SQL Server存储过程,我将一个一个地举出示例。

启用CLR集成

在你开始用C#写存储过程之前,必须要启用你的SQL Server的CLR集成特性。 默认情况它是不启用的。 打开你的SQL Server

Management Studio并执行如下脚本。

sp_configure 'clr enabled', 1

GO

RECONFIGURE

GO

这里,我们执行了系统存储过程“sp_configure”,为其提供的两个参数分别为:“clr enabled”和“1”。如果要停用CLR集成的话也是执行这个存储过程,只不过第二个参数要变为“0”而已。另外,为了使新的设置产生效果,不要忘记调用“RECONFIGURE”。

SQL Server项目

现在打开Visual Studio,并从文件菜单中选择“新建项目”。 在“新建项目”对话框中选择“Visual C#”下的“Database”。 然后选择“SQL

Server项目”模板。

起好项目名称后就单击“确定”按钮。

很快,你所创建的项目就要求你选择一个SQL Server数据库。

按照提示一步一步地做就好了,就算你选择了取消,也可以在“项目”–“属性”对话框中再一次选择数据库。 举个例子,假如你的电脑上有一个Northwind数据库,那么就在“新建数据库引用”对话框中选中它,然后单击“确定”按钮。 之后,SQL Server项目在部署的时候就会将我们开发的存储过程写入这个数据库(继续往后看你就清楚是怎么回事了)。

接下来,右键单击你新建的这个项目,选择“添加”-“存储过程”。 然后将会出现如下图所示的对话框:

选择“存储过程”模板,并起一个合适的名字,然后单击“添加”按钮。

添加完后你就会发现,实际上这是创建了一个已经导入了需要用到的命名空间的类。

using System;

using ;

using ent;

using es;

using ;

注意一下加粗显示的命名空间(译者注:后两个using)。 es命名空间包含了很多不同的类型,它们可以用来代替SQL Server的数据类型。 命名空间下的类负责SQL Server的CLR集成。

没有返回值的存储过程

在这一节中,我们将会看到如何写一个执行了一些逻辑,但是却没有任何返回值和输出参数的存储过程。 在这个例子里,我们将创建一个名为“ChangeCompanyName”的存储过程,它用来修改Customers表中CompanyName字段的值。 这个存储过程需要两个参数 – CustomerID(需要更改公司名称的客户的ID)和CompanyName(新的公司名称)。 “ChangeCompanyName”存储过程完成后的代码如下:

[SqlProcedure]

public static void ChangeCompanyName

(SqlString CustomerID, SqlString CompanyName)

{

SqlConnection cnn = new SqlConnection

("context connection=true");

();

SqlCommand cmd = new SqlCommand();

tion = cnn;

dText = "update customers set

companyname=@p1 where customerid=@p2";

SqlParameter p1 = new SqlParameter("@p1", CompanyName);

SqlParameter p2 = new SqlParameter("@p2", CustomerID);

(p1);

(p2);

int i=eNonQuery();

();

(ng());

}

仔细看一下这个ChangeCompanyName()方法。 它是一个静态方法并且没有返回值(void)。 它需要两个名为CustomerID和CompanyName的参数。 请注意这两个参数的数据类型都是SqlString。 SqlString可以用来代替SQL Server中的nvarchar数据类型。 这个方法用了一个[SqlProcedure]属性来修饰。 该属性用于标记ChangeCompanyName()方法是一个SQL Server存储过程。

在方法内我们创建了一个SqlConnection对象,并设置其连接字符串为“context connection = true”。 “上下文连接”可以让你使用当前登录到数据库的用户作为你的登录数据库的验证信息。 本例中,ChangeCompanyName()方法将会转换为存储过程,然后保存到Northwind数据库里。 所以在这里的“上下文连接”指的就是Northwind数据库。 这样你就不需要再写任何关于登录数据库的验证信息了。

接下来是打开数据库连接。 然后通过设置SqlCommand对象的Connection和CommandText属性,让其执行更新操作。 同时,我们还需要设置两个参数。 这样通过调用ExecuteNonQuery()方法就可以执行更新操作了。 再接下来就是关闭连接。

最后,将ExecuteNonQuery()方法的返回值发送到客户端。 当然你也可以不做这一步。 现在我们来了解一下SqlContext类的使用。

SqlContext类用于在服务端和客户端之间传递处理结果。 本例使用了Send()方法发送一个字符串返回给调用者。

返回从表中读取的一条或多条记录的存储过程

我们在使用存储过程时,经常会SELECT一条或多条记录。 你可以采用两种方法来创建这样的存储过程。

首先我们创建一个名为GetAllCustomers()的方法,代码如下:

[SqlProcedure]

public static void GetAllCustomers()

{

SqlConnection cnn = new SqlConnection

("context connection=true");

();

SqlCommand cmd = new SqlCommand();

tion = cnn;

dText = "select * from customers";

SqlDataReader reader = eReader();

(reader);

();

();

}

这个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");

();

SqlCommand cmd = new SqlCommand();

tion = cnn; dText = "select * from customers

where customerid=@p1";

SqlParameter p1 = new SqlParameter("@p1", CustomerID);

(p1);

eAndSend(cmd);

();

}

GetCustomerByID()方法需要一个参数 – CustomerID,它将从Customers表中返回某个customer的记录。 这个方法内的代码,除了ExecuteAndSend()方法外,你应该都已经比较熟悉了。 ExecuteAndSend()方法接收一个SqlCommand对象作为参数,执行它就会返回数据集给客户端。

有输出参数的存储过程

我们在使用存储过程时,经常会通过输出参数返回一个经过计算的值。 所以,现在让我们来看一看如何创建具有一个或多个输出参数的存储过程。

[SqlProcedure]

public static void GetCompanyName

(SqlString CustomerID,out SqlString CompanyName)

{

SqlConnection cnn = new SqlConnection

("context connection=true");

();

SqlCommand cmd = new SqlCommand();

tion = cnn;

dText = "select companyname from

customers where customerid=@p1";

SqlParameter p1 = new SqlParameter

("@p1", CustomerID);

(p1);

object obj = eScalar();

();

CompanyName = ng();

}

这是一个名为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", ar,50);

metadata[1] = new SqlMetaData

("CompanyName", ar,50);

SqlDataRecord record = new SqlDataRecord(metadata);

ing(0, "ALFKI");

ing(1, "Alfreds Futterkiste");

(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", ar, 50);

metadata[1] = new SqlMetaData

("CompanyName", ar, 50);

SqlDataRecord record = new SqlDataRecord(metadata);

sultsStart(record);

ing(0, "ALFKI");

ing(1, "Alfreds Futterkiste");

sultsRow(record);

ing(0, "ANATR");

ing(1, "Ana Trujillo Emparedados y helados");

sultsRow(record);

sultsEnd();

}

GetMultipleCustomRows()方法将会返回多个SqlDataRecord对象到客户端。 接下来创建自定义列和设置列的值都和之前的例子一样。 但是,我们使用的是SendResutlsStart()方法来传输数据。 SendResultsRow()方法也是发送一个SqlDataRecord对象到客户端,但是我们可以多次调用它,从而做到发送多条记录。 最后,调用SendResultsEnd()方法用来标记已经完成数据传输操作。

我们已经开发完了存储过程。 现在就可以将这个项目编译为一个程序集(.DLL)。 但是我们的工作并没有到此结束。 我们还需要部署这个程序集和存储过程到SQL Server数据库。 有两种方法可以完成这个工作 – 手动和自动。 手动方法是使用T-SQL语句注册你的程序集,并将存储过程部署到SQL Server数据库中。 在本例中,我将使用自动的方法来部署存储过程到SQL Server数据库。

右键单击你的项目,然后在菜单中选择“部署”选项。

如此就会自动地完成注册程序集和部署存储过程的工作。 注意,只有在你创建项目时添加了数据库引用的时候,才会出现“部署”选项。

如果因为某些原因你没能添加数据库引用,那么你可以通过项目属性对话框来设置它。

如果你在SQL Server Management Studio查看Northwind数据库的话,那么就应该可以看到和下图相似的结果。

注意,在存储过程节点下出现了我们创建的所有方法(有“锁”图标的),并且在程序集节点下出现了我们的程序集。

就是这些东西,很简单吧。 现在你就可以在你的程序中调用这些存储过程了。 你也可以在SQL Server Management Studio中来测试它们。

作者:Bipin Joshi

Email:/

简介:Bipin Joshi是的管理员。他是/的发起人,这个公司提供.NET framwork的培训和咨询服务。他在印度孟买为开发者提供培训。他也是微软的MVP()和ASPInsiders的会员。

在Visual Studio 2005/2008 中调试SQL Server 2005的存储过程 收藏

介绍

SQL Server 2000可以让我们在查询分析器中直接调试存储过程(更多的信息请参看:用SQL

Server 2000的查询分析器调试存储过程) 到了现在的SQL Server 2005,这个功能被转移到了SQL Servr Management Studio和Visual Studio IDE内。 使用这个技术,我们可以在Visual

Studio中一步一步地调试存储过程。 而且你也可以在存储过程中设置断点,这样当你调试你的程序时,这些断点就会生效。

SQL Server 2005的所有版本都支持调试功能(包括Express版)。 但是,只有Team Systems和Professional版本的Visual Studio才能在IDE内调试存储过程。 简而言之,如果你使用的是Visual Web Developer或者Visual Studio Standard版本的话,就不能在调试应用程序的时候,一步一步地调试存储过程或者进入到存储过程内部。

本文中,我将示例如何通过Visual Studio IDE调试SQL Server 2005的存储过程。 我们既会看到如何在IDE中直接一步一步地调试存储过程,也会看到如何给存储过程设置断点,并在调试应用程序的时候进入到断点处。 继续往下看,你会知道得更多!

SQL Server调试的不同方法

现在的SQL Server 2005中,所有的数据库调试都发生在Visual Studio IDE的内部。 数据库中的像存储过程、触发器和用户自定义函数(UDFs)这样的对象都是可以被调试的(译者注:本文中提到的数据库对象指的是存储过程、触发器或用户自定义函数)。 Visual Studio提供了3种调试这些数据库对象的方法。

•数据库中直接调试 – 在Visual Studio的服务器资源管理器中,右键单击某个数据库对象,然后选择“单步执行××”。 例如,当你右键单击一个存储过程的时候,弹出菜单中就会包含一个“单步执行存储过程”的选项。

•应用程序调试 – 在数据库对象内设置断点,然后通过应用程序进行调试。 当相关的程序处于调试状态,并且调用了数据库对象的时候,那么Visual Studio就会暂停在你所设置的断点之处,从而允许我们一步一步地对T-SQL语句进行调试。

•在SQL Server项目中调试 – 在Visual Studio中可以创建一个SQL Server项目。 该项目中可以包含T-SQL和数据库对象,并且这些数据库对象都可以通过SQL Server项目本身来调试。关于这3种不同的SQL Server调试的更多信息,请参看:Overview of T-SQL and CLR

Debugging in SQL Server 2005。

还有一个需要注意的地方就是,本文接下来所介绍的SQL Server调试是基于本地数据库的。

当然,无论是本地数据库还是远程数据库都是可以调试的。 本地数据库指的是数据库部署在本机上;远程数据库指的是数据库部署在本机之外的机器上。 调试本地数据库不需要做额外的设置, 但是调试远程数据库却要复杂得多

本文主要介绍的是如何在数据库中直接调试。 详细点说就是,我们将调试本地SQL Server

2005的数据库。 接下来,我给大家简要讲一讲关于调试远程数据库的相关要点。

调试远程数据库

调试远程数据库最关键的要点在于,要确保启动Visual Studio的Windows用户与连接远程数据库的用户是同一个用户。 此外,该用户必须隶属于sysadmin角色。

例如,你可以在Windows的域中创建一个名为“TestDebug”的用户。 然后使其可以登录到远程SQL Server数据库,并将该用户添加到sysadmin角色内。 另外,你还需要使用“TestDebug”用户来登录你的电脑,或者确保使用命令启动的Visual Studio运行在“TestDebug”用户下。 这样,你就可以使用我们接下来演示的方法来调试了。

更多的详细信息可以参看这本书:Hitchhiker's Guide to Visual Studio and SQL Server, Seventh Edition。

在数据库中直接调试

在数据库中直接调试是调试SQL Server 2005的存储过程的最简单的方法。 在Visual Stuido的IDE中你可以选择单步执行存储过程,然后就可以一条语句一条语句地单步执行了,同时你也可以检查和修改存储过程内的T-SQL变量和参数。

在服务器资源管理器中右键单击“SBP_JX_DJ_CS”存储过程,然后选择单步执行存储过程的选项。 (注意:SQL Server调试只有Team Systems和Professional版本的Visual Studio才支持。)

调试器启动并且执行存储过程。 因为存储过程“SBP_JX_DJ_CS”需要一个传入值给@gzid和@djlxbs,所以会弹出一个对话框让我们提供该值。 输入对应传入数值后单击OK。

首先会执行第一条语句。 你可以选择逐语句或逐过程进行调试(快捷键分别为F11和F10),也可以在监视窗口中添加参数和变量。 存储过程调试期间的截屏如下图所示。 左侧的黄色箭头指的是当前执行的语句。 监视窗口中显示的是@gzid和@djlxbs的类型和值。

存储过程知行完后,结果会显示在输出窗口中。

你可以看到,在数据库中直接调试存储过程是非常简单的,而且很好理解。 简单到你只需要在服务器资源管理器中,右键单击存储过程,然后选择单步执行存储过程即可。

结论

在SQL Server之前的版本中有一套用于调试存储过程的独立工具。 到了现在的SQL Server

2005,存储过程、触发器和用户自定义函数(UDFs)都是通过Visual Studio Team System和Professional版本来调试的。 它给我们带来了3种调试SQL Server的方法: 数据库中直接调试、应用程序调试和在SQL Server项目中调试。 本文中,我们一起研究了前两种调试方法(使用本地数据库)。

本文来自CSDN博客,转载请/xxsoft2007/archive/2008/10/24/

标明出处:

2023年6月21日发(作者:)

[翻译]使用C#创建SQL Server的存储过程(Visual Studio 2005 + SQL Server 2005)

介绍

通常,开发人员使用的是T-SQL来创建SQL Server的存储过程、函数和触发器。 而现在的SQL Server 2005已经完全支持.NET通用语言运行时(CLR)了。 这就意味着,你可以使用.NET的语言,如C#、之类的来开发SQL Server的存储过程、函数和触发器。 SQL Server 和 CLR 的集成给我们带来了n多好处,如实时编译、类型安全、增强的安全性以及增强的编程模型等。 本文中,我将向大家演示如何使用C#创建SQL Server的存储过程。

背景

我们在使用SQL Server存储过程时,最常做的工作就是从数据库中读取或保存数据。 其常用应用如下:

·执行一些简单的逻辑,没有任何返回值。 也没有输出参数。

·执行一些逻辑,并通过一个或更多的输出参数返回结果。

·执行一些逻辑,并返回从表中读取的一条或多条记录。

·执行一些逻辑,并返回一行或多行记录。 这些记录不是从表中读取的,而是你自定义的一些数据行。

为了演示如何用C#开发出这几种应用的SQL Server存储过程,我将一个一个地举出示例。

启用CLR集成

在你开始用C#写存储过程之前,必须要启用你的SQL Server的CLR集成特性。 默认情况它是不启用的。 打开你的SQL Server

Management Studio并执行如下脚本。

sp_configure 'clr enabled', 1

GO

RECONFIGURE

GO

这里,我们执行了系统存储过程“sp_configure”,为其提供的两个参数分别为:“clr enabled”和“1”。如果要停用CLR集成的话也是执行这个存储过程,只不过第二个参数要变为“0”而已。另外,为了使新的设置产生效果,不要忘记调用“RECONFIGURE”。

SQL Server项目

现在打开Visual Studio,并从文件菜单中选择“新建项目”。 在“新建项目”对话框中选择“Visual C#”下的“Database”。 然后选择“SQL

Server项目”模板。

起好项目名称后就单击“确定”按钮。

很快,你所创建的项目就要求你选择一个SQL Server数据库。

按照提示一步一步地做就好了,就算你选择了取消,也可以在“项目”–“属性”对话框中再一次选择数据库。 举个例子,假如你的电脑上有一个Northwind数据库,那么就在“新建数据库引用”对话框中选中它,然后单击“确定”按钮。 之后,SQL Server项目在部署的时候就会将我们开发的存储过程写入这个数据库(继续往后看你就清楚是怎么回事了)。

接下来,右键单击你新建的这个项目,选择“添加”-“存储过程”。 然后将会出现如下图所示的对话框:

选择“存储过程”模板,并起一个合适的名字,然后单击“添加”按钮。

添加完后你就会发现,实际上这是创建了一个已经导入了需要用到的命名空间的类。

using System;

using ;

using ent;

using es;

using ;

注意一下加粗显示的命名空间(译者注:后两个using)。 es命名空间包含了很多不同的类型,它们可以用来代替SQL Server的数据类型。 命名空间下的类负责SQL Server的CLR集成。

没有返回值的存储过程

在这一节中,我们将会看到如何写一个执行了一些逻辑,但是却没有任何返回值和输出参数的存储过程。 在这个例子里,我们将创建一个名为“ChangeCompanyName”的存储过程,它用来修改Customers表中CompanyName字段的值。 这个存储过程需要两个参数 – CustomerID(需要更改公司名称的客户的ID)和CompanyName(新的公司名称)。 “ChangeCompanyName”存储过程完成后的代码如下:

[SqlProcedure]

public static void ChangeCompanyName

(SqlString CustomerID, SqlString CompanyName)

{

SqlConnection cnn = new SqlConnection

("context connection=true");

();

SqlCommand cmd = new SqlCommand();

tion = cnn;

dText = "update customers set

companyname=@p1 where customerid=@p2";

SqlParameter p1 = new SqlParameter("@p1", CompanyName);

SqlParameter p2 = new SqlParameter("@p2", CustomerID);

(p1);

(p2);

int i=eNonQuery();

();

(ng());

}

仔细看一下这个ChangeCompanyName()方法。 它是一个静态方法并且没有返回值(void)。 它需要两个名为CustomerID和CompanyName的参数。 请注意这两个参数的数据类型都是SqlString。 SqlString可以用来代替SQL Server中的nvarchar数据类型。 这个方法用了一个[SqlProcedure]属性来修饰。 该属性用于标记ChangeCompanyName()方法是一个SQL Server存储过程。

在方法内我们创建了一个SqlConnection对象,并设置其连接字符串为“context connection = true”。 “上下文连接”可以让你使用当前登录到数据库的用户作为你的登录数据库的验证信息。 本例中,ChangeCompanyName()方法将会转换为存储过程,然后保存到Northwind数据库里。 所以在这里的“上下文连接”指的就是Northwind数据库。 这样你就不需要再写任何关于登录数据库的验证信息了。

接下来是打开数据库连接。 然后通过设置SqlCommand对象的Connection和CommandText属性,让其执行更新操作。 同时,我们还需要设置两个参数。 这样通过调用ExecuteNonQuery()方法就可以执行更新操作了。 再接下来就是关闭连接。

最后,将ExecuteNonQuery()方法的返回值发送到客户端。 当然你也可以不做这一步。 现在我们来了解一下SqlContext类的使用。

SqlContext类用于在服务端和客户端之间传递处理结果。 本例使用了Send()方法发送一个字符串返回给调用者。

返回从表中读取的一条或多条记录的存储过程

我们在使用存储过程时,经常会SELECT一条或多条记录。 你可以采用两种方法来创建这样的存储过程。

首先我们创建一个名为GetAllCustomers()的方法,代码如下:

[SqlProcedure]

public static void GetAllCustomers()

{

SqlConnection cnn = new SqlConnection

("context connection=true");

();

SqlCommand cmd = new SqlCommand();

tion = cnn;

dText = "select * from customers";

SqlDataReader reader = eReader();

(reader);

();

();

}

这个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");

();

SqlCommand cmd = new SqlCommand();

tion = cnn; dText = "select * from customers

where customerid=@p1";

SqlParameter p1 = new SqlParameter("@p1", CustomerID);

(p1);

eAndSend(cmd);

();

}

GetCustomerByID()方法需要一个参数 – CustomerID,它将从Customers表中返回某个customer的记录。 这个方法内的代码,除了ExecuteAndSend()方法外,你应该都已经比较熟悉了。 ExecuteAndSend()方法接收一个SqlCommand对象作为参数,执行它就会返回数据集给客户端。

有输出参数的存储过程

我们在使用存储过程时,经常会通过输出参数返回一个经过计算的值。 所以,现在让我们来看一看如何创建具有一个或多个输出参数的存储过程。

[SqlProcedure]

public static void GetCompanyName

(SqlString CustomerID,out SqlString CompanyName)

{

SqlConnection cnn = new SqlConnection

("context connection=true");

();

SqlCommand cmd = new SqlCommand();

tion = cnn;

dText = "select companyname from

customers where customerid=@p1";

SqlParameter p1 = new SqlParameter

("@p1", CustomerID);

(p1);

object obj = eScalar();

();

CompanyName = ng();

}

这是一个名为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", ar,50);

metadata[1] = new SqlMetaData

("CompanyName", ar,50);

SqlDataRecord record = new SqlDataRecord(metadata);

ing(0, "ALFKI");

ing(1, "Alfreds Futterkiste");

(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", ar, 50);

metadata[1] = new SqlMetaData

("CompanyName", ar, 50);

SqlDataRecord record = new SqlDataRecord(metadata);

sultsStart(record);

ing(0, "ALFKI");

ing(1, "Alfreds Futterkiste");

sultsRow(record);

ing(0, "ANATR");

ing(1, "Ana Trujillo Emparedados y helados");

sultsRow(record);

sultsEnd();

}

GetMultipleCustomRows()方法将会返回多个SqlDataRecord对象到客户端。 接下来创建自定义列和设置列的值都和之前的例子一样。 但是,我们使用的是SendResutlsStart()方法来传输数据。 SendResultsRow()方法也是发送一个SqlDataRecord对象到客户端,但是我们可以多次调用它,从而做到发送多条记录。 最后,调用SendResultsEnd()方法用来标记已经完成数据传输操作。

我们已经开发完了存储过程。 现在就可以将这个项目编译为一个程序集(.DLL)。 但是我们的工作并没有到此结束。 我们还需要部署这个程序集和存储过程到SQL Server数据库。 有两种方法可以完成这个工作 – 手动和自动。 手动方法是使用T-SQL语句注册你的程序集,并将存储过程部署到SQL Server数据库中。 在本例中,我将使用自动的方法来部署存储过程到SQL Server数据库。

右键单击你的项目,然后在菜单中选择“部署”选项。

如此就会自动地完成注册程序集和部署存储过程的工作。 注意,只有在你创建项目时添加了数据库引用的时候,才会出现“部署”选项。

如果因为某些原因你没能添加数据库引用,那么你可以通过项目属性对话框来设置它。

如果你在SQL Server Management Studio查看Northwind数据库的话,那么就应该可以看到和下图相似的结果。

注意,在存储过程节点下出现了我们创建的所有方法(有“锁”图标的),并且在程序集节点下出现了我们的程序集。

就是这些东西,很简单吧。 现在你就可以在你的程序中调用这些存储过程了。 你也可以在SQL Server Management Studio中来测试它们。

作者:Bipin Joshi

Email:/

简介:Bipin Joshi是的管理员。他是/的发起人,这个公司提供.NET framwork的培训和咨询服务。他在印度孟买为开发者提供培训。他也是微软的MVP()和ASPInsiders的会员。

在Visual Studio 2005/2008 中调试SQL Server 2005的存储过程 收藏

介绍

SQL Server 2000可以让我们在查询分析器中直接调试存储过程(更多的信息请参看:用SQL

Server 2000的查询分析器调试存储过程) 到了现在的SQL Server 2005,这个功能被转移到了SQL Servr Management Studio和Visual Studio IDE内。 使用这个技术,我们可以在Visual

Studio中一步一步地调试存储过程。 而且你也可以在存储过程中设置断点,这样当你调试你的程序时,这些断点就会生效。

SQL Server 2005的所有版本都支持调试功能(包括Express版)。 但是,只有Team Systems和Professional版本的Visual Studio才能在IDE内调试存储过程。 简而言之,如果你使用的是Visual Web Developer或者Visual Studio Standard版本的话,就不能在调试应用程序的时候,一步一步地调试存储过程或者进入到存储过程内部。

本文中,我将示例如何通过Visual Studio IDE调试SQL Server 2005的存储过程。 我们既会看到如何在IDE中直接一步一步地调试存储过程,也会看到如何给存储过程设置断点,并在调试应用程序的时候进入到断点处。 继续往下看,你会知道得更多!

SQL Server调试的不同方法

现在的SQL Server 2005中,所有的数据库调试都发生在Visual Studio IDE的内部。 数据库中的像存储过程、触发器和用户自定义函数(UDFs)这样的对象都是可以被调试的(译者注:本文中提到的数据库对象指的是存储过程、触发器或用户自定义函数)。 Visual Studio提供了3种调试这些数据库对象的方法。

•数据库中直接调试 – 在Visual Studio的服务器资源管理器中,右键单击某个数据库对象,然后选择“单步执行××”。 例如,当你右键单击一个存储过程的时候,弹出菜单中就会包含一个“单步执行存储过程”的选项。

•应用程序调试 – 在数据库对象内设置断点,然后通过应用程序进行调试。 当相关的程序处于调试状态,并且调用了数据库对象的时候,那么Visual Studio就会暂停在你所设置的断点之处,从而允许我们一步一步地对T-SQL语句进行调试。

•在SQL Server项目中调试 – 在Visual Studio中可以创建一个SQL Server项目。 该项目中可以包含T-SQL和数据库对象,并且这些数据库对象都可以通过SQL Server项目本身来调试。关于这3种不同的SQL Server调试的更多信息,请参看:Overview of T-SQL and CLR

Debugging in SQL Server 2005。

还有一个需要注意的地方就是,本文接下来所介绍的SQL Server调试是基于本地数据库的。

当然,无论是本地数据库还是远程数据库都是可以调试的。 本地数据库指的是数据库部署在本机上;远程数据库指的是数据库部署在本机之外的机器上。 调试本地数据库不需要做额外的设置, 但是调试远程数据库却要复杂得多

本文主要介绍的是如何在数据库中直接调试。 详细点说就是,我们将调试本地SQL Server

2005的数据库。 接下来,我给大家简要讲一讲关于调试远程数据库的相关要点。

调试远程数据库

调试远程数据库最关键的要点在于,要确保启动Visual Studio的Windows用户与连接远程数据库的用户是同一个用户。 此外,该用户必须隶属于sysadmin角色。

例如,你可以在Windows的域中创建一个名为“TestDebug”的用户。 然后使其可以登录到远程SQL Server数据库,并将该用户添加到sysadmin角色内。 另外,你还需要使用“TestDebug”用户来登录你的电脑,或者确保使用命令启动的Visual Studio运行在“TestDebug”用户下。 这样,你就可以使用我们接下来演示的方法来调试了。

更多的详细信息可以参看这本书:Hitchhiker's Guide to Visual Studio and SQL Server, Seventh Edition。

在数据库中直接调试

在数据库中直接调试是调试SQL Server 2005的存储过程的最简单的方法。 在Visual Stuido的IDE中你可以选择单步执行存储过程,然后就可以一条语句一条语句地单步执行了,同时你也可以检查和修改存储过程内的T-SQL变量和参数。

在服务器资源管理器中右键单击“SBP_JX_DJ_CS”存储过程,然后选择单步执行存储过程的选项。 (注意:SQL Server调试只有Team Systems和Professional版本的Visual Studio才支持。)

调试器启动并且执行存储过程。 因为存储过程“SBP_JX_DJ_CS”需要一个传入值给@gzid和@djlxbs,所以会弹出一个对话框让我们提供该值。 输入对应传入数值后单击OK。

首先会执行第一条语句。 你可以选择逐语句或逐过程进行调试(快捷键分别为F11和F10),也可以在监视窗口中添加参数和变量。 存储过程调试期间的截屏如下图所示。 左侧的黄色箭头指的是当前执行的语句。 监视窗口中显示的是@gzid和@djlxbs的类型和值。

存储过程知行完后,结果会显示在输出窗口中。

你可以看到,在数据库中直接调试存储过程是非常简单的,而且很好理解。 简单到你只需要在服务器资源管理器中,右键单击存储过程,然后选择单步执行存储过程即可。

结论

在SQL Server之前的版本中有一套用于调试存储过程的独立工具。 到了现在的SQL Server

2005,存储过程、触发器和用户自定义函数(UDFs)都是通过Visual Studio Team System和Professional版本来调试的。 它给我们带来了3种调试SQL Server的方法: 数据库中直接调试、应用程序调试和在SQL Server项目中调试。 本文中,我们一起研究了前两种调试方法(使用本地数据库)。

本文来自CSDN博客,转载请/xxsoft2007/archive/2008/10/24/

标明出处: