Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1206448
  • 博文数量: 185
  • 博客积分: 50
  • 博客等级: 民兵
  • 技术积分: 3934
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-11 13:11
个人简介

iihero@ChinaUnix, ehero.[iihero] 数据库技术的痴迷爱好者. 您可以通过iihero AT qq.com联系到我 以下是我的三本图书: Sybase ASE in Action, Oracle Spatial及OCI高级编程, Java2网络协议内幕

文章分类

全部博文(185)

文章存档

2014年(4)

2013年(181)

分类: Sybase

2013-07-22 14:10:28

本文为本人(iihero)原创,如若转载,请尊重个人劳动,务必注明原始出处。

在ASE里使用ado.net,基本上常见的有两种方式,一种是使用oledb方式(dotnet系统框架自带),一种是直接使用ASE自带的adonet库来访问。想获取高性能,后者为佳。

而每种方式对store procedure的调用,也可以分两种模式,一种是显示指定这是调用存储过程,另一种是采取传统的存储过程调用文本方式:"{call test_proc(?, ?)}",这表示调用存储过程,带两个参数。

简单的SQL CUD操作或者SELECT查询,就不用介绍了,本文同样适合这些情形的处理。

下边是一个详细的示例,既有输出参数,同时又有输出的结果集。准备工作:
创建下述的表和示例存储过程:test_proc

 


  1. create table spring.student  
  2. (  
  3.     sno int not null primary key,   
  4.     sname varchar(32) not null,   
  5.     sgender char(1) not null,   
  6.     sbirth datetime not null,  
  7.     sage numeric(2) null,   
  8.     sdept varchar(128) null  
  9. )  
  10. go  
  11. insert into student values(2007001, '李勇', 'M', '1987-9-1', null, 'CS')  
  12. insert into student values(2007002, '刘晨', 'F', '1988-10-22', null, 'IS')  
  13. insert into student values(2007003, '王敏', 'F', '1990-2-3', null, 'MA')  
  14. insert into student values(2007004, '张铁林', 'M', '1989-4-1', null, 'IS')  
  15. go  
  16. create proc spring.test_proc(@s_name char(30), @s_count int output) with recompile  
  17. as  
  18. select @s_count = count(a.sno) from spring.student a where a.sname = @s_name  
  19. select 'demo123'  
  20. go  
  21. declare @result int  
  22. exec spring.test_proc '李勇', @result output  
  23. select @result  
  24. go  


 

示例程序:(总共4种访问方式)
重要提上边提到的两种调用模式。
还有一个是关于数据库的连接串:两个库的连接串是不一样的:
1. OLEDB
string oleString = @"Provider=Sybase.ASEOLEDBProvider;InitialCatalog=iihero;User Id=spring;Password=spring1;ServerName=sean-laptop;Network Protocol=Winsock;Server Port Address=5000";
这里我没有采用上提到的oledb连接方式,如下:
Provider=Sybase.ASEOLEDBProvider;Srvr=myASEserver,5000;Catalog=myDataBase;User Id=myUsername;Password=myPassword;
而是直接采用机器名(Server Name),端口(Server Port Address),数据库(Initial Catalog), 用户(User Id), 密码(Password)的形式,一目了然,同时你也不用依赖于创建的数据源或者interfaces文件(sql.ini)

 

2. AseDotNet
string adoNetString = @"Data Source=sean-laptop;Port=5000;UID=spring;PWD=spring1;Database=iihero;";
这种方式比较简单,机器名(Data Source), 端口(Port),用户名(UID), 密码(PWD),数据库(Database)
也是含义非常明确。

不过,值得说明的是,本文采用的是AseClient的第二个版本:即$SYBASE/DataAccess/ADONET/dll/Sybase.AdoNet2.AseClient.dll而不是Sybase.Data.AseClient.dll。因为第二个版本的实现更容易使用。
Sybase.Data.AseClient.dll中都是直接实现接口类IDbConnection, IDbCommand之类,而第二个版本则是继承抽象类DbCoonnection, DbCommand。


实际上ASE的连接串还是非常简明的。
下边是实际验证时使用的代码。读者可以根据自己的喜好选择任意一种方式。

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Data.Common;  
  5. using System.Data.OleDb;  
  6. using System.Data;  
  7. using Sybase.Data.AseClient;  
  8. namespace adonetdemo  
  9. {  
  10.     class ASEDotNetDemo  
  11.     {  
  12.         DbConnection _conn;  
  13.         DbConnection _adoNetConn;  
  14.         Sybase.Data.AseClient.AseConnection conn;  
  15.         string oleString = @"Provider=Sybase.ASEOLEDBProvider;Initial Catalog=iihero;User Id=spring;Password=spring1;Server Name=sean-laptop;Network Protocol=Winsock;Server Port Address=5000";  
  16.         string adoNetString = @"Data Source=sean-laptop;Port=5000;UID=spring;PWD=spring1;Database=iihero;";  
  17.         public void testOleDb()  
  18.         {  
  19.             try  
  20.             {  
  21.                 _conn = new OleDbConnection(oleString);  
  22.                 _conn.Open();  
  23.                 DbCommand cmd = _conn.CreateCommand();  
  24.                 cmd.CommandText = "test_proc";  
  25.                 cmd.CommandType = System.Data.CommandType.StoredProcedure;  
  26.                   
  27.                 DbParameter param = cmd.CreateParameter();  
  28.                 param.ParameterName = "@s_name";  
  29.                 param.DbType = System.Data.DbType.String;  
  30.                 param.Direction = System.Data.ParameterDirection.Input;  
  31.                 param.Value = "李勇";  
  32.                 cmd.Parameters.Add(param);  
  33.                 DbParameter param2 = cmd.CreateParameter();  
  34.                 param2.ParameterName = "@s_count";  
  35.                 param2.DbType = System.Data.DbType.Int32;  
  36.                 param2.Direction = System.Data.ParameterDirection.Output;  
  37.                 cmd.Parameters.Add(param2);  
  38.                 DbDataReader rs = cmd.ExecuteReader();  
  39.                 while (rs.Read())  
  40.                 {  
  41.                     Console.WriteLine(rs.GetString(0));  
  42.                 }  
  43.                 rs.Close();  
  44.                 // int count = cmd.ExecuteNonQuery(); // if there is no resultset  
  45.                 // output param2   
  46.                 Console.WriteLine("@s_count = " + param2.Value);  
  47.                   
  48.                 cmd.Dispose();  
  49.                 _conn.Close();  
  50.             }  
  51.             catch (Exception ex)  
  52.             {  
  53.                 System.Console.WriteLine(ex.Message + "/n" + ex.InnerException);  
  54.             }  
  55.         }  
  56.         public void testOleDb2()  
  57.         {  
  58.             try  
  59.             {  
  60.                 _conn = new OleDbConnection(oleString);  
  61.                 _conn.Open();  
  62.                 DbCommand cmd = _conn.CreateCommand();  
  63.                 cmd.CommandText = "{ call test_proc(?, ?) }";  
  64.                 DbParameter param = cmd.CreateParameter();  
  65.                 param.ParameterName = "@s_name";  
  66.                 param.DbType = System.Data.DbType.String;  
  67.                 param.Direction = System.Data.ParameterDirection.Input;  
  68.                 param.Value = "李勇";  
  69.                 cmd.Parameters.Add(param);  
  70.                 DbParameter param2 = cmd.CreateParameter();  
  71.                 param2.ParameterName = "@s_count";  
  72.                 param2.DbType = System.Data.DbType.Int32;  
  73.                 param2.Direction = System.Data.ParameterDirection.Output;  
  74.                 cmd.Parameters.Add(param2);  
  75.                 DbDataReader rs = cmd.ExecuteReader();  
  76.                 while (rs.Read())  
  77.                 {  
  78.                     Console.WriteLine(rs.GetString(0));  
  79.                 }  
  80.                 rs.Close();  
  81.                 // int count = cmd.ExecuteNonQuery(); // if there is no resultset  
  82.                 // output param2   
  83.                 Console.WriteLine("@s_count = " + param2.Value);  
  84.                 cmd.Dispose();  
  85.                 _conn.Close();  
  86.             }  
  87.             catch (Exception ex)  
  88.             {  
  89.                 System.Console.WriteLine(ex.Message + "/n" + ex.InnerException);  
  90.             }  
  91.         }  
  92.         // use traditional call mode, like: "{ call test_proc(?, ?) }"  
  93.         public void testAseAdoDotNet2()  
  94.         {  
  95.             try  
  96.             {  
  97.                 _conn = new AseConnection(adoNetString);  
  98.                 _conn.Open();  
  99.                 // method 1: DbCommand cmd = new AseCommand("{ call test_proc(?, ?) }", (AseConnection)_conn);  
  100.                 // or:  
  101.                 DbCommand cmd = _conn.CreateCommand();  
  102.                 cmd.CommandText = "{ call test_proc(?, ?) }";  
  103.                 DbParameter param = cmd.CreateParameter();  
  104.                 param.ParameterName = "@s_name";  
  105.                 param.DbType = System.Data.DbType.String;  
  106.                 param.Direction = System.Data.ParameterDirection.Input;  
  107.                 param.Value = "李勇";  
  108.                 cmd.Parameters.Add(param);  
  109.                 DbParameter param2 = cmd.CreateParameter();  
  110.                 param2.ParameterName = "@s_count";  
  111.                 param2.DbType = System.Data.DbType.Int32;  
  112.                 param2.Direction = System.Data.ParameterDirection.Output;  
  113.                 cmd.Parameters.Add(param2);  
  114.                 DbDataReader rs = cmd.ExecuteReader();  
  115.                 while (rs.Read())  
  116.                 {  
  117.                     Console.WriteLine(rs.GetString(0));  
  118.                 }  
  119.                 rs.Close();  
  120.                 // output param2   
  121.                 Console.WriteLine("@s_count = " + param2.Value);  
  122.                 cmd.Dispose();  
  123.                 _conn.Close();  
  124.             }  
  125.             catch (Exception ex)  
  126.             {  
  127.                 System.Console.WriteLine(ex.Message + "/n" + ex.InnerException);  
  128.             }  
  129.         }  
  130.         public void testAseAdoDotNet()  
  131.         {  
  132.             try  
  133.             {  
  134.                 _conn = new AseConnection(adoNetString);  
  135.                 _conn.Open();  
  136.                 DbCommand cmd = _conn.CreateCommand();  
  137.                 cmd.CommandText = "test_proc";  
  138.                 cmd.CommandType = System.Data.CommandType.StoredProcedure;  
  139.                 DbParameter param = cmd.CreateParameter();  
  140.                 param.ParameterName = "@s_name";  
  141.                 param.DbType = System.Data.DbType.String;  
  142.                 param.Direction = System.Data.ParameterDirection.Input;  
  143.                 param.Value = "李勇";  
  144.                 cmd.Parameters.Add(param);  
  145.                 DbParameter param2 = cmd.CreateParameter();  
  146.                 param2.ParameterName = "@s_count";  
  147.                 param2.DbType = System.Data.DbType.Int32;  
  148.                 param2.Direction = System.Data.ParameterDirection.Output;  
  149.                 cmd.Parameters.Add(param2);  
  150.                 DbDataReader rs = cmd.ExecuteReader();  
  151.                 while (rs.Read())  
  152.                 {  
  153.                     Console.WriteLine(rs.GetString(0));  
  154.                 }  
  155.                 rs.Close();  
  156.                 // output param2   
  157.                 Console.WriteLine("@s_count = " + param2.Value);  
  158.                 cmd.Dispose();  
  159.                 _conn.Close();  
  160.             }  
  161.             catch (Exception ex)  
  162.             {  
  163.                 System.Console.WriteLine(ex.Message + "/n" + ex.InnerException);  
  164.             }  
  165.         }  
  166.         static void Main(string[] args)  
  167.         {  
  168.             ASEDotNetDemo t = new ASEDotNetDemo();  
  169.             t.testOleDb();  
  170.             t.testOleDb2();  
  171.             t.testAseAdoDotNet();  
  172.             t.testAseAdoDotNet2();  
  173.         }  
  174.     }  
  175. }  


输出结果:
demo123
@s_count = 1
demo123
@s_count = 1
demo123
@s_count = 1
demo123
@s_count = 1





阅读(2331) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~