C#以instantclient连接 Oracle 10g (转)起名

3、双击odbc_install.exe

这本篇随笔的主旨是介绍远程Service(Service)的用法,假如拿My瑟维斯(Service)转换成为一个远道Service,还会师无会师时有发生ANR的情景吧?让大家来入手尝试一下吧。

4、控制面板->管理工具->数据源(ODBC)->添加数据源->选拔oracle
in instantclient10_2

 

C#使用instantclient连接 Oracle
10g  

通下去打开或新建MainActivity,在内部插手与MyService建立关系的代码,如下所示:

       Data Source Name 可以任意起名,推荐与SID一样

对接下去修改MainActivity中之代码,如下所示:

C#

起名 1

型->添加引用->.NET->System.Data.OracleClient.dll
(这么些DLL在假装了DOTNET 1.1尽管在)

注意android打印的消息,现在亟待在有限单过程上看

1、从Oracle网站上下载instantclient-odbc-win32-10.2.0.3.zip

[java] view
plain

copy

起名 2using System;
起名 3using System.Data;
起名 4using System.Windows.Forms;
起名 5using System.Data.OracleClient;
起名 6
起名 7namespace Test
起名 8起名 9…{
起名 10起名 11    /**//// <summary>
起名 12    /// 简洁期间,直接以实现写以构造函数中
起名 13    /// </summary>
起名 14    public class Test
起名 15起名 16    …{
起名 17        public Test()
起名 18起名 19        …{
起名 20            //
起名 21            // TODO: 在此处添加构造函数逻辑
起名 22            //
起名 23
起名 24            string ConnectionString = “Data Source=orcl; User Id=SCOTT; Password=scott”;  //连接字符串
起名 25            OracleConnection conn = new OracleConnection(ConnectionString);    //创建一个新连
起名 26            
起名 27            try
起名 28起名 29            …{
起名 30                conn.Open();    //打开连接
起名 31                OracleCommand cmd = conn.CreateCommand();
起名 32
起名 33                cmd.CommandText = “select * from emp”;    //SQL语句
起名 34                OracleDataReader rs = cmd.ExecuteReader();
起名 35
起名 36                while (rs.Read())    //读取数据,即便rs.Read()重回吗false的语句,就注明到记录集的尾部了
起名 37起名 38                …{
起名 39                    MessageBox.Show(rs.GetString(1));
起名 40                }
起名 41
起名 42                rs.Close();
起名 43            }
起名 44
起名 45            catch (Exception e)
起名 46起名 47            …{
起名 48                MessageBox.Show(e.Message);
起名 49            }
起名 50            finally
起名 51起名 52            …{
起名 53                conn.Close();
起名 54            }
起名 55        }
起名 56    }
起名 57}

重运行后,点击一下Start Service(Service)按钮或Bind
Service按钮,程序虽然会晤卡住住并无法举行其余其他操作,过一段时间后就会弹出ANR的指示框,如下图所著。

       UserID 用户名

为什么拿My瑟维斯转换成为远程Service后哪怕未汇合促成程序ANR了吧?这是由于,使用了长途瑟维斯(Service)(Service)后,My瑟维斯(Service)已经于此外一个经过中运行了,所以特会卡住该过程遭到之主线程,并无会合影响至即之应用程序。

       Description 描述

  1. public class MainActivity extends Activity {  
  2.   
  3.     private MyAIDLService myAIDLService;  
  4.   
  5.     private ServiceConnection connection = new ServiceConnection() {  
  6.   
  7.         @Override  
  8.         public void onServiceDisconnected(ComponentName name) {  
  9.         }  
  10.   
  11.         @Override  
  12.         public void onServiceConnected(ComponentName name, IBinder service) {  
  13.             myAIDLService = MyAIDLService.Stub.asInterface(service);  
  14.             try {  
  15.                 int result = myAIDLService.plus(50, 50);  
  16.                 String upperStr = myAIDLService.toUpperCase(“comes from ClientTest”);  
  17.                 Log.d(“TAG”, “result is ” + result);  
  18.                 Log.d(“TAG”, “upperStr is ” + upperStr);  
  19.             } catch (RemoteException e) {  
  20.                 e.printStackTrace();  
  21.             }  
  22.         }  
  23.     };  
  24.   
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.activity_main);  
  29.         Button bindService = (Button) findViewById(R.id.bind_service);  
  30.         bindService.setOnClickListener(new OnClickListener() {  
  31.             @Override  
  32.             public void onClick(View v) {  
  33.                 Intent intent = new Intent(“com.example.servicetest.MyAIDLService”);  

      1. intent.setPackage(“com.example.servicetest”);
  34.                 bindService(intent, connection, BIND_AUTO_CREATE);  

  35.             }  
  36.         });  
  37.     }  
  38.   
  39. }  

       TNS Service(Service) Name
下拉菜单中会自动展现环境变量TNS_ADMIN所负目录下之tnsnames.ora文件中SERVICE_NAME的号,也便是只要连的SID

接下来修改My瑟维斯(Service)中的代码,在其间实现我们正定义好之MyAIDL瑟维斯(Service)(Service)接口,如下所示:

2、解压缩至instantclient所当的目录中

 

5、Test Connection连接成

被咱来开只试验验证一下吧,修改及一样篇小说被开创的瑟维斯(Service)(Service)Test项目,在My瑟维斯(Service)(Service)的onCreate()方法被于线程睡眠60秒,如下所示:

登时一部分代码我们一定会很熟习吧?没错,这跟以瑟维斯(Service)(Service)Test的MainActivity中的代码几乎是完全相同的,只是于让Activity和瑟维斯(Service)(Service)建立关联的上我们运用了隐式Intent,将Intent的action指定成了com.example.servicetest.MyAIDLService。

 

 

[java] view
plain

copy

 

 

  1. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”  
  2.     android:layout_width=”match_parent”  
  3.     android:layout_height=”match_parent”  
  4.     android:orientation=”vertical”  
  5.      >  
  6.   
  7.    <Button   
  8.        android:id=”@+id/bind_service”  
  9.        android:layout_width=”match_parent”  
  10.        android:layout_height=”wrap_content”  
  11.        android:text=”Bind Service”  
  12.        />  
  13.   
  14. </LinearLayout>  

[java] view
plain

copy

 

接下来打开或新建activity_main.xml,在布局文件中也加盟一个Bind
瑟维斯(Service)按钮:

那么哪些才可以让Activity与一个长途瑟维斯(Service)建立关系呢?这将使AIDL来展开过进程通信了(IPC)。

脚就来拘禁一下它们的坏处吧,首先用MyService(Service)的onCreate()方法中叫线程睡眠的代码去破除,然后再运行程序,并点击一下Bind
Service(Service)按钮,你相会发现先后崩溃了!为何点击Start
Service按钮程序虽然非会合倒,而点击Bind
Service按钮就会面崩溃呢?这是由当Bind
Service按钮的点击事件之中我们相会被MainActivity和My瑟维斯(Service)建立关联,然则当前MyService(Service)已经是一个远程瑟维斯(Service)了,Activity和瑟维斯(Service)(Service)运行在少数独例外之经过当中,这时便未克还以传统的建涉的格局,程序也即夭折了。

 

点击保存之后,gen目录下虽碰面变动一个对应的Java文件,如下图所示:

[java] view
plain

copy

 

脚大家便来一步步地扣押一下AIDL的用法到底是怎的。首先需要新建一个AIDL文件,在那文件中定义好Activity需要同Service举行通信的艺术。新建MyAIDLService(Service).aidl文件,代码如下所示:

 

哼了,结合上下两首,这便是关于Service你所急需通晓之周。

 

 

为验证一下My瑟维斯(Service)(Service)现在实在已运行于此外一个历程中了,我们分别于MainActivity的onCreate()方法与MyService的onCreate()方法里进入一行日志,打印出个别所在的长河id,如下所示:

这里首先针对MyAIDL瑟维斯(Service).Stub举办了贯彻,重写里了toUpperCase()和plus()这简单个点子。那简单单主意的意分别是用一个字符串全部变换成特别写格式,以及以少独传入的平头举办相加。然后于onBind()方法校官MyAIDLService.Stub的实现再次回到。那里为啥能够这样勾画吧?因为Stub其实就是Binder的子类,所以于onBind()方法被得以向来回到Stub的落实。

将一个常备的Service转换成为远程瑟维斯(Service)其实分外简单,只需要在注册Service(Service)的将官她的android:process属性指定成:remote就好了,代码如下所示:

 

AIDL(Android Interface Definition
Language)是Android接口定义语言的意思,它可用来受有瑟维斯(Service)与多单应用程序组件之间举办超过进程通信,从而得以兑现两只应用程序共享同一个瑟维斯的法力。

 

总而言之,我们真都成促成跨越进程通信了,在一个经过面临访问到了此外一个历程遭到之法子。

  1. <?xml version=”1.0″ encoding=”utf-8″?>  
  2. <manifest xmlns:android=”http://schemas.android.com/apk/res/android”  
  3.     package=”com.example.servicetest”  
  4.     android:versionCode=”1″  
  5.     android:versionName=”1.0″ >  
  6.   
  7.     ……  
  8.       
  9.     <service  
  10.         android:name=”com.example.servicetest.MyService”  
  11.         android:process=”:remote” >  
  12.     </service>  
  13.   
  14. </manifest>  

 

[java] view
plain

copy

起名 58

[html] view
plain

copy

 

[html] view
plain

copy

ClientTest中之Activity假如想只要跟MyService(Service)建立涉其实呢不麻烦,首先要用MyAIDLService(Service).aidl文件由瑟维斯(Service)(Service)Test项目中拷贝过来,注意要拿老的包路径一起拷贝过来,完成后项目标结构要下图所示:

[html] view
plain

copy

 起名 59

今更运行一下顺序,那样虽把远程Service(Service)端的行事周就了。

咱俩只是修改了瑟维斯(Service)Connection中的代码。能够看,这里首先利用了MyAIDLService(Service).Stub.asInterface()方法将盛传的IBinder对象传换成了MyAIDL瑟维斯(Service)(Service)对象,接下便好调用在MyAIDLService.aidl文件被定义的装有接口了。这里大家先是调用了plus()方法,并传到了3和5看作参数,然后又调用了toUpperCase()方法,并传hello
world字符串作为参数,最终用调用方法的回到结果打印出来。

  1. public class MainActivity extends Activity implements OnClickListener {  
  2.   
  3.     private Button startService;  
  4.   
  5.     private Button stopService;  
  6.   
  7.     private Button bindService;  
  8.   
  9.     private Button unbindService;  
  10.       
  11.     private MyAIDLService myAIDLService;  
  12.   
  13.     private ServiceConnection connection = new ServiceConnection() {  
  14.   
  15.         @Override  
  16.         public void onServiceDisconnected(ComponentName name) {  
  17.         }  
  18.   
  19.         @Override  
  20.         public void onServiceConnected(ComponentName name, IBinder service) {  
  21.             myAIDLService = MyAIDLService.Stub.asInterface(service);  
  22.             try {  
  23.                 int result = myAIDLService.plus(3, 5);  
  24.                 String upperStr = myAIDLService.toUpperCase(“hello world”);  
  25.                 Log.d(“TAG”, “result is ” + result);  
  26.                 Log.d(“TAG”, “upperStr is ” + upperStr);  
  27.             } catch (RemoteException e) {  
  28.                 e.printStackTrace();  
  29.             }  
  30.         }  
  31.     };  
  32.   
  33.     ……  
  34.   
  35. }  
  1. Log.d(“TAG”, “process id is ” + Process.myPid());  

现行重运行程序,并点击一下Bind Service按钮,可以观察打印日志如下所示:

 

 

这既然远程瑟维斯(Service)(Service)这么好用,干脆将来大家把有的Service都转移成远程Service(Service)吧,还省得再被线程了。其实不然,远程Service非但不佳用,甚至可称得上是比较难用。一般情况下要得以无采纳远程瑟维斯(Service)(Service),就尽可能不要使其。

而你呢足以看,近日底逾进程通信其实并没有什么精神上之意向,因为当时就是当一个Activity里调用了跟一个应用程序的瑟维斯(Service)(Service)里的道。而超过进程通信的实在含义是为为一个应用程序去拜谒另一个应用程序中的Service,以促成共享Service(Service)的效劳。那么下面我们当要学一下,怎么样才可以于另的应用程序中调用到My瑟维斯(Service)里的方法。

 

 

以上篇稿子被我们领悟了,瑟维斯(Service)其实是运作于主线程里的,如若直白在Service中拍卖部分耗时的逻辑,就会面招程序ANR。

起名 60

[java] view
plain

copy

  1. package com.example.servicetest;  
  2. interface MyAIDLService {  
  3.     int plus(int a, int b);  
  4.     String toUpperCase(String str);  
  5. }  

此以构建Intent的时节是采用MyService(Service).class来指定要绑定哪一个瑟维斯(Service)(Service)的,不过以另外一个应用程序中错过绑定Service的当儿并从未MyService(Service)这多少个近乎,这时便必须以及隐式Intent了。现在修改AndroidManifest.xml中的代码,给MyService加上一个action,如下所示:

前边我们干过,应该当Service(Service)中被线程去实践耗时任务,这样即便得有效地防止ANR的起。

 

 

 

起名, 

于时Activity和MyService建立关联之后,我们如故是调用了plus()和toUpperCase()这简单独形式,远程的MyService会对传播的参数举行拍卖并重返结果,然后用结果打印出来。

  1. public class MyService extends Service {  
  2.   
  3.     ……  
  4.   
  5.     @Override  
  6.     public void onCreate() {  
  7.         super.onCreate();  
  8.         Log.d(TAG, “onCreate() executed”);  
  9.         try {  
  10.             Thread.sleep(60000);  
  11.         } catch (InterruptedException e) {  
  12.             e.printStackTrace();  
  13.         }  
  14.     }  
  15.       
  16.     ……  
  17.   
  18. }  

在直达同样篇稿子中我们早就精通,如若想使为Activity与瑟维斯(Service)(Service)之间创设关系,需要调用bind瑟维斯(Service)()方法,并将Intent作为参数传递进去,在Intent里指定好要绑定的Service,示例代码如下:

今还运行程序,并点击一下Start
Service(Service)按钮,你晤面相控制台立即打印了onCreate()executed的信,而且主界面并没有死住,也非汇合产出ANR。大概过了同等秒钟后,又会面看到onStartCommand()executed打印了下。

 

双重重新运行程序,然后点击一下Start Service(Service)按钮,打印结果一旦下图所示:

  1. public class MyService extends Service {  
  2.   
  3.     ……  
  4.   
  5.     @Override  
  6.     public IBinder onBind(Intent intent) {  
  7.         return mBinder;  
  8.     }  
  9.   
  10.     MyAIDLService.Stub mBinder = new Stub() {  
  11.   
  12.         @Override  
  13.         public String toUpperCase(String str) throws RemoteException {  
  14.             if (str != null) {  
  15.                 return str.toUpperCase();  
  16.             }  
  17.             return null;  
  18.         }  
  19.   
  20.         @Override  
  21.         public int plus(int a, int b) throws RemoteException {  
  22.             return a + b;  
  23.         }  
  24.     };  
  25.   
  26. }  

 

 

[java] view
plain

copy

起名 61

 

勿用自说,大家还早已看到,我们的过进程通信功用就完美兑现了。

 

这样的话,ClientTest中之代码也就满到位了,现在运行一下斯类型,然后点击Bind
Service按钮,此时就是相会去与长途的MyService建立涉,观看LogCat中之打印音讯如下所示:

 

可看看,不仅仅是经过id不同了,就连应用程序包名也不等同了,MyService(Service)中打印的这漫长日志,包名前边还与达到了:remote标识。

顿时即认证,MyService可以响应带有com.example.servicetest.MyAIDL瑟维斯(Service)那些action的Intent。

 

 

  1. <?xml version=”1.0″ encoding=”utf-8″?>  
  2. <manifest xmlns:android=”http://schemas.android.com/apk/res/android”  
  3.     package=”com.example.servicetest”  
  4.     android:versionCode=”1″  
  5.     android:versionName=”1.0″ >  
  6.   
  7.     ……  
  8.   
  9.     <service  
  10.         android:name=”com.example.servicetest.MyService”  
  11.         android:process=”:remote” >  
  12.         <intent-filter>  
  13.             <action android:name=”com.example.servicetest.MyAIDLService”/>  
  14.         </intent-filter>  
  15.     </service>  
  16.   
  17. </manifest>  

然后创设一个初的Android项目,起名为ClientTest,我们不怕尝试当是顺序中远程调用MyService中的法门。

 

转载http://blog.csdn.net/guolin_blog/article/details/9797169

 

起名 62

 

  1. Intent bindIntent = new Intent(this, MyService.class);  
  2. bindService(bindIntent, connection, BIND_AUTO_CREATE);  

可还有某些索要证实的是,由于当下是当不同的历程中传递数据,Android对那看似数据的格式扶助是颇少的,基本上只可以传递Java的中坚数据列、字符串、List或Map等。那么只要本身眷恋传递一个自定义的类似该怎么惩罚呢?这便得要吃这仿佛去落实Parcelable接口,并且只要于这个类似为定义一个同名的AIDL文件。这有些情节并无复杂,而且和瑟维斯(Service)(Service)关系不大,所以便不再详细举行教学了,感兴趣的情人能够协调失去查看一下有关的素材。

当上同一首著作被,我们上学了Android
Service相关的很多生死攸关内容,包括瑟维斯(Service)(Service)的骨干用法、瑟维斯(Service)和Activity举行通信、瑟维斯(Service)的绝迹情势、瑟维斯(Service)与Thread的干、以及哪成立前台瑟维斯。以上所涉及的这个知识点,基本上涵盖了多数普通支付工作中或者应用及之Service(Service)技术。然而至于瑟维斯(Service)(Service)其实还有一个越高端的使技术没有介绍,即远程瑟维斯(Service)的用法。使用远程Service甚至可以实现Android跨进程通信的效率,下面就于我们现实地学习一下。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图