php 存储文件到oracle blob 字段_xiangmingliang123_新浪博客

mikel阅读(1140)

来源: php 存储文件到oracle blob 字段_xiangmingliang123_新浪博客

<?php      

$lob_upload $_FILES[‘lob_upload’]; 

if (!isset($lob_upload) || $lob_upload == ‘none’){ 

?> 

<form method=”post” enctype=”multipart/form-data”> 

Upload file: <input type=”file” name=”lob_upload” /><br /> 

<input type=”submit” value=”Upload” /> – <input type=”reset” value=”Reset” /> 

</form> 

<?php 

  else        

// $lob_upload contains the temporary filename of the uploaded file

     // see also the features section on file upload, 

     // if you would like to use secure uploads 

     ini_set(‘display_errors’,1); 

     $db_host   “//192.168.1.9/JSHDB”; 

     $db_user   “lterp”; 

     $db_pass   “juyitong2009”; 

     $conn oci_connect($db_user, $db_pass,$db_host); 

     $lob oci_new_descriptor($conn, OCI_D_LOB); 

     $table ‘PICTURES’; 

     $stmt oci_parse($conn, “insert into $table (id, the_blob)  

               values(my_seq.NEXTVAL, EMPTY_BLOB()) returning the_blob into :the_blob”); 

            oci_bind_by_name($stmt, ‘:the_blob’, $lob, -1, OCI_B_BLOB); 

     oci_execute($stmt, OCI_DEFAULT); 

     if ($lob->saveFile($lob_upload[‘tmp_name’])){ 

       oci_commit($conn); 

       echo “Blob successfully uploaded/n”; 

     }else{ 

       echo “Couldn’t upload Blob/n”; 

     

     oci_free_descriptor($lob); 

     oci_free_statement($stmt); 

     oci_close($conn); 

  

?>

用PHP操纵Oracle的BLOB类型的数据

mikel阅读(1847)

用过Oracle的人都知道,Oracle有一种数据类型叫VARCHAR2,用来表示不定长的字符串。VARCHAR2也是Oracle公司推荐使用的类型。但使用VARCHAR2有个问题:最大只能表示4000个字符,也就相当于2000个汉字。如果你的程序中某个字符的值要大于20002个汉字,用VARCHAR2就不能满足要求了。这时候,你有两个选择,一是用多个VARCHAR2来表示,二是用BLOB字段。这里我们来看看第二个办法。

先来大体了解一下Oracle的BLOB字段。Oracle的BLOB类型分为三种:BLOB,CLOB和BFILE。CLOB称为字符LOB,BLOB和BFILE是用来存储二进制数据的。CLOB和BLOB的最大长度是4GB,它们把值存放在Oracle数据库中。BFILE和BLOB类似,但它把数据放在外部的文件中,所以它又称为外部BLOB(External BLOB)。

我想,我们对MYSQL应该都不会陌生。MYSQL中也有类似的数据类型,如TEXT和BLOB。在PHP的MYSQL函数中,对TEXT/BLOB的操作是直接的,就象其它类型的数据一样。但在Oracle中,情况就不一样了。Oracle把LOB当作一种特殊的数据类型来处理,在操作上不能用常规的方法。比如,不能在INSERT语句中直接把值插入到LOB字段中,也不能用LIKE进行查找。

下面就通过几个例子来说明如何用PHP的OCI函数来插入,取出和查询LOB数据。

插入

不能直接用INSERT语句向LOB字段中插入值。一般情况下,有如下的几步:

1、先分析一个INSERT语句,返回一个LOB的描述符

2、用OCI函数生成一个本地的LOB对象

3、将LOB对象绑定到LOB描述符上

4、执行INSERT语句

5、给LOB对象赋值

6、释放LOB对象和SQL语句句柄

下面的这个例子是把用户上传的图片文件存放到BLOB(或BFILE中,操作稍有不同)中。首先要建一个表,结构如下:

CREATE TABLE PICTURES (
ID NUMBER,
DESCRIPTION VARCHAR2(100),
MIME VARCHAR2(128),
PICTURE BLOB
);

如果要实现ID的自动增加,再建一个SEQUENCE:

CREATE SEQUENCE PIC_SEQ;

然后是用来处理数据的PHP程序代码。

<?php

//建立Oracle数据库连接

$conn = OCILogon($user, $password, $SID);

//提交SQL语句给Oracle
//在这里要注意的两点:一是用EMPTY_BLOB()函数。这是Oracle的内部函数,返回一个LOB的定位符。在插入LOB时,只能用这个办法先生成一个空的LOB定位符,然后对这个定位符进行操作。EMPTY_BLOB()函数是针对BLOB类型的,对应于CLOB的是EMPTY_CLOB()。二是RETURNING后面的部分,把picture返回,让PHP的OCI函数能够处理。

$stmt = OCIParse($conn,”INSERT INTO PICTURES (id, description, picture)
VALUES (pic_seq.NEXTVAL, ”$description”, ”$lob_upload_type”, EMPTY_BLOB()) RETURNING picture INTO :PICTURE”);

//生成一个本地LOB对象的描述符。注意函数的第二个参数:OCI_D_LOB,表示生成一个LOB对象。其它可能的还有OCI_D_FILE和OCI_D_ROWID,分别对应于BFILE和ROWID对象。

$lob = OCINewDescriptor($conn, OCI_D_LOB);

//将生成的LOB对象绑定到前面SQL语句返回的定位符上。

OCIBindByName($stmt, ”:PICTURE”, &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt);

//向LOB对象中存入数据。因为这里的源数据是一个文件,所以直接用LOB对象的savefile()方法。LOB对象的其它方法还有:save()和load(),分别用来保存和取出数据。但BFILE类型只有一个方法就是save()

if($lob->savefile($lob_upload)){
OCICommit($conn);
echo “上传成功<br>”;
}else{
echo “上传失败<br>”;
}

//释放LOB对象

OCIFreeDesc($lob);
OCIFreeStatement($stmt);
OCILogoff($conn);
?>

还有一个要注意的地方:LOB字段的值最少要1个字符,所以在save()或savefile()之前,要确保值不能为空。否则,Oracle会出错。
取出 

对一个LOB中取出数据,有两种办法。一是生成一个LOB对象,然后绑定到一条SELECT语句返回的定位符上,再用LOB对象的load()方法取出数据;二是直接用PHP的OCIFetch***函数。第一种方法比第二种方法要麻烦得多,所以我直接说说第二种方法。

还是用上面的表。

<?php
$conn = OCILogon($user, $password, $SID);
$stmt = OCIParse($conn,”SELECT * FROM PICTURES WHERE ID=$pictureid”);
OCIExecute($stmt);

//秘密就在PCIFetchInfo的第三个参数上:OCI_RETURN_LOBS。第三个参数是FETCH的模式,如果OCI_RETURN_LOBS,就直接把LOB的值放到结果数组中,而不是LOB定位符,也就不用LOB对象的load()方法了。

if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{
echo “Content-type: ” . StripSlashes($result[MIME]);
echo StripSlashes($result[PICTURE]);
}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>

这个程序用来显示放在LOB中的数据(图片)。调用方法(假设脚本名是getpicture.php):

<IMG SRC=”getpicture.php?pictureid=99″ ALT=”放在Oracle LOB中的图片“>

查询

前面已经提了下,对于Oracle的LOB字段是不能用LIKE进行匹配的。怎么办呢?其实并不复杂,Oracle有一个匿名的程序包,叫DBMS_LOB,里面有所有的操作LOB所需的过程。

假设有象这样一个表:

CREATE TABLE ARTICLES (
ID NUMBER,
TITLE VARCHAR2(100),
CONTENT CLOB
);

文章的内容放在CONTENT字段中。

现在我们要找出所以内容中包含”PHP中文用户”的文章,可以这么来做:

<?php
$conn = OCILogon($user, $password, $SID);

//WHERE子句中用了DBMS_LOB.INSTR过程。它有四个参数,前面两个分别表示LOB的定位符(可以直接用字段表示)和要查找的字符串;后面两个分别表示开始的偏移量和出现的次数。要注意的是必须判断它的返回值,也就是要大于0。

$stmt = OCIParse($conn,”SELECT * FROM ARTICLES WHERE DBMS_LOB.INSTR(CONTENT, ”PHP中文用户”, 1, 1) > 0″);
OCIExecute($stmt);
if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{

}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>

Oracle还提供了许多用来操作LOB数据的过程,如LENGTH, SUBSTR等等。至于它们的详细用法,可以考虑Oracle的开发手册。

关于对Oracle数据库中的LOB类型的数据的操作,就说这么多了。由于我接触Oracle时间不长,本文中可能还会有错误,欢迎大家批评指正。

ThinkPHP3.2.3 连接oracle 教程 - ThinkPHP框架

mikel阅读(1304)

thinkphp讨论区给大家提供一个技术圈交流的平台,您可以在这求助各种技术难题,发布关于thinkphp的招聘,吐槽闲聊心情,分享IT生活的各种欢乐与小烦恼,快来加入我们把!让我们大家共创TP和谐新社区!

来源: ThinkPHP3.2.3 连接oracle 教程 – ThinkPHP框架

一、 操作环境
系统:Windows7 旗舰版 64位
PHP环境:WampServer Version 2.5
ThinkPHP:3.2.3 正式版
Oracle:Orcale_10g 64位版

二、 环境配置
1.打开如图的PHP扩展菜单,在绿色图标上,左键->PHP->PHP扩展,点击php_pdo_oci的扩展,这时候这个WAMP会重启,等待重启后变绿,就表示OK。

2, 再次打开刚才的localhost页面,如果找到如图4的显示,就表示目前PHP已经支持Oracle了。

三、 ThinkPHP配置
1, 把下载好的3.2.3正式版解压,项目中只需要ThinkPHP文件夹,这是核心。

2, 使用IDE新建一个项目,项目的文件夹为刚才的Wamp下的www文件夹,如果个人需要自定义别的文件夹,需要修改apache的配置文件,这里我不修改。
3, 将Thinkphp文件夹拷贝到项目文件夹中,新建一个php文件,命名index.php。
4, IDE中已经有这些文件的显示了,打开index.php,编写如下内容:
. 代码如下:

  1. <?php
  2. define(‘APP_Debug, true);
  3. require ‘./ThinkPHP/ThinkPHP.php’;

复制代码

5, 在浏览器中打开localhost/项目名/index.php,Thinkphp会帮你生成好相关文件和文件夹。
6, 对配置文件进行操作,找到:Conf文件夹下config.php文件,修改如下:
. 代码如下:

  1.     ‘DB_TYPE’ => ‘oracle’, // 数据库类型
  2.     ‘DB_HOST’ => ‘localhost’, // 服务器地址
  3.     ‘DB_NAME’ => ‘test’, //这个是我自己后来建的数据库
  4.     ‘DB_USER’ => ‘test’, // 用户名
  5.     ‘DB_PWD’ => ‘orcl’, // 密码
  6.     ‘DB_PORT’ => ‘1521’, // 端口
  7.     ‘DB_CASE_LOWER’ => true,
  8.     ‘DB_PREFIX’ => ‘ccthink_’, // 数据库表前缀
  9.     ‘DB_CHARSET’=> ‘utf8’,
  10.     ‘DB_SEQUENCE_PREFIX’ => ‘SEQ_’,

复制代码

Oracle数据库和mySQL 的结构不同,一般默认安装的数据库名是orcl,如果你使用了多个数据库监听,那么就要根据具体的监听字段来设置。比如:我本机数据库坚挺是Orcl,同时监听另外一个外网的数据库,监听字符串为Orcl2,那么如果你需要连接这个外网数据库,那么需要写的数据库名就是orcl2。

7, 经过以上的配置,是已经可以连接oracle数据库了,但是在thinkphp的实际操作中有什么注意的地方,且接着往下看。
修改oracle驱动文件 ThinkPHP\Library\Think\Db\Driver\Oracle.class.php

  1. <?php
  2. // +———————————————————————-
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +———————————————————————-
  5. // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
  6. // +———————————————————————-
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +———————————————————————-
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +———————————————————————-
  11. namespace Think\Db\Driver;
  12. use Think\Db\Driver;
  13. use PDO;
  14. /**
  15.  * Oracle数据库驱动
  16.  */
  17. class Oracle extends Driver{
  18.     private     $table        = ;
  19.     protected   $selectSQL    = ‘SELECT * FROM (SELECT thinkphp.*, rownum AS numrow FROM (SELECT  %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%) thinkphp ) %LIMIT%%COMMENT%’;
  20.     /**
  21.      * 解析pdo连接的dsn信息
  22.      * @access public
  23.      * @param array $config 连接信息
  24.      * @return string
  25.      */
  26.     protected function parseDsn($config){
  27.         $dsn  =   ‘oci:dbname=//’.$config[‘hostname’].($config[‘hostport’]?‘:’.$config[‘hostport’]:).‘/’.$config[‘database’];
  28.         if(!empty($config[‘charset’])) {
  29.             $dsn  .= ‘;charset=’.$config[‘charset’];
  30.         }
  31.         return $dsn;
  32.     }
  33.     /**
  34.      * 执行语句
  35.      * @access public
  36.      * @param string $str  SQL指令
  37.      * @param boolean $fetchSql  不执行只是获取SQL     
  38.      * @return integer
  39.      */
  40.     public function execute($str,$fetchSql=false) {
  41.         $bind = $this->bind; //TODO 新增 修复bug 修复及支持获取自增Id的上次记录 by czw
  42.         $this->initConnect(true);
  43.         if ( !$this->_linkID ) return false;
  44.         $this->queryStr = $str;
  45.         if(!empty($this->bind)){
  46.             $that   =   $this;
  47.             $this->queryStr =   strtr($this->queryStr,array_map(function($val) use($that){ return ‘\”.$that->escapeString($val).‘\”; },$this->bind));
  48.         }
  49.         if($fetchSql){
  50.             return $this->queryStr;
  51.         }
  52.         $flag = false;
  53.         if(preg_match(“/^\s*(INSERT\s+INTO)\s+(\w+)\s+/i”, $str, $match)) {
  54.             //$this->table = C(“DB_SEQUENCE_PREFIX”).str_ireplace(C(“DB_PREFIX”), “”, $match[2]);
  55.             $this->table = C(“DB_SEQUENCE_PREFIX”).str_ireplace(C(“DB_PREFIX”), “”, $match[2]).C(“DB_SEQUENCE_SUFFIX”);//TODO 新增 扩展队列名加后缀 修复bug 修复及支持获取自增Id的上次记录 by czw
  56.             $flag = (boolean)$this->query(“SELECT * FROM user_sequences WHERE sequence_name='” . strtoupper($this->table) . “‘”);
  57.         }
  58.         //释放前次的查询结果
  59.         if ( !empty($this->PDOStatement) ) $this->free();
  60.         $this->executeTimes++;
  61.         N(‘db_write’,1); // 兼容代码        
  62.         // 记录开始执行时间
  63.         $this->Debug(true);
  64.         $this->PDOStatement    =    $this->_linkID->prepare($str);
  65.         if(false === $this->PDOStatement) {
  66.             $this->error();
  67.             return false;
  68.         }
  69.         $this->bind = $this->bind ? $this->bind : $bind;//TODO 新增 修复bug 修复及支持获取自增Id的上次记录 by czw
  70.         foreach ($this->bind as $key => $val) {
  71.             if(is_array($val)){
  72.                 $this->PDOStatement->bindValue($key, $val[0], $val[1]);
  73.             }else{
  74.                 $this->PDOStatement->bindValue($key, $val);
  75.             }
  76.         }
  77.         $this->bind =   array();        
  78.         $result    =    $this->PDOStatement->execute();
  79.         $this->debug(false);
  80.         if ( false === $result) {
  81.             $this->error();
  82.             return false;
  83.         } else {
  84.             $this->numRows = $this->PDOStatement->rowCount();
  85.             if($flag || preg_match(“/^\s*(INSERT\s+INTO|REPLACE\s+INTO)\s+/i”, $str)) {
  86.                //$this->lastInsID = $this->_linkID->lastInsertId(); //
  87.                 $this->lastInsID = $this->lastInsertId($this->table);//TODO  修复bug 修复及支持获取自增Id的上次记录 by czw
  88.             }
  89.             return $this->numRows;
  90.         }
  91.     }
  92.     /**
  93.      * TODO
  94.      * 2016-05-09 新增方法 修复bug 修复及支持获取自增Id的上次记录 by czw
  95.      * 取得Oracle最近插入的ID
  96.      * @access public
  97.      */
  98.     public function lastInsertId($sequence = ) {
  99.         try {
  100.             $lastInsID = $this->_linkID->lastInsertId();
  101.         } catch(\PDOException $e) {
  102.             //对于驱动不支持PDO::lastInsertId()的情况
  103.             try {
  104.                 $lastInsID = 0;
  105.                 $seqPrefix = C(“DB_SEQUENCE_PREFIX”) ? C(“DB_SEQUENCE_PREFIX”) : ‘seq_’;
  106.                 $seqSuffix = C(“DB_SEQUENCE_SUFFIX”) ? C(“DB_SEQUENCE_SUFFIX”) : ;
  107.                 $sequence = strtoupper($sequence ? $sequence : $seqPrefix.$this->table.$seqSuffix);
  108.                 $q = $this->query(“SELECT {$sequence}.CURRVAL as t FROM DUAL”);
  109.                 if($q) {
  110.                     $lastInsID = $q[0][‘t’];
  111.                 }
  112.             } catch(\Exception $e) {
  113.                 //print “Error!: ” . $e->getMessage() . “</br>”;
  114.                 //exit;
  115.             }
  116.         }
  117.         return $lastInsID;
  118.     }
  119.     /**
  120.      * 取得数据表的字段信息
  121.      * @access public
  122.      */
  123.      public function getFields($tableName) {
  124.         list($tableName) = explode(‘ ‘, $tableName);
  125.         $result = $this->query(“select a.column_name,data_type,decode(nullable,’Y’,0,1) notnull,data_default,decode(a.column_name,b.column_name,1,0) pk “
  126.                   .“from user_tab_columns a,(select column_name from user_constraints c,user_cons_columns col “
  127.           .“where c.constraint_name=col.constraint_name and c.constraint_type=’P’and c.table_name='”.strtoupper($tableName)
  128.           .“‘) b where table_name='”.strtoupper($tableName).“‘ and a.column_name=b.column_name(+)”);
  129.         $info   =   array();
  130.         if($result) {
  131.             foreach ($result as $key => $val) {
  132.                 $info[strtolower($val[‘column_name’])] = array(
  133.                     ‘name’    => strtolower($val[‘column_name’]),
  134.                     ‘type’    => strtolower($val[‘data_type’]),
  135.                     ‘notnull’ => $val[‘notnull’],
  136.                     ‘default’ => $val[‘data_default’],
  137.                     ‘primary’ => $val[‘pk’],
  138.                     ‘autoinc’ => $val[‘pk’],
  139.                 );
  140.             }
  141.         }
  142.         return $info;
  143.     }
  144.     /**
  145.      * 取得数据库的表信息(暂时实现取得用户表信息)
  146.      * @access public
  147.      */
  148.     public function getTables($dbName=) {
  149.         $result = $this->query(“select table_name from user_tables”);
  150.         $info   =   array();
  151.         foreach ($result as $key => $val) {
  152.             $info[$key] = current($val);
  153.         }
  154.         return $info;
  155.     }
  156.     /**
  157.      * SQL指令安全过滤
  158.      * @access public
  159.      * @param string $str  SQL指令
  160.      * @return string
  161.      */
  162.     public function escapeString($str) {
  163.         return str_ireplace(“‘”, “””, $str);
  164.     }
  165.     /**
  166.      * limit
  167.      * @access public
  168.      * @return string
  169.      */
  170.     public function parseLimit($limit) {
  171.         $limitStr    = ;
  172.         if(!empty($limit)) {
  173.             $limit    =    explode(‘,’,$limit);
  174.             if(count($limit)>1)
  175.                 $limitStr = “(numrow>” . $limit[0] . “) AND (numrow<=” . ($limit[0]+$limit[1]) . “)”;
  176.             else
  177.                 $limitStr = “(numrow>0 AND numrow<=”.$limit[0].“)”;
  178.         }
  179.         return $limitStr?‘ WHERE ‘.$limitStr:;
  180.     }
  181.     /**
  182.      * 设置锁机制
  183.      * @access protected
  184.      * @return string
  185.      */
  186.     protected function parseLock($lock=false) {
  187.         if(!$lock) return ;
  188.         return ‘ FOR UPDATE NOWAIT ‘;
  189.     }
  190.     /**
  191.      * 随机排序
  192.      * @access protected
  193.      * @return string
  194.      */
  195.     protected function parseRand(){
  196.         return ‘DBMS_RANDOM.value’;
  197.     }
  198.     /**
  199.      * 执行查询 返回数据集
  200.      * @access public
  201.      * @param string $str  sql指令
  202.      * @param boolean $fetchSql  不执行只是获取SQL
  203.      * @return mixed
  204.      */
  205.     public function query($str,$fetchSql=false) {
  206.         $this->initConnect(false);
  207.         if ( !$this->_linkID ) return false;
  208.         $this->queryStr     =   $str;
  209.         if(!empty($this->bind)){
  210.             $that   =   $this;
  211.             $this->queryStr =   strtr($this->queryStr,array_map(function($val) use($that){ return ‘\”.$that->escapeString($val).‘\”; },$this->bind));
  212.         }
  213.         if($fetchSql){
  214.             return $this->queryStr;
  215.         }
  216.         //释放前次的查询结果
  217.         if ( !empty($this->PDOStatement) ) $this->free();
  218.         $this->queryTimes++;
  219.         N(‘db_query’,1); // 兼容代码
  220.         // 调试开始
  221.         $this->debug(true);
  222.         $this->PDOStatement = $this->_linkID->prepare($str);
  223.         if(false === $this->PDOStatement){
  224.             $this->error();
  225.             return false;
  226.         }
  227.         foreach ($this->bind as $key => $val) {
  228.             if(is_array($val)){
  229.                 $this->PDOStatement->bindValue($key, $val[0], $val[1]);
  230.             }else{
  231.                 $this->PDOStatement->bindValue($key, $val);
  232.             }
  233.         }
  234.         $this->bind =   array();
  235.         $result =   $this->PDOStatement->execute();
  236.         // 调试结束
  237.         $this->debug(false);
  238.         if ( false === $result ) {
  239.             $this->error();
  240.             return false;
  241.         } else {
  242.             return $this->getResult();
  243.         }
  244.     }
  245.     /**
  246.      * TODO 修复资源(clob)的查找 by czw
  247.      * 获得所有的查询数据
  248.      * @access private
  249.      * @return array
  250.      */
  251.     private function getResult() {
  252.         //返回数据集
  253.        // $result =   $this->PDOStatement->fetchAll(PDO::FETCH_ASSOC);
  254.         while($row=$this->PDOStatement->fetch(PDO::FETCH_ASSOC)){
  255.             $clobFields=$this->detectResource($row);
  256.             if(count($clobFields)>0){
  257.                 $this->retriveResourceRow($row,$clobFields);
  258.             }
  259.             $result[]=$row;
  260.         }
  261.         $this->numRows = count( $result );
  262.         return $result;
  263.     }
  264.     //将资源转换成内容 TODO 修复资源(clob)的查找 by czw
  265.     protected function retriveResourceRow(&$row,$clobFields){
  266.         if(count($clobFields)>0){
  267.             foreach($clobFields as $colName){
  268.                 $row[$colName] =stream_get_contents($row[$colName]);
  269.             }
  270.         }
  271.     }
  272.     //查找资源的字段 TODO 修复资源(clob)的查找 by czw
  273.     protected function detectResource($row){
  274.         $colNames = array();
  275.         foreach ($row as $key=>$val){
  276.             if(is_resource($val)){
  277.                 $colNames[] = $key;
  278.             }
  279.         }
  280.         return $colNames;
  281.     }
  282. }

复制代码

所有表字段通过pdo连接,被thinkphp已经强制转小写了!!
其他的使用方式和之前都一样。

附件 test.zip ( 1.1 MB 下载:188 次 )

Report Machine 5.5(报表控件包)-Delphi源码-源码库|专注为中国站长提供精品商业网站源码下载!

mikel阅读(1475)

Report Machine 5.5是一个报表控件包,For Borland Delphi Versions 4567.100% 源码. 最后更新日期:2003.4.15 目录 —– 1.说明 2.特点 3.最后更新 4.历史 5.安装 6.Demo程序 7.注册 8.版权说明 9.感谢 1.说明

来源: Report Machine 5.5(报表控件包)-Delphi源码-源码库|专注为中国站长提供精品商业网站源码下载!

Report Machine 5.5是一个报表控件包,For Borland Delphi Versions 4,5,6,7.100% 源码.

最后更新日期:2003.4.15

目录
—–
1.说明
2.特点
3.最后更新
4.历史
5.安装
6.Demo程序
7.注册
8.版权说明
9.感谢

1.说明
—-
Report Machine是一个报表控件包, Report Machine is reporting
tool component. It consists of report engine,designer and preview. Its capabilities
comparable with in QuickReport,ReportBuilder. It written on 100% Object Pascal
and can be installed in Delphi 4/5/6 and C++Builder 5/6.

2.特点
—-
复杂的报表?在report machine面前,还会有什么复杂的报表存在吗?
不,不会有的,因为这是一个功能强大,完全自动化、完全自由设计的报表控件。
对于一般的主从表,单表,你甚至只需要点动鼠标次数=你的数据字段个数就可以
完成一个完全自定义的,并且支持用户进行格式修改加工,重新设计格式的报表!
想想fast  report  吧,report  machine会fast  report会的,还会它不会的!
这是一个完全中文化报表控件,支持delphi3到delphi6,BCB3到BCB6。
它的最大优点就是:强大与自由!

report  machine目前主要能做的:
一、支持屏幕打印,控制方法多样,可以打印全部rxlib控件
全部InfoPower控件,TDBGrid,TStringGrid,TImage,TEdit等,TDBGridEh,f1book,TDecisionGrid等等众多控件。
二、支持最终用户设计、修改报表,只需连接相关的数据源,指出数据的位
置(设置报表样式),无论是主从表,子报表,套表,都可迅速生成。开发
一个报表只需几分钟的时间。
三、报表样式可以保存为rmf格式,下次可通过读入使用(配合SQL脚本就可以生成报表)。并可以把带数据的报表保存为rmp格式,在任何机器上都可以浏览、打印,而不需要数据库。
四、生成后的报表支持修改,包括字体的设置,边框的设置,修改内容等。
五、报表编辑器内自带ado,bde,ibx,Diamond  dao,dbisam等数据访问控件,可以通过这些控件开发独立的报表制作工具。其使用方法和delphi中的控件是一样的。
六、完全、自由自定义页面、边距、字体,标题和页眉页脚,并可以在自认合适的地方插入函数来实现当前日期,页合计,总合计等功能,合计字段可以放在页头,分组头,并支持条件合计,对分组合计,分页合计,总计等只需简单地设置属性即可。
七、完全支持d4–d7,c5–c6。
八、报表中可以在自认合适的事件(on  beforeprint,on  afterprint等)中加入程序脚本,以控制、或实现更复杂的打印效果。
九、更新迅速,可根据使用人员与用户的意见,不断的加入新的功能。
十、首家支持缩放打印功能,可以根据打印时选择的纸张自动缩放报表。
十一、多种格式转换,可以把做出的报表转换为html,xml,bmp,jpeg等等格式。
十二、自动对超长记录折行,超长的内容也会自动折行。
十三、最新增加TRMGridReport,类似于电子表格,非常非常适合制作复杂报表

最新更新和问题解答请访问论坛:www.pcjingning.com

3.最后更新
——–
v.3.0(Build 2003/04/15)
– 发布ReportMachine3.0

4.历史记录
——–
2003.04.15
Report Machine 3.0

5.安装
—–
以在delphi5中安装举例,在别的版本delphi中请用相应版本的包,比如在delphi6中,rm_r50.dpk换成rm_r60.dpk即可

1.首先安装tb97,或者将tb97中的源程序释放到c:\rm\source目录中,tb97下载地址:http://www.reportmachine.net/download/tb97.zip

2.在Delphi IDE中卸载以前的Report Machine版本,然后打开rm_r50.dpk,选”compile”,在打开rm_d50.dpk,选”Install”.

此版我把包分成了Runtime package和Designer package,所以要安装顺序安装

6.Demo程序
———
Report Machine包含一些例子,这是学习使用Report Machine的最快途径。

http://rmachine.8u8.com/download/demos.rar
需要用BDE Administrator建立一个Database Alias:
名称: RMachineDemo
Path:

7.注册
——
网上注册:http://rmachine.y365.com/html/register.htm
汇款地址:天津市蓟县供电局计算站 王海丰  301900  (本地址长期有效,请在汇款单上著名email信箱,如不著名,我将无法通知下载方式,最好汇款后,email通知我一声)
注册费:个人使用授权:90
单位使用授权:900

8.版权声明
———-
ReportMachine 的软件版权持有人- 王海丰
本软件中部分代码或idea来自以下控件,在此对以下控件的作者表示感谢:
FastReport (http://www.fast-report.com)
TntUnicode (http://home.ccci.org/wolbrink/tnt)
JEDI VCL (http://sourceforge.net/projects/jvcl)
TP SysTools (http://sourceforge.net/projects/tpsystools/)

9.感谢
——
感谢以下网友在ReportMachine开发过程中给予无私的帮助,我在这里谢谢了:
丁丁(sinmax@163.net)
小准(xiaochen@jnnj110.gov.cn)
jim_waw(jim_waw@163.com)
祝科峰(hzzkf@sina.com)
arm(425007@sina.com)
廖伯志(szliaobozhi@21cn.com)

如果你在使用中有什么问题或建议,或发现BUG,请与作者联系,谢谢!!!

Report Machine WWW:
http://www.reportmachine.net
http://rmachine.yeah.net

作者:
wanghaifeng_1@163.net

spring - @Controller causing java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest - Stack Overflow

mikel阅读(1042)

@Controller causing java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest

来源: spring – @Controller causing java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest – Stack Overflow

You are probably missing right dependencies, like:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <scope>provided</scope>
        <version>3.1.0</version>
    </dependency>           

Please note that your version could be 2.5, 3.0 or 3.1 – it depends on application server you are using. Also when you want to create executable war you should probably not use provided scope (depending on your servlet container).

IntelliJ IDEA搭建SpringBoot的小Demo - from威仔 - 博客园

mikel阅读(1392)

来源: IntelliJ IDEA搭建SpringBoot的小Demo – from威仔 – 博客园

首先简单介绍下Spring Boot,来自度娘百科:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。下面我们将开始进入hallo java流程。

1、工具:

①IDE – IntelliJ IDEA 14.1.7

②JDK – 1.8.0_91

③Maven – 3.3.9

 

2、Demo创建流程:

①打开idea,选择Create New Project

②项目配置,选择Spring Initializr,Project SDK选择1.8,URL选择默认,不做修改。如下图所示,然后选择Next

      

③继续项目配置

这里基本都已经自动生成了,简单介绍下:

Name:项目名称

Type:我们是Maven构建的,那么选择第一个Maven Project

Packaging:打包类型,打包成Jar文件

Java Version:jdk版本,选择1.8

Language:开发语言,选择Java

Group:对应pom文件中的groupId,项目组织的唯一标识,对应Java包的结构

Artifact:对应pom文件的artifactId,项目唯一标识,对应项目名称

Version:项目版本,对应pom文件的version

Description:项目描述,对应pom文件的description

Package:包名

④Spring Boot 版本选择,我这里选择了1.5.2,只要勾选Web下的web就可以了,然后Next

⑤项目名称和路径,填写完后Finish

⑥可以将下面这三个无关的文件删除,干净结构

⑦最后的项目结构

⑧接下来就是我们的Hallo Java测试啦,新建一个Controller

⑨come on,Just run。额,习惯Debug。。。

⑩启动成功信息,端口8080

11浏览器访问下,返回Hallo Java!

 

到这里,我们就完成了简单的Demo搭建。

maven中net.sf.json报错的解决方法 - winner_0715 - 博客园

mikel阅读(1055)

来源: maven中net.sf.json报错的解决方法 – winner_0715 – 博客园

今天在用maven添加net.sf.json的jar包的时候,代码如下:

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
</dependency>

报了一个错

Could not find artifact net.sf.json-lib:json-lib:jar:2.4 in central (https://repo.maven.apache.org/maven2)
Missing artifact net.sf.json-lib:json-lib:jar:2.4:compile

嗯 ?奇怪了,这个是从官网上查的配置啊,不对吗?最好在网上找了好久,终于找到原因了,net.sf.json添加的时候需要添加jdk的版本号,第一次听说,于是有了下面的配置

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

结果,错误没有了,编译通过了,但是我本地用的是jdk7,而那个配置里面却是jdk5,这个好像必须写5,我把jdk16/jdk17都试了一遍都不行,无奈只有用jdk15可以编译通过

因为文件名叫json-lib-2.4-jdk15.jar…..

IntelliJ IDEA maven库下载依赖包速度慢的问题 - CSDN博客

mikel阅读(1188)

 

来源: IntelliJ IDEA maven库下载依赖包速度慢的问题 – CSDN博客

在pom.xml中添加maven 依赖包时,我就发现不管是否用了翻墙,下载速度都好慢,就1M的东西能下半天,很是苦恼,于是到网上搜资料,然后让我查到了。说是使用阿里的maven镜像就可以了。我于是亲自试了下,速度快的飞起!!!

右键项目选中maven选项,然后选择“open settings.xml”或者 “create settings.xml”,然后把如下代码粘贴进去就可以了。重启IDE,感受速度飞起来的感觉吧!!!

IntelliJ IDEA强制更新Maven的包

1、手动删除Project Settings里面的Libraries内容,【Ctrl】+【Alt】+【Shift】+【S】,全选之后点击左上角的减号按钮。

2、在Maven Project的试图里的Lifecycle下面clean一下,删除之前编译过的文件;

3、项目右键->Maven->Reimport

4、如果还不能更新,那么直接删除本地仓库的全部包,然后重新下载一下。


< ?xml version="1.0" encoding="UTF-8"?>

alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central

uk
central
Human Readable Name for this Mirror.
http://uk.maven.org/maven2/

CN
OSChina Central
http://maven.oschina.net/content/groups/public/
central

nexus
internal nexus repository

http://repo.maven.apache.org/maven2
central

 

[转载]Eclipse提示No java virtual machine - 穆晟铭 - 博客园

mikel阅读(964)

来源: [转载]Eclipse提示No java virtual machine – 穆晟铭 – 博客园

第一次运行Eclipse,经常会提示下面的问题:
… No java virtual machine  was found after searching the follwing locations:
d:javaeclipsejreinjavaw.exe
‘javaw.exe’ in your current path。

 

意思:在指定路径“d:javaeclipsejreinjavaw.exe”没有找到javaw.exe。因为Eclipse启动时需要javaw.exe来启动。先查找path中各个目录以后,没有找到;就会查看就会固定地在eclipse的安装目录(如d:javaeclipse)下查找。即:先找外面装了没有;若没有则找自己带了没有。如果都没有找到,就报上面的错误。

根据提示:Eclipse要javaw.exe才能运行。所以要设置path,让Eclipse通过path变量中的路径找到javaw.exe就可以了。
解决:
在Path中设置javaw.exe的路径,如:
D:javajrein
或者:
D:javajdkin

另外,也可修改eclipse.ini 文件,在最前面加上下面两行内容:

-vm
D:/java/jdk1.6.0_10/bin/javaw.exe

PHP 连接Oracle及乱码问题笔记 - 清茶居士 - 博客园

mikel阅读(936)

来源: PHP 连接Oracle及乱码问题笔记 – 清茶居士 – 博客园

1. PHP连接Oracle

步骤1. 提取Oracle Instant Client核心DLL

从OTN 的 Instant Client 页面下载用于 Windows 的 Instant Client Basic(11g) 程序包。此压缩文件的大小大约为 48MB。创建一个子目录(例如,c:\instantclient11_2),然后从压缩文件中复制以下库到apache\bin目录下:

oraociei11.dll

orannzsbb11.dll

oci.dll
这三个文件的总大小大约为 126MB。
要使用 PHP 老版本的“oracle”扩展(在 php.ini 中使用“extension=php_oracle.dll”启用),则复制 ociw32.dll 而非 oci.dll。

步骤2:编辑环境变量,将 c:\instantclient11_2 添加到 PATH 中(系统环境变量位于其他 Oracle 目录之前)。
例如,在 Win7 上,依次单击“计算机”->右键“属性”->“高级系统设置”->“高级”->“环境变量”,编辑系统变量列表中的 PATH。
如果使用了 tnsnames.ora 文件定义 Oracle Net 服务名称,则将 tnsnames.ora 复制到 c:\instantclient11_2,并将用户环境变量 TNS_ADMIN 设置为 c:\instantclient11_2。

 

步骤3:打开php的oci8扩展 编辑 php.ini,把 OCI8 扩展打开,即去掉注释符号‘;’:extension=php_oci8.dll

重新启动 Apache。重启服务器(服务器必须重启,不然环境变量不起效)

重启后通过phpinfo() 看到以下内容则表示配置成功:

 

oci8

OCI8 Support enabled
Version 1.4.7
Revision $Id: bf2eaf558b050b6d2e6d098bed6345af7e842ea4 $
Active Persistent Connections 0
Active Connections 0
Oracle Run-time Client Library Version 11.2.0.3.0
Oracle Instant Client Version 11.2
Temporary Lob support enabled
Collections support enabled

 

 

Directive Local Value Master Value
oci8.connection_class no value no value
oci8.default_prefetch 100 100
oci8.events Off Off
oci8.max_persistent -1 -1
oci8.old_oci_close_semantics Off Off
oci8.persistent_timeout -1 -1
oci8.ping_interval 60 60
oci8.privileged_connect Off Off
oci8.statement_cache_size 20 20

2. PHP Oracle 中文乱码问题

通常缺省配置连接Oracle在处理中文时都会遇到乱码问题,其实绝大部分人都知道在客户端连接Oracle服务端前首先要在客户端正确的设置服务端的字符集信息,通过PLSQL运行“select * from V$NLS_PARAMETERS;” 即可获取oracle的字符集,变量NLS_CHARACTERSET对应的就是我们需要的字符集,比如我这里就是“WE8ISO8859P1”

设置字符集的方法如下:

方法一: 连接前设置环境变量

1 putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");
2 $conn=oci_new_connect($config['username'], $config['password'],$config['database']);

 

方法二:连接时设置环境变量

1 $conn=oci_new_connect($config['username'], $config['password'],$config['database'],'we8iso8859p1');

 

但是很快你会发现通过上述设置读取的中文数据在不设置编码的情况下可以正常显示,而一旦在页面(假如页面的字符集为UTF8)中使用则仍为乱码,

并且即便做转换 从 we8iso8859p1 -> utf-8  依旧为乱码。

其实仔细研究后发现oci8 以数据库编码WE8ISO8859P1获取数据后 自动转换为操作系统缺省的编码格式,假如我使用的操作系统缺省编码为GBK,则实际上通过OCI8读取后,字符的编码即为GBK, 因此在页面使用的时候编码转换应该为  从 GBK -> utf-8 :

 

1 echo iconv('GBK','utf-8',$vo["USERNAME"]);