精华内容
下载资源
问答
  • ES6 Promise用法小结

    万次阅读 多人点赞 2018-07-25 10:42:49
    这样能够按顺序,每隔两秒输出每个异步回调中的内容,在runAsync2中传给resolve的数据,能在接下来的then方法中拿到。 (Ps:此处执行多次是因为研究该用法的时候我在一个react的demo中进行的,该页面多个元素改变...

    目录

    1.什么是Promise

    reject的用法

    catch的用法

    all的用法

    race的用法


    1.什么是Promise

    Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。(ps:什么是原型:https://blog.csdn.net/qq_34645412/article/details/105997336

    Promise对象有以下两个特点。

    (1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

    (2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

    下面先 new一个Promise

    let p = new Promise(function(resolve, reject){
    		//做一些异步操作
    		setTimeout(function(){
    			console.log('执行完成Promise');
    			resolve('要返回的数据可以任何数据例如接口返回数据');
    		}, 2000);
    	});

    刷新页面会发现控制台直接打出

    其执行过程是:执行了一个异步操作,也就是setTimeout,2秒后,输出“执行完成”,并且调用resolve方法。

    注意!我只是new了一个对象,并没有调用它,我们传进去的函数就已经执行了,这是需要注意的一个细节。所以我们用Promise的时候一般是包在一个函数中,在需要的时候去运行这个函数,如:

    <div onClick={promiseClick}>开始异步请求</div>
    
    const promiseClick =()=>{
    	 console.log('点击方法被调用')
    	 let p = new Promise(function(resolve, reject){
    		//做一些异步操作
    		setTimeout(function(){
    				console.log('执行完成Promise');
    				resolve('要返回的数据可以任何数据例如接口返回数据');
    			}, 2000);
    		});
            return p
    	}

    刷新页面的时候是没有任何反映的,但是点击后控制台打出

    当放在函数里面的时候只有调用的时候才会被执行

    那么,接下里解决两个问题:

    1、为什么要放在函数里面

    2、resolve是个什么鬼

    我们包装好的函数最后,会return出Promise对象,也就是说,执行这个函数我们得到了一个Promise对象。接下来就可以用Promise对象上有then、catch方法了,这就是Promise的强大之处了,看下面的代码:

    promiseClick().then(function(data){
        console.log(data);
        //后面可以用传过来的数据做些其他操作
        //......
    });

    这样控制台输出

    先是方法被调用起床执行了promise,最后执行了promise的then方法,then方法是一个函数接受一个参数是接受resolve返回的数据这事就输出了‘要返回的数据可以任何数据例如接口返回数据’

    这时候你应该有所领悟了,原来then里面的函数就跟我们平时的回调函数一个意思,能够在promiseClick这个异步任务执行完成之后被执行。这就是Promise的作用了,简单来讲,就是能把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。

    你可能会觉得在这个和写一个回调函数没有什么区别;那么,如果有多层回调该怎么办?如果callback也是一个异步操作,而且执行完后也需要有相应的回调函数,该怎么办呢?总不能再定义一个callback2,然后给callback传进去吧。而Promise的优势在于,可以在then方法中继续写Promise对象并返回,然后继续调用then来进行回调操作。

    所以:精髓在于:Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:

    promiseClick()
    .then(function(data){
        console.log(data);
        return runAsync2();
    })
    .then(function(data){
        console.log(data);
        return runAsync3();
    })
    .then(function(data){
        console.log(data);
    });

    这样能够按顺序,每隔两秒输出每个异步回调中的内容,在runAsync2中传给resolve的数据,能在接下来的then方法中拿到。

    (Ps:此处执行多次是因为研究该用法的时候我在一个react的demo中进行的,该页面多个元素改变导致页面多次渲染执行所致,正常页面只渲染一次的话就所有只会执行一次)

    reject的用法

    以上是对promise的resolve用法进行了解释,相当于resolve是对promise成功时候的回调,它把promise的状态修改为

    fullfiled,那么,reject就是失败的时候的回调,他把promise的状态修改为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。

    function promiseClick(){
    		let p = new Promise(function(resolve, reject){
    			setTimeout(function(){
    				var num = Math.ceil(Math.random()*20); //生成1-10的随机数
    				console.log('随机数生成的值:',num)
    				if(num<=10){
    					resolve(num);
    				}
    				else{
    					reject('数字太于10了即将执行失败回调');
    				}
    			}, 2000);
    		   })
    		   return p
    	   }
    
    	promiseClick().then(
    		function(data){
    			console.log('resolved成功回调');
    			console.log('成功回调接受的值:',data);
    		}, 
    		function(reason){
    			console.log('rejected失败回调');
    			console.log('失败执行回调抛出失败原因:',reason);
    		}
    	);	

    执行结果:

    (PS:此处也是执行多次所以输出多次,执行多次的原因和上次原因一致)

    以上代码:调用promiseClick方法执行,2秒后获取到一个随机数,如果小于10,我们算成功,调用resolve修改Promise的状态为fullfiled。否则我们认为是“失败”了,调用reject并传递一个参数,作为失败的原因。并将状态改成rejected

    运行promiseClick并且在then中传了两个参数,这两个参数分别是两个函数,then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调。(也就是说then方法中接受两个回调,一个成功的回调函数,一个失败的回调函数,并且能在回调函数中拿到成功的数据和失败的原因),所以我们能够分别拿到成功和失败传过来的数据就有以上的运行结果

    catch的用法

    与Promise对象方法then方法并行的一个方法就是catch,与try  catch类似,catch就是用来捕获异常的,也就是和then方法中接受的第二参数rejected的回调是一样的,如下:

    function promiseClick(){
    		let p = new Promise(function(resolve, reject){
    			setTimeout(function(){
    				var num = Math.ceil(Math.random()*20); //生成1-10的随机数
    				console.log('随机数生成的值:',num)
    				if(num<=10){
    					resolve(num);
    				}
    				else{
    					reject('数字太于10了即将执行失败回调');
    				}
    			}, 2000);
    		   })
    		   return p
    	   }
    
    	promiseClick().then(
    		function(data){
    			console.log('resolved成功回调');
    			console.log('成功回调接受的值:',data);
    		}
    	)
    	.catch(function(reason, data){
    		console.log('catch到rejected失败回调');
    		console.log('catch失败执行回调抛出失败原因:',reason);
    	});	

    执行结果:

    效果和写在then的第二个参数里面一样。它将大于10的情况下的失败回调的原因输出,但是,它还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。如下:

    function promiseClick(){
    		let p = new Promise(function(resolve, reject){
    			setTimeout(function(){
    				var num = Math.ceil(Math.random()*20); //生成1-10的随机数
    				console.log('随机数生成的值:',num)
    				if(num<=10){
    					resolve(num);
    				}
    				else{
    					reject('数字太于10了即将执行失败回调');
    				}
    			}, 2000);
    		   })
    		   return p
    	   }
    
    	promiseClick().then(
    		function(data){
    			console.log('resolved成功回调');
    			console.log('成功回调接受的值:',data);
    			console.log(noData);
    		}
    	)
    	.catch(function(reason, data){
    		console.log('catch到rejected失败回调');
    		console.log('catch失败执行回调抛出失败原因:',reason);
    	});	

    执行结果:

    在resolve的回调中,我们console.log(noData);而noData这个变量是没有被定义的。如果我们不用Promise,代码运行到这里就直接在控制台报错了,不往下运行了。但是在这里,会得到上图的结果,也就是说进到catch方法里面去了,而且把错误原因传到了reason参数中。即便是有错误的代码也不会报错了

    all的用法

    与then同级的另一个方法,all方法,该方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后并且执行结果都是成功的时候才执行回调。

    将上述方法复制两份并重命名promiseClick3(), promiseClick2(), promiseClick1(),如下

    function promiseClick1(){
    		let p = new Promise(function(resolve, reject){
    			setTimeout(function(){
    				var num = Math.ceil(Math.random()*20); //生成1-10的随机数
    				console.log('随机数生成的值:',num)
    				if(num<=10){
    					resolve(num);
    				}
    				else{
    					reject('数字太于10了即将执行失败回调');
    				}
    			}, 2000);
    		   })
    		   return p
    	   }
    	   function promiseClick2(){
    		let p = new Promise(function(resolve, reject){
    			setTimeout(function(){
    				var num = Math.ceil(Math.random()*20); //生成1-10的随机数
    				console.log('随机数生成的值:',num)
    				if(num<=10){
    					resolve(num);
    				}
    				else{
    					reject('数字太于10了即将执行失败回调');
    				}
    			}, 2000);
    		   })
    		   return p
    	   }
    	   function promiseClick3(){
    		let p = new Promise(function(resolve, reject){
    			setTimeout(function(){
    				var num = Math.ceil(Math.random()*20); //生成1-10的随机数
    				console.log('随机数生成的值:',num)
    				if(num<=10){
    					resolve(num);
    				}
    				else{
    					reject('数字太于10了即将执行失败回调');
    				}
    			}, 2000);
    		   })
    		   return p
    	   }
    
    	Promise
    		.all([promiseClick3(), promiseClick2(), promiseClick1()])
    		.then(function(results){
    			console.log(results);
    		});

    Promise.all来执行,all接收一个数组参数,这组参数为需要执行异步操作的所有方法,里面的值最终都算返回Promise对象。这样,三个异步操作的并行执行的,等到它们都执行完后才会进到then里面。那么,三个异步操作返回的数据哪里去了呢?都在then里面,all会把所有异步操作的结果放进一个数组中传给then,然后再执行then方法的成功回调将结果接收,结果如下:(分别执行得到结果,all统一执行完三个函数并将值存在一个数组里面返回给then进行回调输出):

    这样以后就可以用all并行执行多个异步操作,并且在一个回调中处理所有的返回数据,比如你需要提前准备好所有数据才渲染页面的时候就可以使用all,执行多个异步操作将所有的数据处理好,再去渲染

    race的用法

    all是等所有的异步操作都执行完了再执行then方法,那么race方法就是相反的,谁先执行完成就先执行回调。先执行完的不管是进行了race的成功回调还是失败回调,其余的将不会再进入race的任何回调

    我们将上面的方法延迟分别改成234秒

    
    function promiseClick1(){
    		let p = new Promise(function(resolve, reject){
    			setTimeout(function(){
    				var num = Math.ceil(Math.random()*20); //生成1-10的随机数
    				console.log('2s随机数生成的值:',num)
    				if(num<=10){
    					resolve(num);
    				}
    				else{
    					reject('2s数字太于10了即将执行失败回调');
    				}
    			}, 2000);
    		   })
    		   return p
    	   }
    	   function promiseClick2(){
    		let p = new Promise(function(resolve, reject){
    			setTimeout(function(){
    				var num = Math.ceil(Math.random()*20); //生成1-10的随机数
    				console.log('3s随机数生成的值:',num)
    				if(num<=10){
    					resolve(num);
    				}
    				else{
    					reject('3s数字太于10了即将执行失败回调');
    				}
    			}, 3000);
    		   })
    		   return p
    	   }
    	   function promiseClick3(){
    		let p = new Promise(function(resolve, reject){
    			setTimeout(function(){
    				var num = Math.ceil(Math.random()*20); //生成1-10的随机数
    				console.log('4s随机数生成的值:',num)
    				if(num<=10){
    					resolve(num);
    				}
    				else{
    					reject('4s数字太于10了即将执行失败回调');
    				}
    			}, 4000);
    		   })
    		   return p
    	   }
     
    	Promise
    		.race([promiseClick3(), promiseClick2(), promiseClick1()])
    		.then(function(results){
    			console.log('成功',results);
    		},function(reason){
    			console.log('失败',reason);
    		});

    当2s后promiseClick1执行完成后就已经进入到了then里面回调,在then里面的回调开始执行时,promiseClick2()和promiseClick3()并没有停止,仍旧再执行。于是再过3秒后,输出了他们各自的值,但是将不会再进入race的任何回调。如图2s生成10进入race的成功回调后,其余函数继续执行,但是将不会再进入race的任何回调,2s生成16进入了race的失败回调,其余的继续执行,但是将不会再进入race的任何回调。

    race的使用比如可以使用在一个请求在10s内请求成功的话就走then方法,如果10s内没有请求成功的话进入reject回调执行另一个操作。

    补充:(由于有人问我怎么实现race的使用比如可以使用在一个请求在10s内请求成功的话就走then方法,如果10s内没有请求成功的话进入reject回调执行另一个操作。这个问题,想是我的表达有点问题,那我就举个例子)

     //请求某个table数据
        function requestTableList(){
            var p = new Promise((resolve, reject) => {
                   //去后台请求数据,这里可以是ajax,可以是axios,可以是fetch 
                    resolve(res);
            });
            return p;
        }
      //延时函数,用于给请求计时 10s
          function timeout(){
              var p = new Promise((resolve, reject) => {
                  setTimeout(() => {
                      reject('请求超时');
                  }, 10000);
              });
              return p;
          }
          Promise.race([requestTableList(), timeout()]).then((data) =>{
            //进行成功回调处理
            console.log(data);
          }).catch((err) => {
            // 失败回调处理
              console.log(err);
          });

    请求一个接口数据,10s内请求完成就展示数据,10s内没有请求完成就提示请求失败

    这里定义了两个promise,一个去请求数据,一个记时10s,把两个promise丢进race里面赛跑去,如果请求数据先跑完就直接进入.then成功回调,将请求回来的数据进行展示;如果计时先跑完,也就是10s了数据请求还没有成功,就先进入race的失败回调,就提示用户数据请求失败进入.catch回调,(ps:或者进入reject的失败回调,当.then里面没有写reject回调的时候失败回调会直接进入.catch)

     

    如果有更精辟的见解欢迎评论留言探讨,一起探讨,一起进步!若回复不及时可联系:

    展开全文
  • Unix下文件内容查看小结

    千次阅读 2016-12-15 11:35:25
    4. cat命令:直接在屏幕上显示文件全部内容,如果文件较大,屏幕就会一直滚...最后也只能看到部分.所以实际上它不适合查看文件,更多的是当做文件追加的功能在用,比如: cat fileA >> fileB: 将文件fileA的内容...

    http://lijingshou.iteye.com/blog/1981017



    本文将介绍几个最常用的命令以及使用场景

    1. tail命令

    tail命令适合用于查看实时更新的系统日志

    • -f:表示持续检查,文件的更新会实时显示出来,比如 tail -f file.log
    • -n:显示最后n行 tail -n 100 file.log

    既然有tail,就会有head命令,用于查询文件的头n行,实际上用到不多

     

    2. more命令

    如果文件较大,则部分显示文件.此外more命令还可以进行查询操作

    • 空格: 按空格下翻一页
    • 回车: 下翻一行
    • /字符串: 进行向后查询,按n查询下一个
    • q: 退出more命令

    实际上在本人机器上使用这个命令的时候,发现查询到匹配的字符串后,屏幕上并不会高亮,而且只能向后查询

     

    3. less命令

    相比more,less使用更加方便,可以进行向前,向后翻页,也可双向查询,查询结果还可以高亮

    • Page Down/空格: 向下翻页
    • Page Up: 向上翻页
    • /字符串: 向下查询
    • ?字符串:向上查询
    • n:查询下一个
    • N:反向查询下一个
    • q:退出

    4. cat命令:直接在屏幕上显示文件全部内容,如果文件较大,屏幕就会一直滚...最后也只能看到小部分.所以实际上它不适合查看文件,更多的是当做文件追加的功能在用,比如:

    • cat fileA >> fileB: 将文件fileA的内容追加到fileB

    最后,当我们既要查看文件,又需要编辑的时候可以使用vi



    本文将介绍几个最常用的命令以及使用场景

    1. tail命令

    tail命令适合用于查看实时更新的系统日志

    • -f:表示持续检查,文件的更新会实时显示出来,比如 tail -f file.log
    • -n:显示最后n行 tail -n 100 file.log

    既然有tail,就会有head命令,用于查询文件的头n行,实际上用到不多

     

    2. more命令

    如果文件较大,则部分显示文件.此外more命令还可以进行查询操作

    • 空格: 按空格下翻一页
    • 回车: 下翻一行
    • /字符串: 进行向后查询,按n查询下一个
    • q: 退出more命令

    实际上在本人机器上使用这个命令的时候,发现查询到匹配的字符串后,屏幕上并不会高亮,而且只能向后查询

     

    3. less命令

    相比more,less使用更加方便,可以进行向前,向后翻页,也可双向查询,查询结果还可以高亮

    • Page Down/空格: 向下翻页
    • Page Up: 向上翻页
    • /字符串: 向下查询
    • ?字符串:向上查询
    • n:查询下一个
    • N:反向查询下一个
    • q:退出

    4. cat命令:直接在屏幕上显示文件全部内容,如果文件较大,屏幕就会一直滚...最后也只能看到小部分.所以实际上它不适合查看文件,更多的是当做文件追加的功能在用,比如:

    • cat fileA >> fileB: 将文件fileA的内容追加到fileB

    最后,当我们既要查看文件,又需要编辑的时候可以使用vi


    展开全文
  • OTL实战小结

    千次阅读 2015-12-13 14:59:12
    以下内容是项目中使用OTL的部分小结,适合OTL初学者。大牛请绕行。 一、OTL常用接口说明 1)otl_initialize( OCI_THREADED) 初始化OTL环境。需要在程序最开始连接数据库之前调用一次。参数threaded_mode指明程序...

    前言:
    以下内容是项目中使用OTL的部分小结,适合OTL初学者。大牛请绕行。
    一、OTL常用接口说明
    1)otl_initialize( OCI_THREADED)
    初始化OTL环境。需要在程序最开始连接数据库之前调用一次。参数threaded_mode指明程序是否运行在多线程环境,注意由于OTL并没有使用同步锁或者临界段,线程安全并不能够自动得到保证。

    #define OCI_DEFAULT 0x00000000   /* the default value for parameters and attributes */
    #define OCI_THREADED 0x00000001  /* appl. in threaded environment */

    2)void set_character_set(const int char_set=SQLCS_IMPLICIT);
    如果使用了UNICODE,则该方法设置默认或国家的字符集:
    SQLCS_IMPLICIT为数据库默认字符集。(默认参数)
    SQLCS_NCHAR为数据库国家的字符集。

    3)void rlogon(…);
    rlogon( “XX/psdXX@110.220.12.33/xe”)
    连接数据库。参数同构造函数。
    4)void set_max_long_size(const int amax_size);
    set_max_long_size(OTL_MAX_LONG_SIZE);
    buffer_size参数指明存放大型对象的缓存大小,默认为3276,可以通过otl_connect的set_max_long_size()方法来改变默认的大小值 #define OTL_MAX_LONG_SIZE 80000

    5)void auto_commit_off(void); //关闭自动提交
    void auto_commit_on(void); //打开自动提交
    设置otl_connect对象的auto_commit标志。
    一旦关闭了自动连接,意味着所有的提交必须通过commit( )接口实现。

    6)void commit(void);
    同步的方式提交事务。
    void commit_nowait();
    异步的方式提交事务。

    7)void logoff();
    数据库断开。

    8)void set_commit(int auto_commit=0);
    Set the stream auto-commit flag. When the output buffer is flushed, the current transaction is automatically committed, if the flag is set. By default, the flag is set.

    9)void set_batch_error_mode(const bool batch_error_mode)
    10)void open(…);
    This function open an SQL statement and the statement
    gets parsed, all input and output variables get dynamically allocated inside the stream and automatically bound to
    the placeholders.

    二、VS2010下如何配置
    第一步:将OTL需要的lib文件和头文件以文件夹的形式放到工程目录下。
    第二步:在工程属性–>配置属性–>C/C++–>附加包含目录下,填写对应头文件相对路径。
    第三步:在工程属性–>配置属性–>链接库–>附加库目录下,填写对应lib文件包含的相对路径。
    并在附加依赖库中填写oci.lib,oraocci10.lib,ociw32.lib三个依赖库。
    第四步:工程中头文件中加入如下的包含:

    #define OTL_ORA_TIMESTAMP 
    #define OTL_ODBC_TIME_ZONE
    #define OTL_ORA10G
    #define OTL_ORA_UTF8
    #define OTL_STL
    #define OTL_ORA_MAP_BIGINT_TO_LONG
    #define OTL_BIGINT long long
    #define OTL_STREAM_READ_ITERATOR_ON
    #define OTL_STL
    #define OTL_MAX_LONG_SIZE 100*1024
    
    #include "otl/otlv4.h"

    第五步:编写属于自己的OTL代码。

    三、OTL源码范例(实现功能:增、删、改、查)
    //所有代码在VS2010以及数据库操作都没有Bug。

    #include "stdafx.h"
    #include "sql.h"
    #include <stdio.h>
    
    
    OtlSql::OtlSql()
    {
    printf("Constructor!\n");
    }
    
    OtlSql::~OtlSql()
    {
    printf("Destructor!\n");
    }
    
    bool OtlSql::sql_init(char* strsql)
    {
    bool bInitFlag = false;
    
    putenv(const_cast<char*>("NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK"));
    
    otl_connect::otl_initialize();
    try
    {
    db.rlogon(strsql);
    }
    catch(otl_exception& p)
    {
    printf("%s\n", p.msg); // print out error message
    printf("%s\n", p.stm_text); // print out SQL that caused the error
    printf("%s\n", p.var_info); // print out the variable that caused the error
    return bInitFlag;
    }
    bInitFlag = true;
    return bInitFlag;
    }
    
    
    void OtlSql::sql_close()
    {
    db.commit();
    db.logoff();
    }
    
    //1.插入
    void OtlSql::sql_insert(int nNo, int nAge, char* pszName, float fScore)
    {
    char szSqlInsert[512] = {0};
    sprintf(szSqlInsert, "insert into student_info(NO, AGE, NAME, SCORE) \
    VALUES(:f0<int>, :f1<int>, :f2<char[50]>, :f3<float>)");
    
    try
    {
    otl_stream ostream(1, szSqlInsert, db);
    ostream << nNo << nAge << pszName << fScore;
    ostream.close();
    }
    catch (otl_exception& excp)
    {
    printf("Error:%s;\n %s;\n %s.\n", excp.msg, excp.stm_text, excp.var_info);
    }
    
    }
    
    //2.删除
    void OtlSql::sql_delete(char* pszName)
    {
    char szSqlDelect[512] = {0};
    sprintf(szSqlDelect, "delete from student_info where Name = \'%s\'", pszName);
    
    try
    {
    otl_stream ostream(1, szSqlDelect, db);
    ostream.close();
    }
    catch (otl_exception& excp)
    {
    printf("Error:%s;\n %s;\n %s.\n", excp.msg, excp.stm_text, excp.var_info);
    }
    }
    
    //3更新修改
    void OtlSql::sql_update(char* pszName, float fScore)
    {
    char szSqlUpdate[512] = {0};
    sprintf(szSqlUpdate, "update student_info set SCORE = :f3<float> where NAME = \'%s\'", pszName);
    
    try
    {
    otl_stream ostream(1, szSqlUpdate, db);
    ostream << fScore;
    ostream.close();
    }
    catch (otl_exception& excp)
    {
    printf("Error:%s;\n %s;\n %s.\n", excp.msg, excp.stm_text, excp.var_info);
    }
    }
    
    
    //4查询
    void OtlSql::sql_select(int nNo)
    {
    char szSqlSelect[512] = {0};
    sprintf(szSqlSelect, "select NAME, SCORE from student_info where NO = %d", nNo);
    
    string strName = "";
    float fScore = 0.0f;
    
    try
    {
    otl_stream ostream(1, szSqlSelect, db);
    ostream >> strName >> fScore;
    cout << "Name: " << strName.c_str() << "\tScore: " << fScore << endl;
    ostream.close();
    }
    catch (otl_exception& excp)
    {
    printf("Error:%s;\n %s;\n %s.\n", excp.msg, excp.stm_text, excp.var_info);
    }
    }

    源码详情下载链接:http://download.csdn.net/detail/wojiushiwo987/9351407

    四、总结
    1.毕业2.5年,第一次项目中使用Oracle数据库,之前学习都是SQLServer用的少。
    2.这篇权当积累。

    2015-12-13 pm14:55 思于家中床前

    作者:铭毅天下

    转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/50283139

    如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

    展开全文
  • 从CPA安全到CCA安全 图示小结

    千次阅读 2020-08-21 23:06:35
    密码学可证明安全推荐书目(系列博客内容为这两本书学习笔记与内容小结): 《密码学中的可证明安全性》杨波 :清华大学出版社 《Introduction to Security Reduction》Fuchun Guo;Willy Susilo;Yi Mu :Springer ...

    从CPA安全到CCA安全 图示小结

    密码学可证明安全推荐书目(系列博客内容为这两本书学习笔记与内容小结):

    《密码学中的可证明安全性》杨波 :清华大学出版社

    《Introduction to Security Reduction》Fuchun Guo;Willy Susilo;Yi Mu :Springer

    随机谕言机模型下CPA  转换 CCA:

                

    标准模型下 CCA2:

     

    展开全文
  • //express_demo.js 文件 /** 使用淘宝 NPM 镜像 ... * cnpm install body-parser --save cnpm install cookie-parser --save cnpm install multer --save */ ...var express = require('express');...var bodyParser = ...
  • 13.5 小结

    千次阅读 2016-02-03 09:22:18
    13.5 小结正在更新内容,请稍后
  • 4.4 小结

    千次阅读 2016-02-02 16:40:31
    4.4 小结正在更新内容,请稍后
  • 7.11 小结

    千次阅读 2016-02-03 08:28:59
    7.11 小结正在更新内容,请稍后
  • 8.11 小结

    千次阅读 2016-02-03 08:41:54
    8.11 小结正在更新内容,请稍后
  • 3.4 小结

    千次阅读 2016-02-02 16:34:27
    3.4 小结正在更新内容,请稍后
  • 2.14 小结

    千次阅读 2016-02-02 16:27:33
    2.14 小结正在更新内容,请稍后
  • 12.6 小结

    千次阅读 2016-02-03 09:17:52
    12.6 小结正在更新内容,请稍后
  • 1.10 小结

    千次阅读 2016-02-02 16:22:00
    1.10 小结正在更新内容,请稍后
  • pycharman使用小结

    万次阅读 多人点赞 2018-06-06 20:43:14
    (3)上传项目 在pycharm里选择自己想要上传的项目,首先建仓:VCS->Import Into Version Control->Share Project On Github 选择share就可以了,随后会跳出同步的内容进行勾选就可以了,commit Message中也可以...
  • Dev GridControl 小结

    千次阅读 2014-03-26 19:24:01
    7、修改最上面的GroupPanel内容 代码设置方式: gridView1.GroupPanelText="1111111"; 界面设置方式: 效果如下: 8、设某一列文字和标题局中显示  代码设置方式: gridView1.Columns[0].AppearanceHeader....
  • python+selenium小结2:通过clear()清除输入的内容 #!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver import time options = webdriver.ChromeOptions() prefs = { 'profile.default...
  • QTreeWidget使用小结

    万次阅读 多人点赞 2017-09-21 21:48:19
    消息响应 消息响应是重点,记录操作内容 通常我们响应 itemClicked(QTreeWidgetItem*,int column) 点击(包括选中,也包括checkbox选择) itemPressed(QTreeWidgetItem*,int) 点击选中(不包括checkbox选择) ...
  • web前端课堂小结

    千次阅读 2018-11-23 20:05:32
    课堂小结 我们主要以京东首页为案例,进行了讲解。主要有以下知识点: 用icon时习惯用标签 网页布局主要分为固定居中布局、流动式布局、弹性布局 固定居中布局指网站内容被一个固定宽度的容器包裹,容器内的区块都...
  • 十八年开发经历小结

    万次阅读 多人点赞 2012-09-20 13:49:20
    再说个人的一些积累和看法也不一定正确,所以还是改为小结比较妥当,言下之意自己还需要继续积累进步。本文主要谈几点个人的体会,这些内容有一部分可能只是我自己遇到的问题,相信还有一些其他程序员也曾遇到或者...
  • 1.4 小结

    千次阅读 2013-07-18 11:14:23
    1.4 小结 大数据以及相关的概念、技术是业界和学界最近关注的热点内容,Hadoop在其中扮演了十分重要的角色。本节首先对Hadoop进行了简单的介绍,展示了蓬勃发展的Hadoop生态系统和Hadoop的简单历史。并在此基础...
  • git使用小结

    千次阅读 2014-11-25 22:56:59
    git使用小结
  • InputBox函数用法小结

    万次阅读 2018-11-15 01:03:57
    InputBox函数用法小结
  • 需求交流小结

    千次阅读 2018-03-08 17:36:40
    公司有个漂亮的需求姐姐要离职了,今天和大家进行了一些新的分享,记录一下。整理归类以往项目、功能:“总有一款适合你”1.成果复用,快速构建设计模型;2.预知问题,少走弯路;项目后沉淀总结:给下一次整理归类...
  • 论文小结

    千次阅读 2014-01-09 18:45:52
    这篇是《怒写论文》的姊妹篇,当时的规划1月12号之前完成小论文的编写,这里做一个阶段性小结 学习总结 写论文这段时间,几乎完全放弃了算法的练习,全心扑在论文上,虽然中间也打了两次乒乓球,还得了重感冒 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 306,806
精华内容 122,722
关键字:

内容小结