针对 .NET 开发人员的存储过程评估

原文链接:http://www.cnblogs.com/clyde/articles/2112602.html
发布日期 : 8/18/2004 | 更新日期 : 8/18/2004

Christa Carpentiere
Microsoft Corporation

适用范围:
Microsoft® SQL Server™
Microsoft Visual Studio® .NET 2003
Transact-SQL (T-SQL) 语言

摘要: 向主要使用 .NET 编程语言的开发人员介绍 Microsoft SQL Server 存储过程。揭示使用存储过程的优缺点;概述 Microsoft Visual Studio .NET 2003 为帮助您使用存储过程而提供的工具;了解一些帮助您入门的最佳做法。

本页内容

引言 引言
考虑使用存储过程的理由 考虑使用存储过程的理由
Visual Studio .NET 工具 Visual Studio .NET 工具
入门提示 入门提示
结论 结论

引言

本文旨在介绍使用存储过程封装应用程序所需的 Transact-SQL (T-SQL) 的主要优缺点,以便您对如何在您的环境中使用存储过程做出明智的决策。对于那些可以利用存储过程的人员,本文还介绍了与在 .NET 应用程序中使用存储过程相关的工具和最佳做法。

在 这方面,大家的看法并不一致,有些人认为业务逻辑只应被编码到中间层或数据库中;有些人认为内联查询是唯一的选择;有些人则认为存储过程应用于任何情况。 所有这些方法都具有优点和缺点。重要的是应考虑,对您的应用程序和环境至关重要的是什么。因此,让我们了解一下存储过程的概念,并考虑使用它们封装 T-SQL 代码的某些原因。

考虑使用存储过程的理由

也 许您曾经在多处编写过使用 SqlCommand 对象的 T-SQL,但却从未考虑过是否有一个比将它并入数据访问代码更好的位置。由于应用程序随着时间的推移增添了一些功能,因此其内部可能包含一些复杂的 T-SQL 过程代码。存储过程为封装此代码提供了一个替换位置。

大多数人可能对存储过程已有所了解,但对于那些不了解存储过程的人员而 言,存储过程是指一组作为单个代码单元一起存储于数据库中的 T-SQL 语句。您可以使用输入参数传入运行时信息,并取回作为结果集或输出参数的数据。存储过程在首次运行时将被编译。这将产生一个执行计划 - 实际上是 Microsoft® SQL Server™ 为在存储过程中获取由 T-SQL 指定的结果而必须采取的步骤的记录。然后,执行计划在内存中得到缓存,以备以后使用。这样会改善存储过程的性能,因为 SQL Server 无需为确定如何处理代码而重新分析它,而只需引用缓存的计划即可。这个缓存的计划一直可用,直到 SQL Server 重新启动,或直到它由于使用率较低而溢出内存。

性能

缓存的执行计划曾使存储过程较之查询更有性能优势。但对于 SQL Server 的几个最新版本,执行计划已针对所有 T-SQL 批处理进行了缓存,而不管它们是否在存储过程中。因此,基于此功能的性能已不再是存储过程的卖点。任何使用静态语法,且提交频率足以阻止执行计划溢出内存 的 T-SQL 批处理将会获得同样的性能好处。“静态”部分是关键;任何更改,即使像添加注释这样无关紧要的更改,也将导致无法与缓存的计划相匹配,从而将无法重复使用 计划。

但是,当存储过程可以用于降低网络流量时,它们仍然能够提供性能好处。您只需在网络中发送 EXECUTE stored_proc_name 语句,而非整个 T-SQL 例程,这可以在复杂操作中广泛使用。设计良好的存储过程可以将客户端与服务器之间的许多往返过程简化为单个调用。

此 外,使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用 (RPC) 处理服务器上的存储过程而提高性能。使用 StoredProcedure 的 SqlCommand.CommandType 时,存储过程通过 RPC 执行。RPC 封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。

考虑使用存储过程提高性能时,最后要考虑是否要充分利用 T-SQL 的优点。请考虑要如何处理数据。

  • 是否要使用基于集合的操作,或执行 T-SQL 中完全支持的其他操作?那么存储过程就是一个选择,而内联查询也可以使用。

  • 是否尝试执行基于行的操作,或复杂的字符串处理?那么可能要重新考虑在 T-SQL 中进行这种处理,这不包括使用存储过程,至少要到 Yukon 发布并且公共语言运行库 (CLR) 集成可用后,才能使用存储过程。

可维护性和抽象

要 考虑的另一个潜在优势是可维护性。理想情况下,数据库架构从不更改,业务规则不被修改,但在现实环境中,情况则完全不同。既然情况如此,那么如果可以修改 存储过程以包括新 X、Y 和 Z 表(为支持新的销售活动而添加了这些表)中的数据,而不是在应用程序代码中的某个位置更改此信息,则维护对您来说可能比较容易。在存储过程中更改此信息使 得更新对应用程序而言具有透明性 - 您仍然返回相同的销售信息,即使存储过程的内部实现已经更改。更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。

另外,通过抽象化实现并将此代码保存在存储过程中,任何需要访问数据的应用程序均可以获取一致的数据。您无需在多个位置维护相同的代码,用户便可获取一致的信息。

在 存储过程中存储 T-SQL 的另一个可维护性优点是更好的版本控制。您可以对创建和修改存储过程的脚本进行版本控制,就像可以对任何其他源代码模块进行版本控制一样。通过使用 Microsoft Visual SourceSafe® 或某个其他源代码控制工具,您可以轻松地恢复到或引用旧版本的存储过程。

在使用存储过程提高可维护性时应值得注意的一点是,它们无法阻止您对架构和规则进行所有可能的更改。如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等。

要注意的另一个问题是,由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择。

安全性

考虑使用存储过程的最终原因是它们可用于增强安全性。

就管理用户对信息的访问而言,通过向用户授予对存储过程(而不是基础表)的访问权限,它们可以提供对特定数据的访问。您可以将存储过程看成是 SQL Server 视图(如果您对它们熟悉的话),除非存储过程接受用户的输入以动态更改显示的数据。

存 储过程还可以帮助您解决代码安全问题。它们可以防止某些类型的 SQL 插入攻击 - 主要是一些使用运算符(如 AND 或 OR)将命令附加到有效输入参数值的攻击。在应用程序受到攻击时,存储过程还可以隐藏业务规则的实现。这对于将此类信息视为知识产权的公司非常重要。

另 外,使用存储过程使您可以使用 ADO.NET 中提供的 SqlParameter 类指定存储过程参数的数据类型。这为验证用户提供的值类型(作为深层次防御性策略的一部分)提供了一个简单方法。在缩小可接受用户输入的范围方面,参数在 内联查询中与在存储过程中一样有用。

使用存储过程增强安全性时值得注意的是,糟糕的安全性或编码做法仍然会使您受到攻击。对 SQL Server 角色创建和分配如果不加注意将导致人们访问到不应看到的数据。同时,如果认为使用存储过程便可防止所有 SQL 插入代码攻击(例如,将数据操作语言 (DML) 附加到输入参数),后果将是一样的。

另外,无论 T-SQL 位于代码还是位于存储过程中,使用参数进行数据类型验证都不是万无一失的。所有用户提供的数据(尤其是文本数据)在传递到数据库之前都应受到附加的验证。

存储过程对我是否适用?

或许适合吧。让我们概括一下它们的优点:

  • 通过降低网络流量提高性能

  • 提供单点维护

  • 抽象化业务规则,以确保一致性和安全性

  • 通过将某些形式的攻击降至最低,以增强安全性

  • 支持执行计划重复使用

如 果您的环境允许利用存储过程提供的好处(如上所述),强烈建议使用它们。对于改进数据在环境中的处理方式而言,它们提供了一个很好的工具。另一方面,如果 您的环境中存在可移植性、大量使用非 T-SQL 友好的进程或者不稳定的数据库架构等削弱这些优点的因素,则您可能要考虑其他方法。

另 一个要注意的事项是机构内部所拥有的 T-SQL 专业人员的数量。您有足够的 T-SQL 知识吗?您愿意学习吗?或者,您有 DBA 或合适的人员帮您编写存储过程吗?掌握的 T-SQL 知识越多,存储过程就会越好,维护它们就会越容易。例如,T-SQL 主要用于基于集合的操作,而不是基于行的操作。依赖于光标(因为它们向您提示数据集)将导致性能降低。如果您不太了解 T-SQL,请将本文作为一次学习机会。无论您将它用在何处,本文介绍的知识都将改善您的代码。

因此,如果您认为存储过程会为应用程序增添特殊的效果,请继续阅读本文。我们将回顾一些简化存储过程使用的工具,并了解一些创建存储过程的最佳做法。

Visual Studio .NET 工具

Microsoft Visual Studio® .NET 提供了一些工具,使您能够查看和操作 SQL Server 存储过程(以及其他数据库对象)。让我们简要介绍一下您可能期望获得的功能。

查看存储过程

您 可以使用服务器资源管理器查看现有的存储过程、查看它们所需的参数或查看它们的内部实现。如果您已经连接到安装了 SQL Server 的服务器,则可以依次展开“ServerName”、“SQL Server”、“SQLInstanceName”、“Northwind”、“存储过程”,并展开“CustOrdersDetail”。该资源管理 器将显示存储过程所需的任何参数及其返回的任何列。如果签出以上任何项的属性,便会发现数据类型表示为 ADO 类型。框架文档提供了这些类型与 .NET 类型之间的简单映射。当然,在 ADO.NET 代码中使用参数时,可能要将它们的数据类型表示为 SqlDbType 枚举的成员。您会看到 .NET 类型与 SqlDbType 类型之间的映射。

如 果双击存储过程,Visual Studio 将会在 SQL 编辑器中打开它,其中显示了便于查看的颜色编码和所有内容。注意,它并不显示 CREATE PROCEDURE 语法(该语法实际上在数据库中已存在),由于它假定您要修改存储过程,因此提供了 ALTER PROCEDURE 语法。

创建和修改存储过程

您具有在相应数据库中创建存储过程的权限吗?如果没有,则在创建和修改存储过程之前应获取该权限。如果需要帮助,请与数据库管理员联系。

您 可以创建一个新的存储过程,方法是在服务器资源管理器中右键单击“存储过程”节点(或任何其他存储过程)并选择“新建存储过程”。随即将在 SQL 编辑器中打开一个新窗口,其中提供了一些提纲式的 CREATE PROCEDURE 语法以帮助您开始编写代码。然后,您可以在存储过程的主体中键入代码。修改存储过程与查看存储过程的起始操作相同:在服务器资源管理器中找到存储过程,然 后将其打开。

如果在创建用于存储过程的查询时需要帮助,请在存储过程窗口上右键单击,然后选择“插入 SQL”。或者,也可以选择一个 T-SQL 块,并右键单击它,然后选择“设计 SQL 块”。以上任一操作均会打开“查询生成器”窗口,该窗口提供用于构建或修改 T-SQL 语句的图形界面。完成后,可以将 T-SQL 剪切并粘贴到存储过程中。

遗憾的是,该编辑器中没有 IntelliSense,因此还要打开“SQL Server 联机丛书”以供随时参考。尝试保存存储过程时,系统将向您提示任何需要更正的语法错误。注意,只有修复了语法错误,才可以保存存储过程,因此在开始编码之 前,应确保有时间完成该过程。您可以随时在 SQL Server 查询分析器中进行最初的编码和测试,但这不在本文介绍的范畴之内。

完成所需的代码后,可以通过单击右键并选择“运行存储过程”选项来测试存储过程。

入门提示

如果要开始创建与应用程序一起使用的存储过程,应记住下面这些提示,以便两者正常运行并良好地配合工作。

使用 SET NOCOUNT ON

默 认情况下,存储过程将返回过程中每个语句影响的行数。如果不需要在应用程序中使用该信息(大多数应用程序并不需要),请在存储过程中使用 SET NOCOUNT ON 语句以终止该行为。根据存储过程中包含的影响行的语句的数量,这将删除客户端和服务器之间的一个或多个往返过程。尽管这不是大问题,但它可以为高流量应用 程序的性能产生负面影响。

create procedure test_MyStoredProc @param1 int
as

set nocount on

不要使用 sp_ prefix

sp_ prefix 是为系统存储过程保留的。数据库引擎将始终首先在主数据库中查找具有此前缀的存储过程。这意味着当引擎首先检查主数据库,然后检查存储过程实际所在的数据 库时,将需要较长的时间才能完成检查过程。而且,如果碰巧存在一个名称相同的系统存储过程,则您的过程根本不会得到处理。

尽量少用可选参数

在频繁使用可选参数之前,请仔细考虑。通过执行额外的工作会很轻易地影响性能,而根据为任意指定执行输入的参数集合,这些工作时不需要的。您可以通过对每种可能的参数组合使用条件编码来解决此问题,但这相当费时并会增大出错的几率。

在可能的情况下使用 OUTPUT 参数

通 过使用 OUTPUT 参数返回标量数据,可以略微提高速度并节省少量的处理功率。在应用程序需要返回单个值的情况下,请尝试此方法,而不要将结果集具体化。在适当的情况下,也 可以使用 OUTPUT 参数返回光标,但是我们将在后续文章中介绍光标处理与基于集合的处理在理论上的分歧。

提供返回值

使用存储过程的返回值,将处理状态信息返回给进行调用的应用程序。在您的开发组中,将一组返回值及其含义标准化,并一致地使用这些值。这会使得处理调用应用程序中的错误更加容易,并向最终用户提供有关问题的有用信息。

首先使用 DDL,然后使用 DML

将 DML 语句放在数据定义语言 (DDL) 语句之后执行(此时 DML 将引用 DDL 修改的任意对象)时,SQL Server 将重新编译存储过程。出现这种情况,是由于为了给 DML 创建计划,SQL Server 需要考虑由 DDL 对该对象所作的更改。如果留意存储过程开头的所有 DDL,则它只需重新编译一次。如果将 DDL 和 DML 语句混合使用,则将强制存储过程多次进行重新编译,这将对性能造成负面影响。

始终使用注释

您可能不会始终维护此代码。但其他人员将来可能想要了解它的用途。'Nuff 曾经这样说。

结论

希 望您已经认识到存储过程对您是否有用。它们是 SQL Server 免费提供的工具,因此如果这些工具确实可以帮助您开发和维护应用程序,请务必充分利用它们。本文介绍的信息将帮助您尽快入门。入门后要了解更多深层次的信 息,请查阅 SQL Server 联机丛书、Visual Studio 文档以及 MSDN®。

转载于:https://www.cnblogs.com/clyde/articles/2112602.html

展开阅读全文
博主设置当前文章不允许评论。

针对Java开发人员的C#编程语言

03-13

源文件约定rn  rn  我们需要知道,两种语言在源程序的文件命名约定和结构上有一些不同:rn  rn  文件命名rn  包含 C# 类的文件的命名约定与 Java 有点不同。首先,在 Java 中,所有源文件的扩展名都为 .java。每个源文件都包含一个顶层公共类声明,并且类名必须与文件名相匹配。换句话说,一个用公共范围声明的名为 Customer 的类必须定义在具有名称 Customer.java 的源文件中。rn  rn  而 C# 源代码是由 .cs 扩展名表示的。与 Java 不同,源文件可以包含多个顶层公共类声明,而文件名不需要与任何类名相匹配。rn  rn  顶层声明rn  rn  在 Java 和 C# 中,源代码以按一定顺序排列的顶层声明开始。Java 和 C# 程序中的声明只存在少许差别。rn  rn  Java 中的顶层声明rn  在 Java 中,我们可以用 package 关键字将类组合在一起。打包的类必须在源文件的第一个可执行的行中使用 package 关键字。接着出现的是需要访问其他包中的类的任何导入语句,之后是类声明,比如:rn  rn  package ;rn  import .;rn  class Customerrn  rn   ...rn  rn  rn  C# 中的顶层声明rn  C# 使用命名空间的概念,通过 namespace 关键字将逻辑上相关的类组合在一起。这些做法类似于 Java 包,而具有相同名称的类可以出现在两个不同的命名空间中。要访问定义在当前命名空间之外的命名空间中的类,我们可以使用紧跟该命名空间名的 using 关键字,如下所示:rn  rn  using .;rn  namespacern  rn   class Customerrn   rn  ...rn   rn  rn  rn  注意,using 语句可以完全合法地放在命名空间声明中,在这种情况下,这样导入的命名空间就形成了包含命名空间的一部分。rn  rn  Java 不允许在相同的源文件中有多个包,而 C# 允许在一个 .cs 文件中有多个命名空间:rn  rn  namespace AcmeAccountingrn  rn   public class GetDetailsrn   rn  ...rn   rn  rn  namespace AcmeFinancern  rn   public class ShowDetailsrn   rn  ...rn   rn  rn  rn  完全限定名和命名空间别名rn  rn  同 Java 一样,通过提供类的完全限定名(如 System.Data.DataSet 或上面的示例中的 AcmeAccounting.GetDetails),我们可以在没有命名空间的 using 引用的情况下访问 .NET 或用户定义的命名空间中的类。rn  rn  完全限定名可能会变得很长而不便于使用,在这种情况下,我们可以使用 using 关键字来指定一个简称或别名,以提高代码的可读性。rn  rn  在下面的代码中,创建了一个别名来引用由一个虚构的公司所编写的代码:rn  rn  using DataTier = Acme.SQLCode.Client;rn  using System;rn  public class OutputSalesrn  rn   public static void Main()rn   rn  int sales = DataTier.GetSales("January");rn  Console.WriteLine("January's Sales: 0", sales);rn   rn  rn  rn  注意 WriteLine() 的语法,格式字符串中带有 x,其中 x 表示在此处要插入的值的参数列表的位置。假定 GetSales() 方法返回 500,则该应用程序的输出将为:rn  rn  January's Sales: 500rn  rn  预处理指令rn  rn  与 C 和 C++ 相似,C# 包括预处理器指令,预处理器指令提供了有条件地跳过源文件的某些部分、报告错误和警告条件,以及描述源代码的不同部分的能力。使用“预处理指令”这个术语只是为了与 C 和 C++ 编程语言保持一致,因为 C# 并不包括单独的预处理步骤。有关 C# 预处理器指令的完整列表,请参见 C# 预处理器指令。rn  rn  语言语法rn  rn  在这一部分中,我们讨论这两种语言之间的相似点和不同点。一些主要的不同点有:rn  rn  常量声明― Java 为此而使用 final 关键字,而 C# 使用关键字 const 或 readonly。rn  rn  复合数据类型― 在 Java 中,我们可以使用类关键字来创建作为没有方法的类的复合数据类型,但是 C# 为此提供了 struct,同 C 中一样。rn  rn  析构函数― C# 允许我们创建在销毁类的实例之前调用的析构函数方法。在 Java 中,可以提供 finalize() 方法来包含在将对象作为垃圾回收之前清除资源的代码。在 C# 中,由类析构函数来提供此功能。析构函数类似一个没有参数并前面带有波形符“~”的构造函数。rn  rn  函数指针 ― C# 提供一个称为 delegate 的构造来创建类型安全的函数指针。Java 没有任何与之对等的机制。rn  rn  数据类型rn  C# 提供了在 Java 中可用的所有数据类型,并且增加了对无符号数和新的 128 位高精度浮点类型的支持。rn  rn  在 Java 中,对于每个基本数据类型,核心类库都提供了一个包装类来将其表示为 Java 对象。例如,Integer 类包装 int 数据类型,而 Double 类包装 double 数据类型。rn  rn  而在 C# 中,所有的基本数据类型都是 System 命名空间中的对象。对于每个数据类型,都提供一个简称或别名。例如,int 是 System.Int32 的简称,而 double 是 System.Double 的简写形式。rn  rn  下面的列表给出了 C# 数据类型及其别名。可以看到,前 8 个对应于 Java 中可用的基本类型。不过,请注意,Java 的 boolean 在 C# 中称为 bool。rn   rn  因为 C# 将所有的基本数据类型都表示为对象,所以按照基本数据类型来调用对象方法是可能的。例如:rn  rn  int i=10;rn  Console.WriteLine(i.ToString());rn  rn  借助于自动装箱和拆箱,可以达到此目的。更多信息请参见装箱和拆箱。rn  rn  枚举rn  与 C/C++ 相似,在 C# 中可以使用枚举来组合已命名常量,而在 Java 中不能使用枚举。下面的示例定义了一个简单的 Color 枚举。rn  rn  public enum Color Green, Orange, Red, Bluern  rn  还可以为枚举赋整数值,如下面的枚举声明所示:rn  rn  public enum Color Green=10, Orange=20, Red=30, Blue=40rn  rn  下面的程序调用 Enum 类型的 GetNames 方法来显示枚举的可用常量。然后,它将值赋给枚举,并显示该值。rn  rn  using System;rn  rn  public class TypeTestrn  rn  public static void Main()rn  rn   Console.WriteLine("Possible color choices: ");rn   //Enum.GetNames returns a string array of named constants for the enumrn   foreach(string s in Enum.GetNames(typeof(Color)))rn   rn    Console.WriteLine(s);rn   rn   Color FavoriteColor = Color.Blue;rn   Console.WriteLine("Favorite Color is 0",FavoriteColor);rn   Console.WriteLine("Favorite Color value is 0", (int)FavoriteColor);rn  rn  rn  rn  在运行之后,该程序将显示如下结果:rn  rn  Possible color choices:rn  Greenrn  Orangern  Redrn  Bluern  Favorite Color is Bluern  Favorite Color value is 40rn  rn  字符串rn  在 Java 和 C# 中,字符串类型表现出相似的行为,只有一些细微的差别。二者的字符串类型均是不可改变的,这意味着一旦字符串创建完毕,就不能改变字符串的值。在二者的实例中,看起来像修改字符串实际内容的方法实际上创建一个新的字符串供返回,而保留原始的字符串不变。在 C# 和 Java 中,比较字符串值的过程是不同的。在 Java 中,为了比较字符串的值,开发人员需要按照字符串类型调用 equals() 方法,正如在默认情况下 == 运算符比较引用类型一样。在 C# 中,开发人员可以使用 == 或 != 运算符来直接比较字符串的值。在 C# 中,尽管字符串是引用类型,但是在默认情况下,== 和 != 运算符将比较字符串的值而不是引用。在本文后面,我们将讨论值类型和引用。rn  rn  正如在 Java 中一样,C# 开发人员不应该使用字符串类型来连接字符串,以避免每次连接字符串时都创建新的字符串类的开销。相反,开发人员可以使用 System.Text 命名空间中的 StringBuilder 类,它在功能上等同于 Java 中的 StringBuffer 类。rn  rn  字符串rn  C# 提供了避免在字符串常量中使用转义序列(如代表制表符的“\t”或代表反斜杠字符的“\”)的功能。要这样做,可以在为字符串赋值之前使用 @ 符号来声明字符串。下面的示例显示了如何使用转义字符以及如何为字符串赋值:rn  rn  //Using escaped charactersrn  string path = "\\\\FileShare\\Directory\\file.txt";rn  rn  //Using String Literalsrn  string escapedPath = @"\\FileShare\Directory\file.txt";rn  rn  转换和强制转换rn  rn  Java 和 C# 遵守相似的数据类型自动转换和强制转换规则。rn  rn  同 Java 一样,C# 既支持隐式类型转换又支持显式类型转换。在扩大转换的情况下,转换是隐式的。例如,下面从 int 到 long 的转换是隐式的,如同 Java 中的一样:rn  rn  int intVariable = 5;rn  long l = intVariable;rn  rn  下面是 .NET 数据类型之间的隐式转换列表:rn   rn  可以使用与 Java 一样的语法对希望显式转换的表达式进行强制转换:rn  rn  long longVariable = 5483;rn  int intVariable = (int) rnrn 选文:linux宝库 论坛

急需优秀的.net开发人员

05-26

rnrn 北京汇智信通是一家基于微软平台已软件研发为主的高新技术企业。与微软中国公司合作从事中国电信增值业务平台的项目研发工作。rn 公司目前承接了几个电信级的项目和一些企业级的项目,急需技能全面的.Net开发人员。我们在项目中大量的使用了微软的企业级相关产品:BizTalk Server,Commerce Server,Portal Server,SQL Server。开发技能若能熟练的使用C#、ASP.Net、WebService、.Net Remoting进行项目开发的朋友都会有机会胜任这份工作。rn 公司同时非常注重技术培训,因为大家的能力体现了公司的价值。在项目中能够得到微软资深开发工程师的指导,同时会定期的开展技术交流,保持始终站在新技术的前沿。rn 我们的薪金丰厚(3K-8K),根据你的能力决定,通过展现你自身的能力相信一定能得到满意的收获。rnrn 若有志愿加入到我们团队中来的朋友请速发简历到:dengyb@hwasoft.comrnrn招聘要求:rnrn.net开发人员rn rn教育背景:rn◆大专以上学历,计算机及相关专业。rn经 验:rn◆2年以上的.Net开发经验。rn技能技巧:rn 熟悉使用C#、Asp.ne,熟练掌握.Net的开发环境rn 有Webservice和.Net Remoting的开发经验rn 具有中大型应用系统的设计经验rn 熟悉一种数据库的使用(SqlServer/Oracle/Informix/DB2)rn 熟练掌握XMLrn 熟悉UMLrn 熟悉BizTalk Serverrn 熟悉结构化和面向对象程序设计方法rn 了解项目管理流程rn 有电信行业相关的工作经验,了解增值业务rn态 度:rn 工作积极,态度认真负责,有很强的进取心rn 与周围同事可以融洽相处rn 积极配合同事的工作rnrnrn 论坛

待业的.net开发人员看过来

06-01

本公司高薪诚聘优秀的.net开发人员,工作地点在北京rnrn 公司目前承接了几个电信级的项目和一些企业级的项目,急需技能全面的.Net开发人员。我们在项目中大量的使用了微软的企业级相关产品:BizTalk Server,Commerce Server,Portal Server,SQL Server。开发技能若能熟练的使用C#、ASP.Net、WebService、.Net Remoting进行项目开发的朋友都会有机会胜任这份工作。rn 公司同时非常注重技术培训,因为大家的能力体现了公司的价值。在项目中能够得到微软资深开发工程师的指导,同时会定期的开展技术交流,保持始终站在新技术的前沿。rn 我们的薪金丰厚(3K-8K),根据你的能力决定,通过展现你自身的能力相信一定能得到满意的收获。rnrn 若有志愿加入到我们团队中来的朋友请速发简历到:dengyb@hwasoft.comrnrn招聘要求:rnrn.net开发人员rn rn教育背景:rn◆大专以上学历,计算机及相关专业。rn经 验:rn◆2年以上的.Net开发经验。rn技能技巧:rn 熟悉使用C#、Asp.ne,熟练掌握.Net的开发环境rn 有Webservice和.Net Remoting的开发经验rn 具有中大型应用系统的设计经验rn 熟悉一种数据库的使用(SqlServer/Oracle/Informix/DB2)rn 熟练掌握XMLrn 熟悉UMLrn 熟悉BizTalk Serverrn 熟悉结构化和面向对象程序设计方法rn 了解项目管理流程rn 有电信行业相关的工作经验,了解增值业务rn态 度:rn 工作积极,态度认真负责,有很强的进取心rn 与周围同事可以融洽相处rn 积极配合同事的工作rnrnrnrn 论坛

招聘.net winform开发人员

11-14

rn公司简介:rnhttp://www.emedexchange.com/contact/aboutus.asprnrnrn邮箱:hremedchina@163.comrnrn因公司业务发展需要,招聘开发人员,所有人员,一经录用,提供具有竞争力的待遇和良好的发展空间rnrnrn rn职位:程序员rn人数:5rn要求:rn1、本科及以上学历,具有较多开发经验者,大专学历也可rn 招收应届毕业生,要求计算机及相关专业,成绩优秀,有较强的动手能力和一定的实践经验rn2、勤勉踏实刻苦好学,工作态度端正,做事踏实认真,有较强的责任心rn3、能快速学习新产品及技术,能在压力下工作,具有良好的协同工作能力rn4、有较好的团队协作能力和意识,有较好的适应能力和对业务的理解能力rnrnrnrnrn职位:软件开发工程师rn人数:5rn要求:rn 大学本科或以上学历 计算机相关专业 具有较多开发经验者,大专学历也可rn 1年以上的.net开发经验rn 熟悉.net winform开发,熟悉oraclern 良好的学习能力rn 工作态度端正,做事踏实认真,有较强的责任心rn 有较好的团队协作能力和意识rn 有较好的适应能力和对业务的理解能力rnrnrnrnrn职位:高级软件开发工程师rn人数:2rn要求:rn 大学本科或以上学历 计算机相关专业rn 3年左右或以上的.net开发经验rn 精通.net winform开发 rn 精通基于oracle的开发rn 工作态度端正,做事踏实认真,有较强的责任心rn 有较好的团队协作能力和意识rn 有较好的适应能力和对业务的理解能力rnrn 有较多sql调优经验者优先[非必须] rn 熟悉 java开发,对于java多层的企业级开发框架结构有一定的理解,具有一定的java实际开发经验者优先[非必须] rn 具有较大项目的分析设计经验者优先[非必须]rnrnrnrn工资:面谈 论坛

没有更多推荐了,返回首页