Categories

Links

whidbey 中的sql server project

whidbey 中的sql server project  提供了在vs.net中创建.net sqlserver过程(存储过程、函数、触发器、自定义类型等) 的支持 ,鉴于此功能未见有人报道,可能大部分人都在手动在sql server 查询分析器中键入create assembly等(像我以前一样),所以特地提出来,使大家在测试yukon更容易一些。

New Project时的SQL Server Project

自动引用了Sqlaccess.dll和Microsoft.VisualStudio.DataTools.SqlAttributes.dll

 
add item
 

deply 功能 

SqlAssembly ,SqlFunc,SqlProcedure,SqlTrigger,SqlMapping 等attribute

这些attribute 可以帮助ide 在deply时
确定Assmebly名称

Create Assembly testyukon from 'xxxxx'
等价于
[assembly: SqlAssembly("testyukon")]
存储过程
默认的,存储过程的名称是方法名称,你可以使用
[SqlProcedure("newname"]
public void TestProcedure()
{
...
}  

重新指定
对于SqlTrigger ,则有Name,Target,ForClause属性
由于过于简单,所以不一一说明

 

关于 stinger

在我们都在等待yukon时,ibm已经在db2中引入了clr存储过程支持
代号为 Stinger  DB2 Development Add-In Technical Preview的一些特色得确不错
具体大家可以从dwcn上了解 链接

总有一种与比较yukon的冲动,我非常遗憾的看到,现在db2只支持在存储过程中使用.net assembly,而在 yukon中,支持扩展到自定义函数,存储过程,触发器,自定义数据类型,自定义聚集函数等

stinger引入clr的技术和yukon是相似的,比方说都有一个context对象(yukon是SqlContext而db2是DB2Context),但返回数据,yukon通过一个SqlPipe来实现,而db2好像就是默认什么都不做,这至少有些令人迷惑

DB2

public static void StoredProcedure1 ()
    {
        DB2Command cmd = DB2Context.GetCommand ();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "select * from customer";
       
        DB2DataReader reader=cmd.ExecuteReader();
 }
SqlServer

[SqlProcedure("TestProcedure")]
    public static void StoredProcedure1 ()
    {
        SqlCommand cmd = SqlContext.GetCommand ();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "select * from customer";
       
        SqlDataReader reader=cmd.ExecuteReader();
        SqlPipe pipe = SqlContext.GetPipe ();
        cmd.Dispose ();
        pipe.Send (reader);

    }

 

通过attribute(sql server)和通过wizard(db2)进行deply各有所长,个人无法评判,感觉sql server采用attribute的方法更简捷


对设计的思考
yukon引入.net clr,可能使许多人会有把商业逻辑引入存储过程、触发器等sql元素的冲动,对于我而言,早先e2 erp核心都是基于sql server触发器和存储过程构造,前台使用pb,我直觉的感觉yukon会是升级这个系统的最好选择。但是,请大家注意

1、.net创建的这些sql元素,采用的是static(shared)方法,还是类似于过程式编码。如何将一些设计模式和面向对象的好处引入到这些项目,是我们主要要考虑的问题
2、在beta版本中,SqlContext.GetTransaction还是未支持状态,虽然可以使用

SqlTransaction trans=SqlContext.GetConnection().BeginTransaction() ;

获得一个新事务
3、如果将大量的商业逻辑引入其中,对数据库性能可能会有一定的冲击。而不是大家所想像的更好(可以预见的是,长时间的占用一个连接,锁定等)

所以,推荐大家按项目的实际情况而定,即,如果你有大量的代码在存储过程,触发器,移动到.net过程会使之更容易维护和升级,而如果仅仅是薄薄的一层(现在一般的模式都会使用存储过程包装数据操作,如有个category表,则对应的有addcategory,deletecategory,updatecategory等存储过程),则不必要进行这种迁移。而不是盲目迁移

[2004-01-31 19:53:24 | Author:jiangjianxiao ] [] 6 comments

Total 91 Display 91 of 91
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Powered by Google App Engine