test
posted @
2015-03-26 12:49 大鳥 閱讀(107) |
評論 (0) |
編輯 收藏
OpenLdap
OpenAM
Slor
shibboleth
posted @
2015-02-04 14:56 大鳥 閱讀(229) |
評論 (0) |
編輯 收藏
Xfce
posted @
2013-04-28 16:16 大鳥 閱讀(251) |
評論 (0) |
編輯 收藏
h1. MySQL5.1.53編譯,安裝配置
Debian4下安裝MySql5.1.53
h2. 編譯
<pre>
./configure '--prefix=/usr/local/mysql5.1.53' '--with-mysqld-user=mysql' '--with-extra-charsets=all' '--with-unix-socket-path=/usr/local/mysql5.1.53/var/mysql.sock' '--with-named-curses-libs=/lib/libncurses.so.5' '--enable-assembler'
</pre>
h2. 安裝
<pre>
make && make install
</pre>
h2. 初始化數據庫
剛剛編譯安裝完成的mysql中沒有任何數據庫,包括默認的mysql數據庫,這個需要初始化安裝。
命令如下
<pre>
/usr/local/mysql5.1.53/bin/mysql_install_db
</pre>
h2. 配置
h3. 創建配置文件
我們把/usr/local/mysql5.1.53/share/mysql這個目錄下的my-medium.cnf,復制為my.cnf到mysql安裝目錄
做如下修改
在[mysqld] 配置塊中加入
skip-name-resolve #取消DNS反向解析,提高遠程訪問速度
_詳細內容,參考57上的my.cnf吧_
h3. 啟動&停止
* 啟動
<pre>
/usr/local/mysql5.1.53/bin/mysqld_safe --user=root &
</pre>
* 停止
<pre>
/usr/local/mysql5.1.53/share/mysql/mysql.server stop
</pre>
h3. 進入mysql命令行
<pre>
/usr/local/mysql5.1.53/bin/mysql -uroot
</pre>
h3. 開啟遠程訪問
# 配置cnf文件
找到你的my.cnf文件(如果用debian提供的mysql,在/etc/mysql/my.cnf)
查找 bind-address,等號后邊寫server的IP地址
# 在mysql命令行執行下列命令
<pre>
GRANT ALL PRIVILEGES ON *.* TO 'depman'@'%' IDENTIFIED BY 'depman' WITH GRANT OPTION;
</pre>
說明 : 添加depman用戶,密碼為depman,可以在任何遠程機器訪問數據庫且擁有全部權限
h3. 添加InnoDB支持
# 進入mysql命令行
# mysql> show plugin;
查看是否有InnoDB的支持,沒有的話
# mysql> install plugin innodb soname "ha_innodb.so";
# 再次執行mysql> show plugin;發現有InnoDB,安裝成功
h3. 數據移植
* 備份57上的kebin數據庫(sql文件)
<pre>
/usr/local/mysql5.1.53/bin/mysqldump --skip-lock-tables -h192.168.12.57 -uroot -proot kebin > kebin.sql
</pre>
* 導入剛才生成的sql文件到kebin數據庫
<pre>
/usr/local/mysql5.1.53/bin/mysql kebin < kebin.sql
</pre>
* 從ServerA到ServerB遷移數據
<pre>
/usr/local/mysql5.1.53/bin/mysqldump --skip-lock-tables -uroot -proot kebin | /usr/local/mysql5.1.53/bin/mysql -h192.168.12.58 -udepman -pdepman kebin
</pre>
posted @
2012-01-25 19:38 大鳥 閱讀(459) |
評論 (0) |
編輯 收藏
Linux install
①安裝VBox
\\192.168.12.200\install\VBox\VirtualBox-4.0.6-71416-Win.exe
②通過VBox安裝Linux虛擬機
Linux系統映像保存于下面的路徑下
\\192.168.12.200\debian4_iso
③通過VBox進入Linux操作系統
通過下面的命令查看當前IP狀態,并修改為靜態IP
vim /etc/network/interfaces
若修改,鍵入字母「i」即進入可編輯狀態,修正后Esc退出編輯狀態,鍵入「:wq」保存并退出
靜態IP例:
allow-hotplug eth1
#iface eth1 inet dhcp
iface eth1 inet static
address 192.168.12.189
netmask 255.255.255.0
gateway 192.168.12.1
重啟網卡:
/etc/init.d/networking stop
/etc/init.d/networking start
④輸入ifconfig查看修正后的ip狀態
查看該虛擬機是否能夠ping通自己的機器
⑤配置Linux虛擬光驅路徑
通過命令:「vim /etc/init.d/donkey_service」新建文件donkey_service
編輯文件:
# mount window share folder to /mnt/debian4_iso
mount -t cifs //192.168.12.200/debian4_iso -o username="remote",password="abcd@1234" /mnt/debian4_iso
mount -t cifs //192.168.12.200/install -o username="remote",password="abcd@1234" /mnt/nas_share
# mount debian4 iso
mount -t iso9660 -o loop /mnt/debian4_iso/debian-4.0.0-i386-DVD-1.iso /mnt/debian4/dvd01
mount -t iso9660 -o loop /mnt/debian4_iso/debian-4.0.0-i386-DVD-2.iso /mnt/debian4/dvd02
mount -t iso9660 -o loop /mnt/debian4_iso/debian-4.0.0-i386-DVD-3.iso /mnt/debian4/dvd03
mount -t iso9660 -o loop /mnt/debian4_iso/debian-4.0.0-i386-DVD-4.iso /mnt/debian4/dvd04
執行文件:sh donkey_service
注:新建虛擬機的網卡沒有訪問200的權限,可以把debian4拷貝到本機一文件夾下,共享該文件夾
⑥安裝ssh-server
安裝后就可以使用putty鏈接,操作。
aptitude install ssh-server
⑦安裝Linux必要軟件
aptitude install make -- 編譯用
⑧apache,php,mysql安裝前準備
Linux下用軟件安裝包保存位置:
\\192.168.12.200\software\install\linux\httpd-2.2.9.tar.gz
\\192.168.12.200\software\install\linux\mysql-5.1.53.tar.gz
\\192.168.12.200\software\install\linux\php-5.2.5.tar.gz
可通過FileZilla軟件,把上面的軟件包copy到Linux虛擬機上
\\192.168.12.200\software\progrem\FileZilla-3.0.9.
創建軟件包的保存位置和安裝路徑文件夾
例: mkdir /opt/soft -- 上面各個軟件包copy到此
mkdir /opt/build -- 安裝軟件時的安裝路徑
①解壓Apache
進入到該安裝包的保存路徑后,通過下面的命令進行解壓(解壓位置: ../bulid/)
tar zxvf httpd-2.2.9.tar.gz -C ../bulid/
②編譯
./configure --prefix=/usr/local/apache2 --enable-so --enable-rewrite --enable-mods-shared --enable-ssl
make
③安裝
make install
④查看是否安裝成功
/usr/local/apache2/bin/httpd -k start --啟動Apache
lsof -i:80 --查看80端口狀態,如果80端口有值,安裝成功
注:編譯或安裝過程中可能會因缺少某些文件而導致error
則根據error提示的信息,先安裝缺少的文件再重新編譯安裝
error例;
configure: error: ...No recognized SSL/TLS toolkit detected
通過命令 「aptitude search 查找內容」查找相應的文件
通過命令 「aptitude install 安裝文件名」進行安裝
mysql install
①解壓MySql安裝包
進入到該安裝包的保存路徑后,通過下面的命令進行解壓(解壓位置: ../bulid/)
tar zxvf mysql-5.1.53.tar.gz -C ../bulid/
②編譯
進入到解壓后的文件夾下
安裝mysql前需要安裝一些linux系統軟件
aptitude install lib64ncurses5-dev OR libncurses5-dev
aptitude install g++
aptitude install automake
aptitude install autoconf2.13
autoreconf --force --install
aclocal; autoheader
libtoolize --automake --force
automake --force --add-missing; autoconf
編譯MySql,安裝到/usr/local/mysql-5.1.53
./configure '--prefix=/usr/local/mysql-5.1.53' '--with-mysqld-user=mysql' '--with-extra-charsets=all' '--with-named-curses-libs=/lib/libncurses.so.5' '--enable-assembler' '--with-charset=utf8'
make
③安裝
make install
④添加權限
groupadd mysql
useradd mysql -g mysql
./scripts/mysql_install_db --user=mysql
注:
mysql_install_db出現FATAL ERROR: Could not find mysqld錯誤時,
因為/etc/mysql/下出現了個my.cnf
解決方法:
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
cp support-files/my-medium.cnf /etc/cnf
cd /usr/local/mysql-5.1.53/
chown -R root .
chown -R mysql var
chown -R mysql var/.
chown -R mysql var/mysql/.
chgrp -R mysql .
⑤運行并查看是否安裝成功
/usr/local/mysql-5.1.39/bin/mysqld_safe --user=mysql &
lsof -i:3306 --查看3306端口是否是mysql在運行。
./bin/mysql -root
exit --退出mysql
⑥修改mysql密碼
/usr/local/mysql-5.1.53/bin/mysqladmin -uroot password root
./bin/mysql -uroot -p --再次登錄
root --密碼
⑦添加別人能夠訪問的權限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
use mysql;
mysql> select User,host from user;
+------+-----------+
| User | host |
+------+-----------+
| root | % |
| root | 127.0.0.1 |
| | camp |
| root | camp |
| | localhost |
| root | localhost |
+------+-----------+
6 rows in set (0.00 sec)
注:編譯或安裝過程中可能會因缺少某些文件而導致error
則根據error提示的信息,先安裝缺少的文件再重新編譯安裝
error例;
checking for termcap functions library... configure: error: No curses/termcap library found
安裝install lib64ncurses5-dev后則此錯誤就可避免
通過命令 「aptitude search 查找內容」查找相應的文件
Php install
①解壓PHP
進入到該安裝包的保存路徑后,通過下面的命令進行解壓(解壓位置: ../bulid/)
tar zxvf php-5.2.5 -C ../bulid/
②安裝前,安裝一下必要的軟件
apt-get install libmm-dev
aptitude install libxml2-dev
②編譯
./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql-5.1.53
make
make test
③安裝
make install
④如果報錯libphp5.so找不到的話,執行下面的命令
find -name "libphp5.so" --查找
找到后進到該目錄下,把此文件copy到/usr/local/apache2/modules/下
cp -p libphp5.so /usr/local/apache2/modules/
⑤查看是否安裝成功
如果安裝成功 執行php -v 會顯示php的版本信息
注:編譯或安裝過程中可能會因缺少某些文件而導致error
則根據error提示的信息,先安裝缺少的文件再重新編譯安裝
通過命令 「aptitude search 查找內容」查找相應的文件
通過命令 「aptitude install 安裝文件名」進行安裝
Configure ssl
①制作證書
1) 首先確認OpenSSL已經被正確安裝,并且openssl可執行文件位于PATH環
境變量所包含的目錄中。
2) 創建一個RSA私鑰文件(這里的例子使用3DES加密并封裝為PEM格式):
$ openssl genrsa -des3 -out server.key 1024
請務必將你輸入的密語和server.key文件備份到一個安全的地方。你可以使用下面
的命令查看這個RSA私鑰的詳細信息:
$ openssl rsa -noout -text -in server.key
如果確有必要,你也可以為這個RSA私鑰創建一個已解密的PEM版本(不推薦):
$ openssl rsa -in server.key -out server.key.unsecure
3) 使用你剛才創建的RSA私鑰創建一個自簽名的X509證書(PEM格式):
$ openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt
這將對服務器的CSR進行簽名,并將生成一個server.crt文件。
可以使用下面的命令查看這個證書的詳細信息:
$ openssl x509 -noout -text -in server.crt
② 打開apache的ssl支持
打開/usr/local/apache2.2.18/conf/httpd.conf下面兩句的注釋
#Include conf/extra/httpd-ssl.conf
打開/usr/local/apache2.2.18/conf/extra/httpd-ssl.conf找到
SSLMutex "file:/usr/local/apache2.2.18/logs/ssl_mutex"改成
SSLMutex default
posted @
2011-12-30 06:13 大鳥 閱讀(318) |
評論 (0) |
編輯 收藏
①解壓MySql安裝包
進入到該安裝包的保存路徑后,通過下面的命令進行解壓(解壓位置: ../bulid/)
tar zxvf mysql-5.1.53.tar.gz -C ../bulid/
②編譯
進入到解壓后的文件夾下
安裝mysql前需要安裝一些linux系統軟件
aptitude install lib64ncurses5-dev OR libncurses5-dev
aptitude install g++
aptitude install automake
aptitude install autoconf2.13
autoreconf --force --install
aclocal; autoheader
libtoolize --automake --force
automake --force --add-missing; autoconf
編譯MySql,安裝到/usr/local/mysql-5.1.53
./configure '--prefix=/usr/local/mysql-5.1.53' '--with-mysqld-user=mysql' '--with-extra-charsets=all' '--with-named-curses-libs=/lib/libncurses.so.5' '--enable-assembler' '--with-charset=utf8'
make
③安裝
make install
④添加權限
groupadd mysql
useradd mysql -g mysql
./scripts/mysql_install_db --user=mysql
注:
mysql_install_db出現FATAL ERROR: Could not find mysqld錯誤時,
因為/etc/mysql/下出現了個my.cnf
解決方法:
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
cp support-files/my-medium.cnf /etc/cnf
cd /usr/local/mysql-5.1.53/
chown -R root .
chown -R mysql var
chown -R mysql var/.
chown -R mysql var/mysql/.
chgrp -R mysql .
⑤運行并查看是否安裝成功
/usr/local/mysql-5.1.39/bin/mysqld_safe --user=mysql &
lsof -i:3306 --查看3306端口是否是mysql在運行。
./bin/mysql -root
exit --退出mysql
⑥修改mysql密碼
/usr/local/mysql-5.1.53/bin/mysqladmin -uroot password root
./bin/mysql -uroot -p --再次登錄
root --密碼
⑦添加別人能夠訪問的權限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
use mysql;
mysql> select User,host from user;
+------+-----------+
| User | host |
+------+-----------+
| root | % |
| root | 127.0.0.1 |
| | camp |
| root | camp |
| | localhost |
| root | localhost |
+------+-----------+
6 rows in set (0.00 sec)
注:編譯或安裝過程中可能會因缺少某些文件而導致error
則根據error提示的信息,先安裝缺少的文件再重新編譯安裝
error例;
checking for termcap functions library... configure: error: No curses/termcap library found
安裝install lib64ncurses5-dev后則此錯誤就可避免
通過命令 「aptitude search 查找內容」查找相應的文件
通過命令 「aptitude install 安裝文件名」進行安裝
posted @
2011-12-21 20:28 大鳥 閱讀(227) |
評論 (0) |
編輯 收藏
打開Editplus,選擇 工具=》配置用戶工具,就用當前的默認組好了。單擊“添加工具”選擇第一個子項“程序”,取個名字給它,“PhpDebug”吧。在命令中瀏覽到php.exe的位置,參數選擇為“文件路徑”,這時我的界面上兩個輸入框中分別為“D:\usr\php.exe”和“ '$(FilePath)' ”。然后勾選“捕捉輸出”。
注意了,綠色部分.參數選擇為“文件路徑”時,默認是$(FilePath)沒有雙引號的.要手工加上把它包圍了. 然后點擊 “輸出模式”,進行進一步的設置。在彈出的 “輸出模式” 對話框中,我們要去掉 “使用默認輸出模式”。在正則表達式的文本框中填入“^.+ in (.+) on line ([0-9]+)”。文件名:標記表達式1,行:標記表達式2,列:無。
這里的正則表達式和PHP 中的是一樣的,目的是捕捉出錯行的信息,將文件名和行數傳遞給Editplus,這樣我們雙擊出錯信息時,就可以定位到出錯的行了。
添加函數的即時幫助功能
打開 工具 =》 配置用戶工具。點擊 用戶工具=》添加工具 ,選擇 “HTML 幫助文件”,在彈出的對話框中選擇php 的chm 格式的手冊。然后在 “菜單文字” 處填上 “php 手冊”,點確定后幫助功能就已經添加好了。
把光標移動在一個函數上函數上,點擊 工具 (或者我們可以在視圖中構選用戶工具欄), “php 手冊”。這時Editplus 會自動打開手冊,并定位到你選擇的函數的頁面。當然,使用快捷鍵是更方便的方法,快捷鍵會因為添加的順序不同而不同,看下菜單就清楚了。
利用預覽功能隨時進行測試
點擊“工具”->“參數設置”->“選擇工具” ,點擊添加 , 可以為你的文件進行定位。就是說,可以自動把放在web 目錄下的文件路徑,映射成http 開頭的web 路徑,并傳遞給Editplus 自帶的瀏覽器。這樣我們就不用總是在瀏覽器和編輯器之間切換了。
posted @
2011-06-12 19:29 大鳥 閱讀(236) |
評論 (0) |
編輯 收藏
使用forward的時候瀏覽器不知道它所請求的具體資源來源,所以地址欄不會變; 使用redirect,服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL。 forward,轉發頁面和轉發到的頁面可以共享request里面的數據. redirect,不能共享數據.
posted @
2011-06-06 18:05 大鳥 閱讀(195) |
評論 (0) |
編輯 收藏
function Parent(name){
this.name = name;
}
Parent.prototype.say = function(){
alert(this.name);
}
var parent = new Parent("wwwwww");
parent.say();
function Child(name,password){
Parent.call(this,name);
this.password = password;
}
Child.prototype = new Parent();
Child.prototype.sayword = function(){
alert(this.password);
}
var child = new Child("111111","222222222");
child.sayword();
////用call實現繼承
function Parent(name){
this.name = name;
this.say = function(){
alert(this.name );
}
}
function Child(name,password){
Parent.call(this,name);
this.password = password;
}
var child = new Child("123123","sssss");
child.say();
*/
//用APPLY實現繼承
/*
function Parent(name){
this.name= name;
this.say= function(){
alert(this.name);
}
}
function Child(name,password){
Parent.apply(this,new Array(name));
this.password = password;
this.sayworld = function(){
alert(this.password + this.name);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.say();
child.say();
child.sayworld();
posted @
2011-05-28 09:58 大鳥 閱讀(213) |
評論 (0) |
編輯 收藏
linux安裝oracle 四塊硬盤,大小分別8G,第一個硬盤sda,手動設置掛載點2個:1是 /boot 大小設定為400M,2是設置為根分區/,剩余的空間
第2個硬盤sdb,8個G全部設定為swap區。按理說是內存2倍就夠。為了跑oracle能夠順利
第3個硬盤sdc,設置2個掛載點,一個是/home,一個是/tmp,分別可以是4個G
第4個硬盤是sdd,該硬盤完全的安裝oracle,掛載點是/uo1
posted @
2011-03-06 09:00 大鳥 閱讀(220) |
評論 (0) |
編輯 收藏
Mysql 的rank 函數如何實現
表特征:
mysql> select * from test;
+------+------+
| a | b |
+------+------+
| 1 | 20 |
| 1 | 21 |
| 1 | 24 |
| 2 | 20 |
| 2 | 32 |
| 2 | 14 |
+------+------+
6 rows in set (0.00 sec)
現在,我們以a分組,查詢b列最大的2個值。 這條sql要怎么寫了?
1.創建表
Create Table: CREATE TABLE `sam` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
2.插入模擬數據
INSERT INTO `sam` VALUES (1,10),(1,15),(1,20),(1,25),(2,20),(2,22),(2,33),(2,45);
+------+------+
| a | b |
+------+------+
| 1 | 10 |
| 1 | 15 |
| 1 | 20 |
| 1 | 25 |
| 2 | 20 |
| 2 | 22 |
| 2 | 33 |
| 2 | 45 |
+------+------+
3.SQL實現
select a,b,rownum,rank from
(select ff.a,ff.b,@rownum:=@rownum+1 rownum,if(@pa=ff.a,@rank:=@rank+1,@rank:=1) as rank,@pa:=ff.a
FROM
(select a,b from sam group by a,b order by a asc,b desc) ff,(select @rank:=0,@rownum:=0,@pa=null) tt) result
having rank <=2;
4.結果:
+------+------+--------+------+
| a | b | rownum | rank |
+------+------+--------+------+
| 1 | 25 | 1 | 1 |
| 1 | 20 | 2 | 2 |
| 2 | 45 | 5 | 1 |
| 2 | 33 | 6 | 2 |
+------+------+--------+------+
4 rows in set (0.00 sec)
posted @
2011-01-28 13:28 大鳥 閱讀(4048) |
評論 (2) |
編輯 收藏
記得剛參加工作時(那是97年),中國的IT剛剛興起,那時,作為一個IT人士是一件很光榮的事,而那時的我正在做電氣和電子相關的工作。99年第一次跳槽,進入了IT行業做軟件開發。至今,中國的IT已經走過了十多年。但昔日的“光榮一員”卻成為了現在的“IT農民工”,這究竟是怎么了?是中國的IT發展已經很好了所造成的嗎?不是!在我看來中國的IT還比較的原始,還有很大的提升空間。我認為造成這一切的都是我們自己,是人!是我們的意識和方法問題。還記得剛從事軟件行業時,當時有一句話很流行,這句話現在應當還能聽到,那就是:做IT是吃青春飯。說實現在的,一直以來我對于這句話一點都不認同,但最近慢慢的覺得有道理。這種意識的轉變不是因為自己在職業生崖上出現了什么問題,而是觀察身邊的人發現這句話還真有道理。由于不注意方法和不轉變意識,我們當中的不少人過著“有工作沒有生活”的日子,被工作壓得失去了激情。接下來,讓我說說我能想到或是看到的一些問題。
1)我們從學校畢業以后,覺得學習到此結束,應當是享受人生的時候了。其實,學習和享受生活是“正交”的,我們完全可以即學好又生活好。毫無疑問我們是生活在競爭的環境中的,那競爭的依據是什么呢?就是我們的能力。大家參加工作后應當知道,我們學校所學的東西在現實工作中不足以成為我們的核心竟爭力。要打造自己的核心竟爭力,必須學習,而且是在自己的業余時間學習。當然,工作也是一種學習方式,只是這種學習方式不容易創造很大的能力區分度。此外,學習是保持激情的有效方法。我工作近12年了,在軟件行業干了大約10年,但是至今我還保持著非常好的工作激情,這是我很多同事對于我的評價,這一點我想與我保持學習很是相關。學習是我從學校畢業開始一直沒有放棄去做的事!學得多了,自然會想去改變些什么,進而使得我們有激情。我在面試別人的時候,我一定會問題的一個問題是:你平時看書嗎?看些什么書?一個不看書的人,其能力不可能很高,看問題的深度也不會深到哪兒去。通過看書,能讓我們更快的積累知識和經驗。有些彎路我們不是需要自己去走、有些錯誤我們不是非得犯了才知道、有些好方法和想法也不是一定要我們自己去想,看書能讓我們站得更高、看得更遠。當然,學習過了的東西應當轉化為我們自己的東西(參見第14、15點)。
2)認為自己的能力與工作的年份是成正比的一條直線。在有些行業可能是,但在IT行業,這種想法是不對的。如果你了解三極管,我想我們的能力與工作年份的關系更像是一條伏安特性曲線。在開始的一段時間是線性的(因為我們剛畢業什么都不會),但之后從某一點開始永遠是一個飽和區,到了飽和區后,能力的變化就非常的小了。這里要指出來的是,這條曲線的出現是因為我們從參加工作以來,都是采用同一種原始的方法去對待我們的工作的。如果我們善于改變自己的工作和學習方法,那么就不會得到一條伏安特性曲線,而有可能是一條接近直線的線。一個工作了七、八年左右的人,如果沒有形成自己的一些思想(比如,設計思想),那么我認為很是有問題,自己得多去想想為什么。我們真正學習的黃金時間就是前面的七、八年左右。
3)不明白練“內功”的重要性。這里的內功是指系統性的分析和看待問題,或是其它的一些能力(比如軟件設計的能力)。有些人今天學這個、明天學那個,總喜歡學“新”技術,但忘記了將所學的東西串起來從而系統性的去掌握這些技術背后的東西。其實,一旦學精了一樣,很多東西是相通的,如此一來,我們很容易快速的去掌握新的東西。再說說軟件開發,其實學習編程語言是簡單的,是基本功而且不是軟件開發的全部,軟件開發要學習的是如何設計好一個軟件,這一點要掌握一定原則和方法,比如我在
《一個好的設計應當具備哪些要素》中提到到的“四性”就可以作為我們設計時的一些原則。軟件設計能力是本質,而編語言只是一種表達設計的工具。當我們“內功”好了以后,學什么都快、做得也好、看得也深,這與練功夫是一樣的道理。
4)害怕變化。擁抱變化往往能帶給我們提高的機會。我們都有自己的舒適圈,我們害怕變化打破我們的舒適圈,但舒適圈的打破不是使得我們沒有了舒適圈,相反意味著我們的舒適圈越來越大。我敢說,現在還有人在用Visual C++ 6.0做開發,而現在最新的是Visual Studio 2008(2010馬上也要上市了),這不是因為Visual C++ 6.0比Visual Studio 2008好用,而是我們不想改變,還找個借口說“Visual C++太經典了”。而事實是,Visual Studio 2008能幫助我們更快的找出問題,不信試試看!我認為,一個勇于擁抱變化的人,他(她)的能力往往更容易提高。
5)過于埋頭苦干。有的人一接到任務那可就埋頭苦干起來了,有時應當停下來想一想:我這樣做的方法是不是很有效率?能不能通過學一點別的工具或是方法來使我的工作更高效?我能從中學到新的東西呢?還是只是一種重復性的體力勞動?還存在一種人,這種人的確很能干,因此領導什么事都讓他(她)出馬,這樣一來再苦再累都扛下來。這個人,從上司的角度來看,很好,但從個人的發展來看不一定是一件好事。你想,這個團隊沒有你就不行了?我想可能性很小。那如果是這樣為什么什么事都要你干呢?有的工作其實干過了一遍就沒有什么可學的,只是上司因為放心你才將事情交給你,在這種情況下,花再多的時間去干對于自己來講可能是在浪費時間。如果不干,省出來的時間我們可以去學其它的東西??赡苡腥藭?,我如果不答應上司(參見第12點),那會不會對我的績效不大好呢?其實,這種想法大可不必了,加上有時績效并不是真正的公平(其實世上不存在完全的公平)。今年績效好是一個短期利益,如果多學一點提高自己則是一種長期的利益。再說,我們不干的話還可以給別人創造一些鍛煉的機會。真的是雙贏!
6)不善于思考。對于工作有時就是一個應聲蟲,別人怎么說,我們就怎么做。有時更為可怕的是:為什么那么做?合不合理?這種做法與我想到的做法有什么不同?這些問題全都不去想。一個沒有自己思想的人,不可能在工作中比別人出色,能力自然也不會太高。
7)不明白高效的完成工作對于我們自己意味著什么。高效意味著我們可以花節約下來的時間去學習、生活,畢竟工作不是我們人生的全部。我們時刻應當警覺自己是不是在做無效率的工作,如果是,想盡辦法找出自己無效率的原因并改善它。有時我們會找借口,說現在太忙了,沒有時間去改善,但真相不是這樣的。我們完全可以通過一段時間的努力找到一種好的解決方法,將自己解放出來。的確,在忙的時候,如果為了解決無效率問題而花時間去學習其它的東西,那會讓我們更加的忙。但這種更加的忙(短期的)是有回報的,而且往往回報很不錯(長期的),不要總是想“等我有時間時再來改善”,“亂中求冶”永遠是王道!
8)見難就退,而不是迎難而上。容易意味著我們所學到的東西很少,或是根本就沒有。做一百件容易的事,不如做一件難的事所學到的東西多。難的事多做一件,信心也會更強一點。
9)不善于表達我們對問題的不同看法。有些人在工作中不敢去表達自己與別人相左的想法。我想,如果存在相左的意見,說明當中有可能會是別人有些東西沒有想到,或是我們自己有些東西沒有想到,而通過交流我們有可能相互提高。擁有一個開放的態度面對相左的意見!
10)缺乏創新。一說到創新,比較容易讓我們想到那種改變全世界的大舉,其實不然,任何一種能改善我們生活的行為都可以認為是一種創新。創新也是一種思考和行動,是一種勇于改變現狀的思考和行動。有的人在做一項工作時,其中有很多的重復(動作),即使煩,他(她)也不會想想是否可以寫一個腳本去改變、或是采用什么方式解放自己。這一點或許與害怕變化(參見第4點)有關!
11)不善于記筆記和總結。對于我們IT人士,筆記不一定要寫在本子上,可以寫成一個Word文檔,或是其它的什么文件。在筆記中將自己碰到的問題寫下來,這便于我們需要用的時候馬上能找到。有了筆記我們能更高效的工作以及更高興的工作。好處很明顯,干嗎不記筆記呢?通過筆記我們也能很好的總結自己,發現一些有待于提高的部分。
12)不善于與上司溝通。通過溝通,一是可以從上司那得知他(她)對于我們的期望是什么,從而,我們可以得知自己的工作方式、方法是否與上司的期望是一致。如果不一致要想想,是不是自己可以改善,或是反過來改變上司原來的想法。第二就是要告訴上司你所期望的。比如,你想升級(職),那可以與上司說一說,當然,前提是你覺得自己的確能勝任??赡苓@一次上司并不會答應我們的要求,那也正常,因為他(她)有自己的考慮,此時上司可能會與你說原因。我們不能報著不同意就離職的態度來提要求。一次不同意,那我下次再提。在這種情況下,上司如果有一個名額,那很有可能就考慮到你了。溝通即簡單也不簡單,你所想的、做的不一定就是上司所想要的,如果這樣的話結果自然也不會令自己滿意。
13)少了一點追求完美的執著。人是不完美的,所以我們要去追求完美。追求完美的人更容易出色、更具責任心,做事往往也顯得更專業。
14)不明白模仿的重要性。人天生就是模仿者,模仿多了,我們就會形成一定的思考和行事習慣,慢慢的也就轉化成了自己的能力。我想很多人看過《設計模式》,可能在看時也有一種同感:其實,不少模式我們平時都在用。我做設計時,從來不去套《設計模式》中的模式,我能憑自己的直覺找到一種好的設計,當然,有時我得進行多次的反復。但是不是每一個人都有很好的直覺,這種直覺其實是一種能力,是長期的學習、思考和模仿所積累的能力。在我看來模仿是將所學東西轉換為自己的能力的很好的一種方法。
15)只求知其然,不求知其所以然。學習不能只是表面化的“學過了”,還要從深層次去想其背后的思想和原理是什么,這往往使得我們更加容易的去分析和解決問題。想得多了,自己的層次才有可能提高,如果只是停留在被動的接受,那很難有所提高。
16)少了那么一點堅持。我們有可能在學習過程中少了那么一點堅持,本來已經做(學)到了90%,再堅持一下我們就能上一個臺階,能力也會有一個質的飛躍。但是很可惜,就是因為不多堅持那么一點,最后很有可能前功盡棄,最為可怕的是會打擊我們的自信心 — 下次就不學了!人與人能力的區別或許可以說是能否堅持的區別!
17)不熱愛自己的職業。這一點可能是一些綜合性的因素造成的,或是在工作中沒有找到成就感、或是自己不適合這個行業,等等。有時好好的想想,問問自己是什么原因造成的這種狀況。如果是因為自己的一些方式或方法不對,那么看看是否能改變。如果的確是因為自己對行業沒有興趣,那我想長痛不如短痛,還是應當轉行去做自己有興趣的工作。快樂的工作著是重要的!
此外,除了注意個人的提高,我想我們還要注意“金字塔原理”。無論我們能力多高,但我們還是處于金字塔中的一層,也就是說能力強的人的數量總是相對的少,我們不可能人人都在頂上。即然這樣的話,我們是不是就不應當去提高了呢?我想不是的,畢竟提高能改善我們的生活,而生活,是自己的。
看了上面的這些,是不是覺得有些道理呢?千萬別看過就完了,而是要有所行動!擁抱變化!
本文出自 “李云” 博客,請務必保留此出處http://yunli.blog.51cto.com/831344/169937
本文出自 51CTO.COM技術博客
posted @
2010-02-06 08:35 大鳥 閱讀(164) |
評論 (0) |
編輯 收藏
下面是我所掌握的使用ADO對數據庫操作的一些常用方法,主要是提供給初學者作為參考,有不對的地方請指正。如有補充不勝榮幸
準備工作
========
Dim conn As New ADODB.Connection '創建一個 Connection 實例,在這里使用New等于將Dim和Set合并為一段代碼執行
Dim rs As ADODB.Recordset '創建一個 Recordset 實例,不使用New 是因為,經常需要重復使用Set,因此沒必要在這里使用
Dim CnStr As String, Sql As String '創建兩個字符串變量分別存放兩個集合的SQL語句代碼段
1、裝載數據庫(不屬于Recordset集合)
=============
Dim FileNamw$, DbIp$, DbName$, DbUser$, DbPw$
'以上5個字符串變量分別表示文件路徑和文件名、數據庫地址、數據庫名、數據操作員用戶名、操作員密碼
FileName = App.Path & "\'數據庫名'"
DbIp = "數據庫地址"
DbName = "數據庫名"
DbUser = "數據操作員用戶名"
DbPw = "操作員密碼"
'以上變量根據數據庫類型的不同而不同,有可能只需要1至兩個變量
'1)連接Access數據庫:
'-------------------
CnStr = "PROVIDER=microsoft.jet.oledb.3.51;persist security info =false;data source=" & FileName & ";Jet OLEDB:Database Password=" & DbPw
'2)連接Oracle數據庫:
'-------------------
CnStr = "PROVIDER=MSDAORA.1;Password=" & DbPw & ";User ID=" & DbUser & ";Data Source=" & FileName & ";Persist Security Info=True"
'其中:
'PASSword: 密碼
'User ID: 用戶號
'Data Source: 數據庫名
'Persist Security Info:
'Provider:
'3)連接VF的DBF庫:
'----------------
CnStr = "PROVIDER=MSDASQL.1;Persist Security Info=False;Driver={Microsoft Visual FoXPro Driver};UID=" & DbUser & ";SourceDB=" & FileName &
";SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;"
'4)連接SQL的數據庫
'------------------
CnStr = "PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;uid=" & DbUser & ";pwd=" & DbPw & ";DRIVER=SQL Server;DATABASE=" & DbName & ";WSID=GQSOFT;SERVER=" &
DbIP
'也可以使用這段簡易代碼 CnStr = "Provider=SQLOLEDB;Data Source=" & DbIp & ";DATABASE=" & DbName & ";UID=" & DbUser & ";pwd=" & DbPw
Conn.Open cnstr '使用 Connection 集合的 Open 方法 與數據庫建立連接
2、Recordset集合的常用方法
==========================
'1)打開一個表
'------------
Sql = "select * from 表名" 'SQL查詢語句
Set rs = New ADODB.Recordset '新建一個實例
rs.Open SQL, conn '使用 Open 方法打開數據庫中的一個表
'注意,這種打開方式只能使用 rs.MoveNext (即,向后移動行坐標)而不能像其他方向,并且不能修改數據內容
'
'rs.Open SQL, conn,1 '雖然只加了個“1”,但這種方法可以向任何方向移動行坐標。
'
'以下參數代表了這個可選值的含義
'0 = adOpenForwardOnly (默認值)打開僅向前類型游標。
'1 = adOpenKeyset 打開鍵集類型游標。
'2 = adOpenDynamic 打開動態類型游標。
'3 = adOpenStatic 打開靜態類型游標。
'
'雖然使用以上方法可以可以實現行坐標(游標)的任意移動,但是仍然無法寫入數據。因此需要進一步的對Open 方法進行完善
'rs.Open SQL, conn, 1, 3 '后面的3是確定讀寫權限的
'以下參數代表了這個可選值的含義
'1 = adLockReadOnly (默認值)只讀 — 不能改變數據。
'2 = adLockPessimistic 保守式鎖定(逐個) — 在編輯時立即鎖定數據源的記錄。
'3 = adLockOptimistic 開放式鎖定(逐個) — 只在調用 Update 方法時才鎖定記錄
'4 = adLockBatchOptimistic 開放式批更新 — 用于批更新模式(與立即更新模式相對)。
'
'2)讀寫數據
'----------
'增加一行記錄并對新記錄的內容進行修改并保存可以如下寫法
rs.AddNew '增加一行記錄
rs("...")="..." '數據讀寫操作
...
rs.UpDate '保存寫入資料,如果使用只讀權限,則不能使用這個方法
rs.Close '這個方法用來關閉你所代開的表,如果不使用這個方法也可以,但是數據庫仍然認為你在對標進行鎖定,可造成數據庫負擔過重
2、對數據進行篩選和排序
=======================
Sql = "select * from 表名" 'SQL查詢語句
'以上為打開一個表的所有內容
Sql = "select top 50 * from 表名" 'SQL查詢語句
'以上為只打開前50行的記錄
Sql = "select top 50 列名1,列名2,列名5 from 表名" 'SQL查詢語句
'以上為只打開前50行的記錄,并且只打開第1、2、5列數據
Sql = "select * from 表名 where 列名1='" & 字段 & "'" 'SQL查詢語句
'以上為一個簡單的篩選,表示打開的內容必須符合[列名1='" & 字段 & "'"]的內容
'需要注意的是,數據庫列的類型必須匹配,比如字符串類型需要以單引號括起
'而數字類型則不能用單引號括起
'另外SQL語句還支持通配符,例如 列名1 like '%" & 字段 & "%'" 表示包含[字段]
'在表達式中的匹配
'? _(下劃線) 任何單一字符
'* or % 零個或多個字符
'# 任何單一數字(0 — 9)
'[charlist] 任何在字符表中的單一字符
'[!charlist] 任何不在字符表中的單一字符
'注:根據數據庫的不同?、_和*、%的應用有所差別,比如SQL只使用% 和 _ 分別代表多個字符和單一字符
SQL = "select * from 表名 where 列名1='" & 字段 & "' ORDER BY 字段1 ASC" '對查詢結果進行升序排列
SQL = "select * from 表名 where 列名1='" & 字段 & "' ORDER BY 字段1 DESC" '對查詢結果進行降序排列
SQL = "select * from 表名 where 列名1='" & 字段 & "' ORDER BY 字段1 DESC, ORDER BY 字段2 DESC" '對查詢結果進行多維降序排列(速度奇慢,不推薦使用)
3、Recordset集合的常用屬性方法
==============================
rs.BOF '是否游標在最上邊
rs.EOF '是否游標在最下邊
rs.RecordCount '記錄集的行數(如果使用像前類型的游標,可能返回不準確)
rs.AddNew '新建一行記錄
rs.Update '保存當前行被修改的記錄
rs.Delete '刪除當前行
rs.Close '關閉記錄集
4、Fields集合的一些屬性的解釋
=============================
'以下為簡寫,正常情況需要rs.Fileds.。。。但是Fields屬于Recordset的一個默認集合,因此可以省略
rs() '括號內可以是列名也可以是列的序號例如:rs("姓名")、rs(3) 都是是可以的
rs(3).Name '返回列名
rs(3).Type '返回列的類型
rs(3).Value '返回當前行的值
rs.Fields.Count '返回列數
posted @
2008-11-26 07:30 大鳥 閱讀(309) |
評論 (0) |
編輯 收藏
VB應用程序的打包
使用VB開發軟件的最后一項工作就是打包應用程序生成安裝包,利用VB本身提供的打包程序可以實現打包,但是如果軟件中包含了其他非VB的文件,打包程序不能將這些文件也添加進來。根據個人的使用經驗,特總結了以下兩種打包的方法:
方法一、VB打包程序+Winrar
1、首先利用VB的“打包和展開向導”進行打包:
在VB的“外接程序”菜單里選擇“外接程序管理器”命令,在“外接程序管理器”對話框中選擇“打包和展開向導”:選中“加載行為”中的“加載/卸載”選項,點擊“確定”關閉“外接程序管理器”對話框。
再在VB的“外接程序”菜單里選擇“打包和展開向導”,在“向導”對話框中選擇“打包”功能:在接下來的對話框中選擇“編譯”功能,生成.exe文件;“選擇包類型”為“標準安裝包”;指定包的存儲位置;其他選項根據自己的需要進行設定即可。 打包結束,并閉VB。
2、利WinRar制作安裝包:
將生成的包文件夾和軟件中所需的所有文件放在一個文件夾中,并用Winrar對該文件夾進行壓縮:選擇建立“自解壓文件”;在高級選項里,設定解壓的目標文件夾(如C:)和解壓完成后自動執行包文件中的setup.exe文件;完成壓縮。
經過以上兩步生成的壓縮包,在解壓后會自動進行安裝,實現軟件的安裝。
方法二、VB打包程序+setup factory
1、首先利用VB的“打包和展開向導”進行打包,方法同上。
2、啟動setup factory將包文件中“Support”文件夾的文件全部添加進行,并添加軟件中所要包含的所有文件,按照向導的要求可以非常方便地完成安裝包的制作。
比較以上兩種方法,方法一在沒有專門的安裝包制作軟件的情況下也可以實現安裝包的制作,但是對不同操作系統的支持性較差,在Windows2000下可用,在WindowsXP下可能會出現“路徑錯誤”;方法二制作的安裝包卻更加專業,更加美觀,支持各種操作系統,而且簡單易用。
此外,在應用程序當中在訪問文件時要使用相對路徑,否則可能會導致文件訪問錯誤。
posted @
2008-11-26 07:26 大鳥 閱讀(8593) |
評論 (1) |
編輯 收藏
使用ADO控件可以方便的在VB6中訪問ODBC數據庫,但是通過直接放置ADODS控件來獲得ADO的數據連接比較麻煩,我們可以在VB工程中創建一個公共數據模塊,將ADO控件的初始化、建立連接、關閉連接等操作都寫到函數中,這樣就可以在工程的其他模塊中共享調用這個ADO連接。
一次完整的ADO調用操作分為如下幾個步驟:
1.打開ADO到數據庫的連接,初始化ADO RECORDSET集。
2.通過寫入SQL語句執行查詢并返回查詢結果RECORDSET集;或者可以通過寫入SQL語句執行相應數據庫操作。
3.釋放RECORDSET集,關閉數據庫連接。
需要注意的是,每個動態創建的ADO同時只能被一個過程調用,如果需要進行多表并行操作,可能需要在公共數據模塊中建立多個動態ADO。
下面是相關的代碼:
'-----------------------------------------------------------------
'如下代碼保存在名為my.bas的工程模塊中
Public CONN As Adodb.Connection '定義ADO CONNECTION對象
Public RS As Adodb.Recordset '定義ADO RECORDSET對象
'****************************
'打開數據庫連接
'****************************
Function ConnOpen()
Dim ASTR As String
Set CONN = New Adodb.Connection
ASTR = GetDatabasePath 'MDB文件數據庫路徑
CONN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ASTR & ";Persist Security Info=False"
'本例的ODBC連接為JET4.0的直接到MDB文件的連接,如果使用ODBC數據源可以使用如下CONNECTION串:
'Provider=MSDASQL.1;Password="";Persist Security Info=True;Data Source=數據源名稱;Initial Catalog=數據表庫名稱
CONN.Open
Set RS = New Adodb.Recordset
With RS Do
ActiveConnection = CONN
CursorType = adOpenDynamic
LockType = adLockOptimistic
End With
End Function
'****************************
'關閉數據庫
'****************************
Function ConnClose()
Set RS = Nothing
CONN.Close
Set CONN = Nothing
End Function
'**********************************************************
' 獲得數據庫路徑
' 本例數據庫保存在程序目錄下的DBS子目錄中,名為db1.mdb
'**********************************************************
Public Function GetDatabasePath() As String
Dim sPath As String
If Right$(App.Path, 1) = "\" Then
sPath = App.Path + "dbs\"
Else
sPath = App.Path + "\dbs\"
End If
GetDatabasePath = sPath + "db1.mdb"
End Function
'End of my.bas
'-----------------------------------------------------------------
如下示例代碼為my.bas的使用方法:
'-----------------------------------------------------------------
'使用RS對象執行SELECT語句
'TableName和FieldName分別為表名和字段名
'查詢結果保存在數組s中
Private Sub RunSelectCommand()
Dim s(99) as String
Dim i as Integer
i=0
Call my.ConnOpen
my.RS.Open "SELECT * FROM TableName"
While Not RS.EOF
i=i+1
If Not isNull(my.RS!FieldName) Then s(i)=Cstr(my.RS!FieldName)
RS.MoveNext
Wend
Call my.ConnClose
End Sub
'使用CONN對象執行UPDATE/DELETE/INSERT語句
'SQL語句放在變量sSQL中
Private Sub RunSqlCommand()
Dim sSQL as String
Call my.ConnOpen
my.CONN.Execute sSQL
Call my.ConnClose
End sub
'對于DATAGRID和DATAREPORT這些需要DATASOURCE的控件可以做如下操作
'使用SELECT語句打開RS的數據集
Set OBJ.Datasource=my.RS
'---------------------------------------------------------------------
這個方法對于開發簡單小型的MIS系統很實用,也可以在報表和數據表中使用,缺點是在多表操作和函數嵌套調用時,一個動態ADO對象不能同時執行兩個工作,后一個寫入的SQL語句會覆蓋先寫入的SQL語句,當在回到前一個過程時,會因為字段找不到而出錯。因此如果可能需要進行多表操作,可以嘗試多定義幾個CONN 和RS對象。
posted @
2008-11-26 07:24 大鳥 閱讀(362) |
評論 (0) |
編輯 收藏
>> 將文本賦值給MsFlexGrid的單元格
MsFlexGrid.TextMatrix(3,1)=”Hello”
>> 在MsFlexGrid控件單元格中插入背景圖形
Set MsFlexGrid.CellPicture=LoadPicture(“C:\temp\1.bmp”)
>>選中某個單元
MsFlexGrid.Row=1
MsFlexGrid.Col=1
>>用粗體格式化當前選中單元
MsFlexGrid.CellFontBold=True
>> 添加新的一行
使用AddItem方法,用Tab字符分開不同單元格的內容
dim row as string
row=”AAA”&vbtab&”bbb”
MsFlexFrid1.addItem row
>>怎樣來實現MSFlexGrid控件單數行背景為白色,雙數的行背景為藍色?
Dim i As Integer
With MSFlexGrid1
.AllowBigSelection = True ’ 設置網格樣式
.FillStyle = flexFillRepeat
For i = 0 To .Rows - 1
.Row = i: .Col = .FixedCols
.ColSel = .Cols() - .FixedCols - 1
If i Mod 2 = 0 Then
.CellBackColor = &HC0C0C0 ’ 淺灰
Else
.CellBackColor = vbBlue ’ 蘭色
End If
Next i
End With
>> MSFlexGrid控件如何移到最后一行
MSFlexGrid1.TopRow = MSFlexGrid1.Rows – 1
>>如何判斷msflexgrid有無滾動條
Declare Function GetScrollRange Lib "user32" (ByVal hWnd As Long, ByVal nBar As Long, lpMinPos As Long, lpMaxPos As Long) As Long
Public Const SB_HORZ = &H0
Public Const SB_VERT = &H1
Public Function VsScroll(MshGrid As MSHFlexGrid) As Boolean ’判斷水平滾動條的可見性
Dim i As Long
VsScroll = False
i = GetScrollRange(MshGrid.hWnd, SB_HORZ, lpMinPos, lpMaxPos)
If lpMaxPos <> lpMinPos Then VsScroll = True
End Function
Public Function HeScroll(MshGrid As MSHFlexGrid) As Boolean ’判斷垂直滾動條的可見性
Dim i As Long
HeScroll = False
i = GetScrollRange(MshGrid.hWnd, SB_VERT, lpMinPos, lpMaxPos)
If lpMaxPos <> lpMinPos Then HeScroll = True
End Function
>>程序運行時,想動態增加MSFlexgrid的列數
在第2列后插入一列:
Private Sub Form_Load()
Me.MSHFlexGrid1.Cols = 5
MSHFlexGrid1.Rows = 2
For i = 0 To Me.MSHFlexGrid1.Cols - 1
Me.MSHFlexGrid1.TextMatrix(0, i) = i
Me.MSHFlexGrid1.TextMatrix(1, i) = i
Next
End Sub
Private Sub Command1_Click()
Me.MSHFlexGrid1.Cols = Me.MSHFlexGrid1.Cols + 1
Me.MSHFlexGrid1.ColPosition(5) = 3
End Sub
>> MSFlexGrid中的對齊功能的使用
設置MSFlexGrid1.ColAlignment(index)=n
>>得到MSFlexGrid控件中當前選中的一行
msflexgrid1.rowsel就是當前選中行
>> 如何通過代碼調節列寬度
msflexgrid1.colwidth(i)=4000
增加 MsFlexGrid 的編輯功能
概述
MsFlexGrid 控件沒有提供文本編輯的功能,下面的例子演示了如何利用一個TextBox 實現編輯當前網格的功能。
在按下一個鍵后, 就把TextBox 移動到當前的位置, 并激活。 在鍵入回車或移動到其他網格時, 就把TextBox 中的內容放到網格中。
實現步驟
1 打開 VB5, 開啟一個新的工程。
2 在菜單“工程” 中選擇 “部件”, 在列表中選中 “Microsoft FlexGrid Control ..”
3 放一個 MsFlexGrid 控件和一個TextBox 控件(Text1)到 Form1。 修改MsFlexGrid 控件的名稱為 Grid1, 設置Grid1 的行,列 為 4, 固定行,列為 0。 設置 Text1 的 Visiable 為 False, BorderStyle 為 None(0)。
4 在Form1 的代碼中增加聲明:
Const ASC_ENTER = 13 '回車
Dim gRow As Integer
Dim gCol As Integer
5 增加代碼到 Grid_KeyPress 過程:
Private Sub Grid1_KeyPress(KeyAscii As Integer)
' Move the text box to the current grid cell:
Text1.Top = Grid1.CellTop + Grid1.Top
Text1.Left = Grid1.CellLeft + Grid1.Left
' Save the position of the grids Row and Col for later:
gRow = Grid1.Row
gCol = Grid1.Col
' Make text box same size as current grid cell:
Text1.Width = Grid1.CellWidth - 2 * Screen.TwipsPerPixelX
Text1.Height = Grid1.CellHeight - 2 * Screen.TwipsPerPixelY
' Transfer the grid cell text:
Text1.Text = Grid1.Text
' Show the text box:
Text1.Visible = True
Text1.ZOrder 0 ' 把 Text1 放到最前面!
Text1.SetFocus
' Redirect this KeyPress event to the text box:
If KeyAscii <> ASC_ENTER Then
SendKeys Chr$(KeyAscii)
End If
End Sub
6 增加代碼到 Text1_KeyPress 過程:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = ASC_ENTER Then
Grid1.SetFocus ' Set focus back to grid, see Text_LostFocus.
KeyAscii = 0 ' Ignore this KeyPress.
End If
End Sub
7 增加代碼到 Text1_LostFocus 過程:
Private Sub Text1_LostFocus()
Dim tmpRow As Integer
Dim tmpCol As Integer
' Save current settings of Grid Row and col. This is needed only if
' the focus is set somewhere else in the Grid.
tmpRow = Grid1.Row
tmpCol = Grid1.Col
' Set Row and Col back to what they were before Text1_LostFocus:
Grid1.Row = gRow
Grid1.Col = gCol
Grid1.Text = Text1.Text ' Transfer text back to grid.
Text1.SelStart = 0 ' Return caret to beginning.
Text1.Visible = False ' Disable text box.
' Return row and Col contents:
Grid1.Row = tmpRow
Grid1.Col = tmpCol
End Sub
posted @
2008-11-26 07:23 大鳥 閱讀(2159) |
評論 (1) |
編輯 收藏
VB利用ADO控件連接access數據庫
今天告訴大家VB利用ADO控件連接access數據庫的兩種方法:
一種是在 adodc1的屬性里設置數據庫文件的路徑,這種方法的優點是簡單易操作,缺點是,當源文件換了地方后,要重新設置數據庫的路徑,否則連接不上數據庫了。
一種是用代碼設置數據庫的路徑,這種方法的優點就是只要源文件和數據庫在同一文件夾下,無論移動到哪里都能連接上。
如果沒有建立好數據庫的話,先建立一個數據庫,然后建立一個表比如我們建的表名為message,然后把里面的字段名稱和數據類型都按自己的需要設置好.然后保存就可以了.
打開Microsoft Visual Basic6.0 我用的是VB6.0,在需要調用數據庫的窗體上加入一個adodc控件,默認名稱為:Adodc1。默認的情況下工具欄里是沒有這個控件的,可以打開工程---部件(快捷鍵CTRL+T),去掉只顯示選定項的勾,然后勾上Microsoft ADO Data Control(OLEDB),然后確定,工具欄就會多了一個adodc的控件。
第一種方法:設置adodc1的屬以連接數據庫.在adodc1控件上右鍵--Adodc屬性--使用連接字符串--生成--Microsoft Jet 4.0 OLE DB Provider--下一步--選擇或輸入數據庫名稱---找到要連接的數據庫后,確定.然后記錄源設置屬性. 如果要把內容提交到數據庫一般使用adCmdTable. 表選擇要連接的表。
設置完畢后就可以了.
如果我們想把內容提交到數據庫.舉個例子..
在窗體建立一個文本框,設置屬性中的DataSource為adodc1 DataField為要連接的數據庫的字段名。如果數據庫中有字段,會讓你選擇。
設置好后在窗體加一個添加記錄和一個提交的按鈕,設置代碼:
Private Sub Command1_Click()
Adodc1.Recordset.Update '保存
Adodc1.Refresh '刷新
End Sub
添加按鈕代碼:
Private Sub Command2_Click()
Adodc1.Recordset.AddNew '添加新紀錄
Adodc1.Recordset("姓名").Value = Text1.Text
End Sub
第二種方法:
在窗體添加Adodc控件一個text控件 一個添加記錄按鈕一個提交按鈕
在窗體設置代碼:
Private Sub Form_Load()
Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\db1.mdb;Persist Security Info=False" '設置數據庫路徑
Adodc1.CommandType = adCmdText '設置記錄源
Adodc1.RecordSource = "select * from message" '連接數據庫的message表文件
Set Text1.DataSource = Adodc1
text1.DataField = "姓名"
End Sub
添加記錄按鈕代碼:
Private Sub Command1_Click()
Adodc1.Recordset.AddNew '添加新紀錄
End Sub
提交代碼:
Private Sub Command2_Click()
Adodc1.Recordset.Update '保存
Adodc1.Refresh '刷新
End Sub
好了連接方法講完了,我都在機子上測試過了,因該沒有什么問題的。如果有問題請多看幾遍,或看些別人寫的程序代碼,會有很大進步的,我的VB也不好,因為不是計算機專業的,老師也沒有教很多,高手莫笑。好了我再給大家幾個查詢數據庫常用的代碼:
首記錄按鈕的代碼:
Private Sub sjl_Click()
Adodc1.Recordset.MoveFirst
End Sub
上一條記錄按鈕代碼:
Private Sub up_Click()
Adodc1.Recordset.MovePrevious
If Adodc1.Recordset.BOF Then
Adodc1.Recordset.MoveFirst
End If
End Sub
下一條記錄代碼:
Private Sub down_Click()
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF Then
Adodc1.Recordset.MoveLast
End If
End Sub
末記錄代碼:
Private Sub mjl_Click()
Adodc1.Recordset.MoveLast
End Sub
刪除記錄代碼:
Private Sub Command3_Click()
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveNext
If (Adodc1.Recordset.BOF Or Adodc1.Recordset.EOF) Then
MsgBox "已經無記錄", , "提示"
End If
End Sub
如果有什么不對的地方,請大家指正。
posted @
2008-11-26 07:19 大鳥 閱讀(2347) |
評論 (0) |
編輯 收藏
DataGrid 控件是一種類似于電子數據表的綁定控件,可以顯示一系列行和列來表示 Recordset 對象的記錄和字段。可以使用 DataGrid 來創建一個允許最終用戶閱讀和寫入到絕大多數數據庫的應用程序。DataGrid 控件可以在設計時快速進行配置,只需少量代碼或無需代碼。當在設計時設置了DataGrid 控件的 DataSource 屬性后,就會用數據源的記錄集來自動填充該控件,以及自動設置該控件的列標頭。然后您就可以編輯該網格的列;刪除、重新安排、添加列標頭、或者調整任意一列的寬度。
在運行時,可以在程序中切換 DataSource 來察看不同的表,或者可以修改當前數據庫的查詢,以返回一個不同的記錄集合。
注意 DataGrid 控件與 Visual Basic 5.0中的 DBGrid 是代碼兼容的,除了一個例外:DataGrid 控件不支持 DBGrid 的“解除綁定模式”概念。DBGrid 控件包括在 Visual Basic 的 Tools 目錄中。
可能的用法
查看和編輯在遠程或本地數據庫中的數據。
與另一個數據綁定的控件(諸如 DataList 控件)聯合使用,使用 DataGrid控件來顯示一個表的記錄,這個表通過一個公共字段鏈接到由第二個數據綁定控件所顯示的表。
使用 DataGrid 控件的設計時特性
可以不編寫任何代碼,只通過使用 DataGrid 控件的設計時特性來創建一個數據庫應用程序。下面的說明概要地說明了在實現 DataGrid 控件的典型應用時的一般步驟。完整的循序漸進的指示,請參閱主題“DataGrid 方案1: 使用 DataGrid 控件創建一個簡單數據庫應用程序”。
要在設計時實現一個 DataGrid 控件
1. 為要訪問的數據庫創建一個 Microsoft 數據鏈接 (.MDL) 文件。請參閱“創建 Northwind OLE DB 數據鏈接”主題,以獲得一個示例。
2. 在窗體上放置一個 ADO Data 控件,并將其 ConnectionString 屬性設置為在第 1 步中所創建的OLE DB 數據源。
3. 在這個 Ado Data 控件的 RecordSource 屬性中輸入一條將返回一個記
錄集的 SQL 語句。例如,Select * From MyTableName Where CustID = 12
4. 在窗體上放置一個 DataGrid 控件,并將其 DataSource 屬性設置為這個 ADO Data 控件。
5. 右鍵單擊該 DataGrid 控件,然后單擊“檢索字段”。
6. 右鍵單擊該 DataGrid 控件,然后單擊“編輯”。
7. 重新設置該網格的大小、刪除或添加網格的列。
8. 右鍵單擊該 DataGrid 控件,然后單擊“屬性”。
9. 使用“屬性頁”對話框來設置該控件的適當的屬性,將該網格配置為所需的外觀和行為。
在運行時更改顯示的數據
在創建了一個使用設計時特性的網格后,也可以在運行時動態地更改該網格的數據源。下面介紹實現這一功能的通常方法。
更改 DataSource 的RecordSource
更改所顯示的數據的最通常方法是改變該 DataSource 的查詢。例如,如果DataGrid 控件使用一個ADO Data控件作為其 DataSource,則重寫RecordSource和刷新該ADO Data 控件都將改變所顯示的數據。
' ADO Data 控件連接的是 Northwind 數據庫的' Products 表。新查詢查找所有
' SupplierID = 12 的記錄。
Dim strQuery As String
strQuery = "SELECT * FROM Suppliers WHERE SupplierID = 12"
Adodc1.RecordSource = strQuery
Adodc1.Refresh
更改 DataSource
在運行時,可以將 DataSource 屬性重新設置為一個不同的數據源。例如,您可能具有若干個 ADO Data 控件,每個控件連接不同的數據庫,或設置為不同的 RecordSource 屬性??梢院唵蔚貙?DataSource 從一個 ADO Data控件重新設置為另一個 ADO Data 控件:
' 將 DataSource 重新設置為一個連接到 Pubs 數據庫的、
' 使用 Authors 表的 ADO Data 控件。
Set DataGrid1.DataSource = adoPubsAuthors
重新綁定 DataSource
當將 DataGrid 控件用于一個遠程數據庫,諸如 SQLServer 時,可以改變表的結構。例如,可以給這個表添加一個字段。在這種情形下,可以調用Rebind 方法根據新的結構來重新創建該網格。注意,如果已經在設計時改變了這個列的布局,DataGrid 控件將會試圖重新創建當前的布局,包括任何空的列。不過,通過首先調用 ClearFields 方法,可以強制該網格重新設置所有的列。
從 DataGrid 返回值
在 DataGrid 被連接到一個數據庫后,可能想要監視用戶單擊了哪一個單元??梢允褂?RowColChange 事件——而不是 Click 事件。如下所示:
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
' 顯示用戶所單擊的單元的文字、行和列的信息。
Debug.Print DataGrid1.Text; DataGrid1.Row; DataGrid1.Col
End Sub
使用 CellText 和 CellValue 方法
當一個列使用 NumberFormat 屬性設置格式后,CellText 和 CellValue 屬性是很有用的。NumberFormat 屬性不必更改實際的數據格式就可以更改任何包含數字的列的格式。例如,給定一個網格,其中包含一個名為 ProductID的、包含整數的列。下面的代碼將使 DataGrid 以"P-0000" 的格式來顯示數據。換句話說,盡管在 ProductID 字段中所包含的實際數值為 "3",但該網格所顯示的值將是 "P-0003"。
Private Sub Form_Load()
DataGrid1.Columns("ProductID").NumberFormat = "P-0000"
End Sub
要返回數據庫中所包含的實際值,應使用 CellValue 方法,如下所示:
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
Debug.Print _
DataGrid1.Columns("ProductID").CellValue(DataGrid1.Bookmark)
End Sub
注意 上面所用的 CellValue 和下面所用的 CellText 值,都需要將Bookmark 屬性作為一個參數,功能才正確。
相反地,如果要返回該字段的格式化的值,應使用 CellText 方法:
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
Debug.Print _
DataGrid1.Columns("ProductID").CellText(DataGrid1.Bookmark)
End Sub
注意 上面的 CellText 方法等價于使用 DataGrid 控件的 Text 屬性。
下一步
要閱讀關于使用該控件創建簡單的應用程序的一個循序漸進的過程,請參閱“使用 DataGrid 控件創建簡單的數據庫應用程序”,或“創建一個連接DataList 控件的 DataGrid”。
要了解關于 Split 對象以及如何對其編程的詳細信息,請參閱“操作DataGrid 視圖”。
創建 Northwind 的OLE DB 數據鏈接
訪問數據的一個重要步驟是為想要訪問的每個數據庫都創建一個 OLE DB數據源。下面的步驟為 Visual Basic 所提供的Nwind.mdb (Northwind) 數據庫創建這樣一個對象。這個數據源被用于 Visual Basic 文檔所提供的一些示例過程。在一個計算機上只需要創建一次OLE DB數據源。
要創建 Northwind 的OLE DB 數據源
1. 打開 Windows Explorer或 Windows NT Explorer。
2. 打開您想要創建 OLE DB 數據源的目錄。在該示例中,打開 ProgramFiles、Microsoft Visual Studio和VB98。
3. 右鍵單擊 Explorer 的右邊窗格,然后單擊上下文菜單上的“新建”。從文件類型列表中單擊“Microsoft 數據鏈接”。
4. 重命名新文件 Northwind.MDL。
5. 右鍵單擊文件并單擊上下文菜單上的“屬性”,以顯示“Northwind.MDLProperties”對話框。
6. 單擊“連接”選項卡。
7. 單擊“提供方”框并選擇“Microsoft Jet 3.51 OLE DB Provider”。
8. 在Data Source 框中輸入nwind.mdb文件的路徑。
9. 單擊“測試連接”,檢測連接。
10. 如果連接通過,單擊“確定”。
注意 也可以通過在“控制面板”中單擊“數據鏈接”圖標創建一個 OLE DB數據源。在“管理數據鏈接文件”對話框中,單擊“新建”創建一個新的數據源。
使用 DataGrid 和 ADO Data控件創建一個簡單的數據庫應用程序
只使用一個 DataGrid 和一個 ADO Data 控件,可以創建一個允許最終用戶閱讀和寫入記錄集的數據庫應用程序。
要使用 ADO 數據控件來創建一個簡單的數據庫應用程序
1. 為 Northwind 數據庫創建一個OLE DB 數據源。如果還沒有創建數據源,請按照“創建 Northwind 的OLE DB Data Link”中的步驟操作。
2. 在Visual Basic 中創建一個新的標準的 EXE 工程。如果 DataGrid 控件不在“工具箱”中,則用右鍵單擊“工具箱”,然后使用“部件”對話框來添加控件。同時也載入 ADO 控件。
3. 在空窗體上各放置控件的一個實例。
4. 將 ADO 控件的ConnectionString 屬性設置為 Northwind 的數據源。單擊并選定該 ADO Data 控件,并按 F4 鍵出現“屬性”窗口。單擊“ConnectionString”,然后單擊 OLE DB File。單擊 Northwind 的數據源。
5. 設置 ADO 控件的 RecordSource 屬性。在“屬性”窗口中,單擊“記錄源”并輸入一條 SQL 語句來填充 DataGrid
控件。在本例中,輸入“Select * From Products”。
6. 將 DataGrid 控件的 DataSource 屬性設置為這個 ADO Data 控件。單擊并選定該 DataGrid 控件。在其“屬性”窗口中,單擊“數據源”將出現一個包含所有數據控件的下拉列表——在本例中只有 ADO Data 控件。單擊這個控件。
7. 按 F5 鍵運行這個工程。
創建一個連接 DataList 控件的 DataGridData
Grid 的通常用法是顯示數據庫的一個表所提供的“詳細內容”。例如,Northwind (Nwind.mdb) 數據庫包括兩個表,一個名為 "Suppliers",另一個名為 "Products"。在本例中,我們使用 DataList 控件來顯示 "Suppliers" 表中的供應商的公司名稱。當用戶單擊任意一個公司名稱時,這個 DataList 控件將提供該公司的 SupplierID。使用這個標識符,就可以構造一個查詢,在 "Products" 表中檢索具有相匹配的 SupplierID 的所有記錄。換句話說,當用戶單擊一個公司時(在 DataList 控件中),該公司生產的所有產品將出現在 DataGrid 控件中。
要使用一個指定供應商的產品填充一個 DataGrid 控件
1. 確認在機器上已為 Northwind 數據庫建立了一個OLE DB 數據源;如果還沒有創建這樣的一個數據源,請按照“創建 Northwind 的OLE DBData連接”的步驟操作。
2. 在Visual Basic 中創建一個新的標準的 EXE 工程。
如果 DataGrid、DataList 和 ADO Data 控件不在“工具箱”中,則右鍵單擊“工具箱”,然后單擊“部件”。在“部件”對話框中雙擊“MicrosoftDataGrid Control”、“Microsoft DataList Controls”以及“Microsoft ADOControl”。
3. 在一個空窗體中各放置一個 DataGrid 和 DataList 控件的實例。將 DataList 控件放置在該窗體的左上角,然后將 DataGrid 控件放在它的下面的某處。
4. 在窗體放置兩個 ADO Data 控件實例。選擇第一個 ADO Data 控件,并按 F4 鍵來顯示其“屬性頁”。將該控件的 Name 屬性設置為 adoSuppliers。選擇第二個 ADO Data 控件并將其 Name 屬性設置為 adoProducts。將第一個控件直接放在 DataList 控件的下面,把第二個控件直接放在 DataGrid 控件的下面。
5. 將這兩個 ADO Data 控件的 ConnectionString 屬性設置為 Northwind的OLE DB 數據源。選擇名為 adoSuppliers 的控件,然后將其ConnectionString 屬性設置為Northwind 的OLE DB data source (Northwind.mdl)。選擇名為 adoProducts的控件,并重復該操作。
6. 設置這兩個 ADO Data 控件的 RecordSource 屬性。選擇 adoSuppliers 并在其“屬性頁”上單擊“RecordSoure”。輸入 Select* From Suppliers。這個查詢將指示該 ADO Data 控件返回 Suppliers 表中的所有記錄。選擇 adoProducts,單擊“RecordSoure”,并輸入 Select *From Products。這個查詢將返回在 Products 表中的所有記錄。
7. 將 DataList 控件的 RowSource 屬性設置為 adoSuppliers。
RowSource 屬性決定由哪一個數據源為 ListField 屬性供應數據。
8. 將 DataList 控件的 ListField 屬性設置為 CompanyName。
ListField 屬性被設置成名為 Suppliers 的表中的字段名稱。在運行時,DataList 控件顯示在這個屬性中所指定的字段的值。在本例中,該屬性將顯示在 Suppliers 表中找到的一個公司名稱。
9. 將 DataList 控件的 BoundColumn 屬性設置為 SupplierID。
BoundColumn 屬性被設為 Suppliers 表中的第二個字段。在本例中,這個屬性就被設為 SupplierID 字段。當單擊 DataList 控件時,BoundText屬性返回與在 DataList 控件中所顯示的公司相關聯的 SupplierID 字段的值。這個值將用于對 Products 表的查詢,該查詢為 DataGrid 控件提供數據。
10. 將 DataGrid 控件的 DataSource 屬性設置為 adoProducts。
DataSource 屬性為該控件指定數據源。在本例中,該屬性被設置為名為adoProducts 的 ADO Data 控件,這將返回 Products 表中的所有記錄。
11. 在窗體的代碼模塊中,添加下述內容:
Private Sub Datalist1_Click()
' 聲明一個用來包含新查詢的字符串變量。這個新的
' 查詢使用 DataList 控件的BoundText屬性
' 來提供一個 SupplierID 值。新查詢查找所有
' 具有相同的 SupplierID 的產品。這個查詢被
' 指定給名為 adoProducts 的 ADO Data 控件
' 的 RecordSource 屬性。在刷新控件后,DataGrid
' 將使用包含由同一個公司供應的所有產品的新
' 記錄集來更新。
Dim strQuery As String
strQuery = "Select * FROM Products WHERE SupplierID = " & _
Datalist1.BoundText
With adoProducts
.RecordSource = strQuery
.Refresh
End With
With DataGrid1
.ClearFields
.ReBind
End With
End Sub
12. 運行該工程。
單擊 DataList 控件中的任意公司名稱,將自動用該公司所供應的產品更新 DataGrid 控件。
使用列
通過更改 DataSource 屬性,可以動態地更改在 DataGrid 控件中顯示的數據。例如,可以顯示同一個數據庫的不同表。如果這樣做,則 DataGrid 控件將只根據默認的屬性顯示數據。
添加、刪除或隱藏列
通過使用 Columns 集合和 Column 對象的屬性和方法,可以在程序中添加、刪除或隱藏列。
添加和刪除一列
要在運行時添加一列,可以使用 Add 方法。如果首先聲明一個變量,并將新對象賦給該變量,就可以用簡明的代碼設置各種屬性。
Private Sub AddColumn()
' 在最右邊的位置添加一列。然后設置其 Visible、Width、
' Caption以及 Alignment 屬性。DataField 屬性則指定
' 該列將綁定到哪一個字段。
Dim c As Column
Set c = DataGrid1.Columns.Add(DataGrid1.Columns.Count)
With c
.Visible = True
.Width = 1000
.Caption = "我的新列"
.DataField = Adodc1.Recordset.Fields("ProductName").Name
.Alignment = dbgRight
End With
End Sub
可以使用方法來刪除任意一列。請確保使用 ColIndex 參數來指定要刪除的列。下面的代碼將刪除被單擊的列。
Private Sub DataGrid1_HeadClick(ByVal ColIndex As Integer)
DataGrid1.Columns.Remove ColIndex
End Sub
隱藏一列
通過將 Visible 屬性設置為 False,可以隱藏任意一列。當想要限制用戶可以查看或編輯的列時這一功能特別有用。下面的示例在 Columns 集合中循環,隱藏除少數列之外的所有列。
Private Sub HideColumns()
' 使用 DataField 屬性來判別正在測試的是哪一列。
' 只顯示三列:ProductName、UnitPrice以及
' UnitsInStock。
Dim c As Column
For Each c In DataGrid1.Columns
Select Case c.DataField
Case "ProductName"
c.Visible = True
Case "UnitPrice"
c.Visible = True
Case "UnitsInStock"
c.Visible = True
c.Caption = "In Stock" ' 更改這個列的標頭。
Case Else ' 隱藏其它所有的列。
c.Visible = False
End Select
Next c
End Sub
操作 DataGrid 視圖
一個“拆分”的網格使最終用戶對相同的數據可以擁有多個視圖。例如,假設有一個由十個字段組成的大表。在這種情況下,在控件中察看的記錄集將有十列寬,除非窗體非常寬,否則用戶將無法同時看見所有列的內容。,而且,假設用戶只對第一列和最后一列感興趣(例如,第一列是名字,最后一列是電話號碼)。為了能同時看到在兩端的列(不重新安排列的順序),可以對網格進行拆分。
創建一個 Split 對象
在設計時,可以創建一個拆分,具體步驟是:右鍵單擊網格,單擊“編輯”,再單擊右鍵,然后單擊“拆分”。通過右鍵單擊該控件,并單擊“屬性”來顯示“屬性頁”對話框,可以編輯這個拆分??梢允褂?#8220;拆分”選項卡來自定義拆分。要刪除一個拆分,右鍵單擊該拆分,并單擊“刪除”。
在運行時,最終用戶也可以通過單擊位于這個網格控件的左下邊的右邊的選項卡,以手工方式來拆分該網格(除非不允許這個操作),如下圖所示:
默認情況下,DataGrid 控件包含一個 Split 對象。防止最終用戶添加拆分的代碼為:
DataGrid1.Splits(0).AllowSizing = False
在程序中添加和刪除拆分
DataGrid 控件包含一個 Split 對象的集合。要在程序中添加拆分,可以使用 Add 方法,如下所示:
DataGrid1.Splits.Add 1
注意 Add 方法需要新的拆分索引作為其參數。要添加一個拆分,應將這個索引參數設置為 Splits 集合的 Count 屬性值。
使用 Split 集合的 Add 方法,可以在程序中按照實際需要添加拆分。由于添加多于兩個以上的拆分將使網格很難使用,可以使用該集合的 Count 屬性來限制拆分的數目。
If DataGrid1.Splits.Count < 3 Then ' 添加一個拆分。
DataGrid1.Splits.Add DataGrid1.Splits.Count
End If
使拆分同步
當拆分多于一個時,可能希望控制這些拆分如何滾動。例如,在一個具有三個拆分的網格中,可以決定只讓第一個和第三個拆分同步,而讓中間的拆分獨立地滾動。要同步任何兩個(或多個)拆分,只需將每個 Split 對象的 ScrollGroup 屬性設置為同一個值。
' 使第一個和第三個 Split 對象同步。
With DataGrid1
.Splits(0)
.ScrollGroup = 1
.Splits(1).ScrollGroup = 2
.Splits(2).ScrollGroup = 1
End With
通過設置 Scrollbars 屬性,使同步的拆分組只顯示一個滾卷條,從而進一步自定義拆分的外觀。
控制 Tab 鍵和箭頭鍵的行為
使用 WrapCellPointer、TabAcrossSplits以及 TabAction 屬性,可以決定當最終用戶按下 tab 鍵或箭頭鍵時網格的行為。
在這三個屬性中,TabAction 屬性級別最高,它決定 WrapCellPointer 和TabAcrossSplits 這兩個屬性是否能生效。TabAction 有三個設置值: ControlNavigation、Column Navigation 和 Grid Navigation。當該屬性設置為 ControlNavigation 時,按 Tab 鍵根據 TabIndex 將焦點切換到下一個控件。這一設置優先于 WrapCellPointer 和 TabAcrossSplits。
WrapCellPointer 屬性決定在任何單個的拆分中 tab 鍵和箭頭鍵的行為。如果該屬性設置為 True,且當前單元位于最后一列,這時最終用戶按 tab 鍵則使第一列的下一行變成當前的單元。不過,如果當前單元位于最后一行的最后一列時,這時就沒有地方可以“換行”。
TabAcrossSplits 屬性決定當網格中存在兩個或多個拆分時 tab 和箭頭鍵的行為。如果該屬性設置為 True,且當前單元位于任何一個拆分的最后一列,則按Tab或箭頭鍵將使當前單元“跳” 到下一個拆分的第一列。當前單元仍保持相同的行位置。
注意 如果 WrapCellPointer 和 TabAcrossSplits 屬性都設置為 True,則只有當前單元位于最后一個拆分的最后一列時才會換行。這時當前單元將換到第一個拆分的第一列中的下一行。
自定義列集合
每一個 Split 對象都有一個 Columns 屬性,允許用戶來操作一個 Column對象的集合。通過這樣做,可以更改每個 Split 對象的外觀。例如,可以用一個拆分包含顯示姓氏字段和名字字段的兩個列,而第二個拆分則顯示電話字段和地址字段。要實現這一目標,需要將其它的每一列的 Visible 屬性設置為 False,如下所示:
' 枚舉 Columns 集合,對每一個 Column 對象的 DataField 屬性
' 進行測試。如果測試失敗,則隱藏這一列。
Dim i As Integer
' 隱藏除 ProductName 列之外的所有列。
For i = 0 To DataGrid1.Splits(0).Columns.Count - 1
If DataGrid1.Splits(0).Columns(i).DataField <> "ProductName" Then
DataGrid1.Splits(0).Columns(i).Visible = False
End If
Next i
' 隱藏除 UnitPrice 列之外的所有列。
For i = 0 To DataGrid1.Splits(0).Columns.Count - 1
If DataGrid1.Splits(1).Columns(i).DataField <> "UnitPrice" Then
DataGrid1.Splits(1).Columns(i).Visible = False
End If
Next I
使用 Bookmarks 和 SelBookmarks 跟蹤記錄
Bookmarks 和 SelBookmarks 提供了標記記錄的一種手段。當編寫應用程序中的特定功能(諸如允許最終用戶手工地選擇多個不相鄰的記錄,進行所選記錄的大批更新)時,這就很有必要。在這些情形中,需要標記哪些記錄已被選擇,因此可以使用 SelBookmarks 集合及其屬性。
有兩個函數,分別是 CellText 和 CellValue 方法,需要標記才能正確執行。
標記用戶的選擇
SelBookmarks 集合包含所有選定的記錄的書簽。當最終用戶手工選擇記錄時(即在單擊時按住 CTRL 鍵),每一個選定的記錄的書簽都會加入到該集合中。使用標準的循環,用戶可以知道已經選定了什么,也可以保存書簽(因為可能需要恢復某個值),以及執行操作:
Dim i as Integer ' 計數器
Dim intCount As Integer
intCount = DataGrid1.SelBookmarks.Count - 1
ReDim arrSelBK(intCount) ' 聲明用于保存書簽的數組。
For i = 0 To intCount
ArrSelBK(i) = DataGrid1.SelBookmarks(i)
' 在此處執行操作。如果該操作必須被
' 取消,則退出該循環,然后使用該數
' 組來取消這些更改。
Next i
通過在程序中添加到 SelBookmarks 集合來選擇記錄
通過將記錄添加到這個集合,也可以在程序中選定記錄。例如,可能有一個顯示指定的客戶所有訂貨的網格。如果要高亮顯示該客戶花費超過 $100的所有記錄,則對記錄進行過濾,并將結果書簽添加到 SelBookmarks 集合。
Dim rs As Recordset
Set rs = Adodc1.Recordset
While Not rs.EOF
If rs!SupplierID = 12 Then
DataGrid1.SelBookmarks.Add rs.Bookmark
End If
rs.MoveNext
Wend
顯示計算結果字段
假設在表中有一個名為 "Price" 的字段,并且想使用本地稅率來計算表中每一項的稅費。這就是一個計算結果字段,可以通過修改 DataSource 的查詢來計算這個值,并把這個值返回給 DataGrid 控件。
要在 DataGrid 控件中創建一個計算結果字段
1. 確認在機器上已為 Northwind 數據庫建立了一個OLE DB 數據源;如果還沒有創建這樣的一個數據源,請按照“創建 Northwind 的OLE DBData 連接”的步驟操作。
2. 在窗體上放置一個 ADO Data 控件和一個 DataGrid 控件。
3. 將 ADO Data 控件的ConnectionString 屬性設置為 Northwind 的數據源。
4. 設置 ADO Data 控件的 RecordSource 屬性。在“屬性”窗口中,單擊“記錄源”并輸入 Select ProductName, UnitPrice,(UnitPrice * .082) As Tax From Products。
5. 將 DataGrid 控件的 DataSource 屬性設置為這個 ADO Data 控件。
6. 運行該工程。
與類模塊一起使用 DataGrid 控件
如果想要訪問以自定義格式或以 ODBC 驅動程序不直接支持的格式存放的數據,可以創建一個類來封裝該數據。然后可以編寫該類的自定義函數來檢索這些數據。這樣該類就變成了一種數據源,可以被任何數據使用者(如DataGrid 控件)使用。
在這個類模塊的Initialize 事件中,首先通過聲明一個作為 New ADODB.Recordset的變量,來創建一個 ADODB recordset 對象。在創建了這個 recordset 對象后,再添加字段,每個數據源中的每個字段都要加入。然后使用合適的數據填充這個記錄集。
注意 也可以使用 OLEDB 示例提供者來創建一個數據源。關于 OLEDB示例提供者的詳細信息,請參閱“創建帶有數據提供方的部件”。
類模塊有一個 GetDataMember 事件,只要當數據使用者(諸如 DataGrid 控件)需要數據時就產生該事件。在這個事件中,Data 參數被設置為在Initialize 事件中所創建的 recordset 對象。
如果要使用這個類模塊,應創建一個具有一個 DataGrid 控件的窗體。在該窗體的 Load 事件的代碼中,將該控件的 DataSource 屬性設置為這個類。
注意 數據類模塊在設計時是不可用的。例如,如果使用 DataGrid 控件,則當用戶在“屬性”窗口中單擊“數據源”時,所有可用的數據源都會出現在一個下拉列表中。但其中不會有這個數據類模塊,它只能在代碼中設置。
使用類模塊創建一個數據源
下面的示例使用一個類模塊來創建一個簡單數據源。然后通過 DataSource屬性將 DataGrid 控件綁定到該模塊。
要創建一個用于DataGrid 的類
1. 創建一個新的標準 Exe 工程。
2. 給窗體添加一個 DataGrid 控件。如果DataGrid控件不在“工具箱”中,則在“工程”菜單中單擊“部件”,
再單擊“Microsoft DataGrid Control”,然后單擊“確定”。
3. 在“工程”菜單中,單擊“引用”。在“引用”對話框中,單擊“MicrosoftActiveX Data Objects 2.0 Library”。
4. 在“工程”菜單中,單擊“添加類模塊”來給工程添加一個數據類模塊。
5. 在“工程資源管理器”窗口中,單擊并選定“類”圖標,并按 F4 鍵顯示“屬性”窗口。
6. 在“屬性”窗口中,將類的名稱更改為NamesData。
7. 在“屬性”窗口中,單擊“DataSourceBehavior”并將該屬性更改為vbDataSource。
8. 在該類模塊的 Declarations 部分,創建一個 ADODB Recordset變量,如下所示:
Option Explicit
Private WithEvents rsNames As ADODB.RecordSet
使用 WithEvents 關鍵詞來聲明該變量,使用戶可以對 RecordSet 對象的事件編程。
9. 在該類的 Initialize 事件中,添加下述代碼:
Private Sub Class_Initialize()
' 將新的數據成員的名稱添加到 DataMember 集合
' 這使其它對象可以看見這些可用的
DataMembersDataMembers.Add "Names"
Set rsNames = New ADODB.RecordSet ' 設置對象變量。
' 創建一個具有兩個字段的 recordset,并打開該 recordset。
' 第一個記錄具有一個整數的數據類型,第二個記錄是一個最大可
' 達 256 個字符的字符串。CursorType 被設置為 OpenStatic
' —— 一個可更新的對一組記錄的快照。LockType 被設置為
' LockOptimistic,以允許對該 recordset 進行更新。
With rsNames
.Fields.Append "ID", adInteger
.Fields.Append "Name", adBSTR, 255
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.Open
End With
Dim i As Integer
For i = 1 to 10 ' 添加十條記錄。
rsNames.AddNew
rsNames!ID = i
rsNames!Name = "Name " & i
rsNames.Update
Next i
rsNames.MoveFirst ' 移到該記錄集的開始。
End Sub
這部分代碼首先創建 recordset 對象,然后給該對象添加兩個字段。代碼接著給 recordset 添加十條記錄。
10. 在該類的 GetDataMember 事件中,添加下述代碼 :
Private Sub Class_GetDataMember(ByVal DataMember As String, _
Data As Object)
Set Data = rsNames
End Sub
只要發生該事件——即當該類對象被綁定到一個數據使用者,如 DataGrid控件時,代碼將返回該 recordset 對象。
11. 在 Form 對象的代碼模塊中,聲明一個數據類的對象變量:
Option Explicit
Private datNames As NamesData ' 類變量
12. 在 Form 對象的 Load 事件的代碼中,將 DataGrid 控件的 DataSource設置為該類對象。
Private Sub Form_Load()
' 創建一個新的 NamesData 對象
Set datNames = New NamesData
' 將這個 DataGrid 綁定到新的數據源 datNames
Set DataGrid1.DataSource = datNames
End Sub
13. 按 F5 鍵運行該工程。
RecordSet事件的編程
也可以對這個 Recordset 對象的事件進行編程。在該類模塊中,單擊“對象”框(在位于左上角),然后單擊“rsNames”。在“過程/事件”框(在右上角)中,下拉列表將顯示這個 Recordset 對象的所有事件。
給類添加一個屬性
類模塊也可以進行修改,來響應事件或函數調用。下面的代碼演示了如何先給類添加屬性。當從其它對象調用該對象時,這一屬性將返回該類的RecordCount。
Public Property Get RecordCount() As Long
RecordCount = rsNames.RecordCount
End Sub
使用 DataMember 屬性
GetDataMember 事件也包括 DataMember 參數。使用這個參數,可以在類模塊中包括多個記錄集,并使用帶 DataMember 參數的 Select Case 語句來返回相應的記錄集:
Private Sub Class_GetDataMember(ByVal DataMember As String, Data As _
Object)
Select Case DataMember
Case "Names"
Set Data = rsNames
Case "Dates"
Set Data = rsDates
Case Else
' 設置一個默認的數據成員
Set Data = rsYears
End Select
End Sub
如果要指定所需的 DataMember,請將數據使用者的 DataMember 屬性設置為適當的字符串,然后如平常一樣設置 DataSource。對于 DataGrid 控件,可以采用如下方法:
Private Sub Form_Load()
' 創建一個新的 NamesData 對象
Set datNames = New NamesData
' 指定所需的 DataMember,然后設置 DataSource。
DataGrid1.DataMember = "Names"
Set DataGrid1.DataSource = datNames
End Sub
posted @
2008-11-26 07:19 大鳥 閱讀(315) |
評論 (0) |
編輯 收藏
引言
作為微軟旗下一款優秀的RAD工具,VB在數據庫應用開發方面的能力十分強大。微軟設計了多種數據庫訪問方法,下面通過對VB訪問數據庫的多種技術進行深入剖析,并總結出實際開發中的幾點經驗。希望能夠對那VB的初學者有所幫助。(注意,文中所有的描述均在Windows 2000 professional和Visual Basic 6.0的環境下進行的)
一. DAO、RDO、ODBC和ADO
在VB的開發環境中,可以使用三種數據庫訪問方式,它們分別是:數據訪問對象(DAO)、遠程數據對象(RDO)和ADO對象模型。
DAO:
數據訪問對象是用來顯露了Microsoft Jet數據庫引擎(最早是給Microsoft Access 所使用,現在已經支持其它數據庫),并允許開發者通過ODBC直接連接到其他數據庫一樣,直接連接到 Access 表。DAO 最適用于單系統應用程序或在小范圍本地分布使用。其內部已經對Jet數據庫的訪問進行了加速優化,而且其使用起來也是很方便的。所以如果數據庫是Access數據庫且是本地使用的話,建議使用這種訪問方式。
VB已經把DAO模型封裝成了Data控件,分別設置相應的DatabaseName屬性和RecordSource屬性就可以將Data控件與數據庫中的記錄源連接起來了。以后就可以使用Data控件來對數據庫進行操作。
RDO
RDO(Remote Data Objects)遠程數據對象是一個到ODBC的、面向對象的數據訪問接口,它同易于使用的DAO style組合在一起,提供了一個接口,形式上展示出所有ODBC的底層功能和靈活性。盡管RDO在很好地訪問Jet或ISAM數據庫方面受到限制,而且它只能通過現存的ODBC驅動程序來訪問關系數據庫。但是,RDO已被證明是許多SQL Server、Oracle 以及其他大型關系數據庫開發者經常選用的最佳接口。RDO提供了用來訪問存儲過程和復雜結果集的更多和更復雜的對象、屬性,以及方法。
和DAO一樣,在VB中也把其封裝為RDO控件了,其使用方法與DAO控件的使用方法完全一樣。
ODBC
ODBC(Open Database Connectivity,開放數據庫互連)是微軟公司開放服務結構(WOSA,Windows Open Services Architecture)中有關數據庫的一個組成部分,它建立了一組規范,并提供了一組對數據庫訪問的標準API(應用程序編程接口)。這些API利用SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。
一個基于ODBC的應用程序對數據庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的數據庫操作由對應的DBMS的ODBC驅動程序完成。也就是說,不論是FoxPro、Access還是Oracle數據庫,均可用ODBC API進行訪問。由此可見,ODBC的最大優點是能以統一的方式處理所有的數據庫。
一個完整的ODBC由下列幾個部件組成:
1. 應用程序(Application)
ODBC管理器(Administrator)。該程序位于Windows 95控制面板(Control Panel)的32位ODBC內,其主要任務是管理安裝的ODBC驅動程序和管理數據源。
驅動程序管理器(Driver Manager)。驅動程序管理器包含在ODBC32.DLL中,對用戶是透明的。其任務是管理ODBC驅動程序,是ODBC中最重要的部件。
2. ODBC API
ODBC 驅動程序。是一些DLL,提供了ODBC和數據庫之間的接口。
數據源。數據源包含了數據庫位置和數據庫類型等信息,實際上是一種數據連接的抽象。
ODBC連接目前僅僅限于關系型數據庫,對于其他數據源比如EXCEL、文本文件都不能進行訪問,而且有很多DBMS(數據庫管理系統)都不能充分的支持其所有的功能。相比之下,OLEDB可以存取任何形式的數據,所以其功能是相當的強大,它也指導了目前技術發展的方向。
ADO
ADO(ActiveX Data Object)是DAO/RDO的后繼產物。ADO 2.0在功能上與RDO更相似,而且一般來說,在這兩種模型之間有一種相似的映射關系。ADO"擴展"了DAO和 RDO 所使用的對象模型,這意味著它包含較少的對象、更多的屬性、方法(和參數),以及事件。
作為最新的數據庫訪問模式,ADO的使用也是簡單易用,所以微軟已經明確表示今后把重點放在ADO上,對DAO/RDO不再作升級,所以ADO已經成為了當前數據庫開發的主流。
ADO涉及的數據存儲有DSN(數據源名稱)、ODBC(開放式數據連接)以及OLE DB三種方式。后面的例程將詳細講解這三種方式的具體訪問實現。
要使用ADO,必須清楚ADO的對象層次結構,其大體上分為以下7個對象層次:
1、 Command 對象:包含關于某個命令,例如查詢字符串、參數定義等的信息。Command 對象在功能上和 RDO的rdoQuery 對象相似。
2、 Connection 對象:包含關于某個數據提供程序的信息。Connection 對象在功能上和 RDO 的 rdoConnection 對象是相似的,并且包含了關于結構描述的信息。它還包含某些 RDOEnvironment 對象的功能,例如transaction 控件。
3、 Error對象:包含數據提供程序出錯時的擴展信息。Error 對象在功能上和 RDO 的rdoError 對象相似。
4、 Field 對象:包含記錄集中數據的某單個列的信息。Field 對象在功能上和 RDO的rdoColumn 對象相似。
5、 Parameter 對象:包含參數化的Command對象的某單個參數的信息。該 Command對象有一個包含其所有Parameter 對象的 Parameters 集合。Parameter 對象在功能上和 RDO 的 rdoParameter 對象相似。
6、 Property對象:包含某個 ADO 對象的提供程序定義的特征。沒有任何等同于該對象的RDO,但DAO有一個相似的對象。
7、Recordset對象:用來存儲數據操作返回的記錄集。此對象和Connection對象是所有對象最重要的兩個對象。
當然,對于初級用戶來說,我們只需要掌握其中的Connection對象和RecordSet對象就可以實現基本的數據庫操作,在后面的經驗介紹里面我將給出詳細的介紹。
二. 開發經驗小結:
前面總體上介紹了一下當前在VB平臺下的數據庫訪問技術,這些技術也是當前數據庫技術的主流。下面筆者結合近幾年的開發經驗,給出一些開發經驗和小技巧,以供參考:
經驗一:如果數據量不大,而且要求開發周期短的情況,建議使用DAO+Access雖然DAO功能并不強大,但是其對Jet引擎進行了加速優化處理,所以這種搭配應該是比較好的選擇。
經驗二:RDO當前已經用的很少了,一般用ADO來替代。
經驗三:(本經驗很重要)使用ADO開發時,連接數據庫的方式有三種(前面已經敘述了),其中DSN需要用戶首先使用要將所要操縱的數據庫設置為數據庫源并給其命名。方法是在控制面板->管理工具->數據源(ODBC)下面進行配置。比如設置的數據源名稱為data,那么可以通過下面幾行代碼來連接數據庫:
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
注釋:連接數據庫
conn.Open "dsn=data"
注釋:打開數據源(即選定操作的數據對象)
rs.Open SQL語句, conn
但是如果是使用ODBC和OLEDB的方式進行連接,那么大家一定知道在連接字符串上那一長串的代碼,不要說對于初學者,就是對于那些經驗豐富的程序員來說,也很難記住這一串代碼。那么如何可以記住這一串代碼呢?其實,方法很簡單,只要添加一個ADO Data控件,然后在其屬性框中使用向導進行設置后,那么最后向導就會自動生成一段ConnectionString,只需要將這一行代碼拷貝下來然后放到conn.open之后的連接字符串參數的位置上就可以了。這條經驗希望讀者能夠記住,實際開發中很實用。
經驗四:前面講到手動設置ODBC數據源,這里可以通過程序來進行動態設置。首先要清楚的是ODBC的詳細信息全部存放在注冊表的下述鍵值內:"HKEY_LOCAL_MACHINE\SOFTWARE\ODBC",通過調用Win32函數WriteProfileString來對相應的鍵值進行修改即可達到目的。
經驗五:通常將數據庫的連接代碼和資源釋放代碼放入各自特定的函數里面,因為一般大一點的程序里需要經常對這兩個功能模塊進行調用,這樣做就可以提高效率,當然很多時候都需要寫成連接池的形式。
經驗六:使用VB在SQL中處理含單引號的字符串時,對字符串數據都用單引號引起來,如:
Select * from MyTable Where ID=注釋:FirstID注釋:
若其中的FirstID為First注釋:ID,即中間多出一個單引號,則上述寫法將導致錯誤,解決的辦法是將字符串中的每一個單引號用兩雙引號替換,下面的函數StrToSQL完成該功能,并用單引號將處理后的字符串引起來:
Private Function StrToSQL(ByVal strValue As String) As String
StrToSQL = "注釋:" + Replace(strValue, "注釋:", "注釋:注釋:") + "注釋:"
End Function
在寫SQL時如有字符串數據,不管其中有沒有單引號,都可以這樣使用:
strValue="First注釋:Id"
strSQL="Select * from MyTable Where ID="+StrToSQL(strValue)
三. 實例解析
下面介紹一個實例,來消化以上的相關知識。這里我在一個程序界面下實現了DAO,ADO,ODBC,OLEDB四種數據庫訪問方式。
程序代碼分析:
注釋:整個程序功能是選擇不同的連接方式來進行顯示工作,三種方式顯示效果完全相同
注釋:下面是主程序過程
Private Sub Command1_Click()
Dim selitem As Integer
注釋:判斷連接數據庫的方式
If Option1.Value = True Then
selitem = 1
Else
If Option2.Value = True Then
selitem = 2
Else
selitem = 3
End If
End If
注釋:選取不同的數據庫連接方式
Select Case selitem
Case 1:
注釋:使用DAO的數據庫連接方式
Call ShowByDAO
Case 2:
注釋:使用ADO的數據庫連接方式
Call ShowByADO
Case 3:
注釋:使用ODBC的數據庫連接方式
Call ShowByODBC
Case 4:
注釋:使用OLEDB的數據庫連接方式
Call ShowByOLEDB
End Select
End Sub
Private Sub ShowByDAO()
注釋:使用DAO的數據庫連接方式
Dim db As Database
Dim rs As Recordset
Dim sqlstr$ 注釋:存放查詢語句
Set db = OpenDatabase(App.Path & "\db1.mdb")
sqlstr = "select * from 成績表"
Set rs = db.OpenRecordset(sqlstr)
注釋:顯示結果
Call GridShow(rs)
End Sub
Sub ShowByADO()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
注釋:使用數據源來連接數據庫
conn.Open "dsn=data"
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.Open "select * from 成績表", conn
Call GridShowOfADO(rs)
End Sub
Sub ShowByODBC()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
注釋:使用數據源來連接數據庫
conn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=data"
rs.Open "select * from 成績表", conn
注釋:顯示結果
Call GridShowOfADO(rs)
End Sub
Sub ShowByOLEDB()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
注釋:使用數據源來連接數據庫
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path & "\db1.mdb" + ";Persist Security Info=False"
rs.Open "select * from 成績表", conn
注釋:顯示結果
Call GridShowOfADO(rs)
End Sub
Sub GridShow(rs As Recordset)
注釋:對dao方式進行顯示工作
MSFlexGrid1.TextMatrix(0, 0) = "姓名"
MSFlexGrid1.TextMatrix(0, 1) = "性別"
MSFlexGrid1.TextMatrix(0, 2) = "語文"
MSFlexGrid1.TextMatrix(0, 3) = "數學"
MSFlexGrid1.TextMatrix(0, 4) = "英語"
rs.MoveLast
MSFlexGrid1.Rows = rs.RecordCount + 1
MSFlexGrid1.Cols = rs.Fields.Count
Dim i%
i = 1
rs.MoveFirst
While (Not rs.EOF)
MSFlexGrid1.TextMatrix(i, 0) = rs.Fields(0)
MSFlexGrid1.TextMatrix(i, 1) = rs.Fields(1)
MSFlexGrid1.TextMatrix(i, 2) = rs.Fields(2)
MSFlexGrid1.TextMatrix(i, 3) = rs.Fields(3)
MSFlexGrid1.TextMatrix(i, 4) = rs.Fields(4)
rs.MoveNext
i = i + 1
注釋:If (rs.EOF = True) Then
注釋: Exit For
Wend
End Sub
Sub GridShowOfADO(rs As ADODB.Recordset)
注釋:對ado方式進行顯示工作
MSFlexGrid1.TextMatrix(0, 0) = "姓名"
MSFlexGrid1.TextMatrix(0, 1) = "性別"
MSFlexGrid1.TextMatrix(0, 2) = "語文"
MSFlexGrid1.TextMatrix(0, 3) = "數學"
MSFlexGrid1.TextMatrix(0, 4) = "英語"
注釋:注意recordcount屬性必須在當前記錄指針在最后一條記錄時才會返回正確的值
rs.MoveLast
MSFlexGrid1.Rows = rs.RecordCount + 1
MSFlexGrid1.Cols = rs.Fields.Count
Dim i%
i = 1
rs.MoveFirst
While (Not rs.EOF)
MSFlexGrid1.TextMatrix(i, 0) = rs.Fields(0)
MSFlexGrid1.TextMatrix(i, 1) = rs.Fields(1)
MSFlexGrid1.TextMatrix(i, 2) = rs.Fields(2)
MSFlexGrid1.TextMatrix(i, 3) = rs.Fields(3)
MSFlexGrid1.TextMatrix(i, 4) = rs.Fields(4)
rs.MoveNext
i = i + 1
Wend
End Sub
Private Sub Command2_Click()
End
End Sub
上述代碼已經在Windows 2000 professional和Visual Basic 6.0的環境下調試成功。
四.小結
本文通過對數據庫訪問相關技術的分析與總結,提出若干有價值的經驗。借鑒這些經驗,會給開發帶來一定的便利。
posted @
2008-11-26 07:18 大鳥 閱讀(317) |
評論 (0) |
編輯 收藏
Dim dataname As String
Private Sub Command1_Click()
d.DialogTitle = "打開一個Access數據庫進行編輯"
d.FileName = ""
d.InitDir = App.Path
d.Filter = "Access數據庫文件MDB后綴|*.mdb"
d.ShowOpen
If d.FileName = "" Then Exit Sub
list1.Clear
Set link1 = New ADODB.Connection
'創建ADO連接
link1.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & d.FileName
Set tables = link1.OpenSchema(adSchemaColumns) '創建數據庫記錄集為了得到數據庫中所有表名
oldtablename = ""
Do While Not tables.EOF
If tables("table_name") <> oldtablename Then
oldtablename = tables("table_name"): list1.AddItem oldtablename
End If
tables.MoveNext
Loop
If list1.ListCount = 0 Then MsgBox "數據庫打開失敗,或數據庫不存在表", vbCritical, "錯誤": Exit Sub
dataname = d.FileName
list1.Enabled = True: Command2.Enabled = True
list1.ListIndex = 0: list1_click
End Sub
Private Sub Command2_Click()
ldc.Recordset.Update '更新ldc記錄集
End Sub
Private Sub Form_Resize()
edit.Width = Me.ScaleWidth - 200
edit.Height = Me.ScaleHeight - edit.Top - 50
End Sub
Private Sub list1_click()
'ldc控件連接數據源
ldc.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & dataname & ";Persist Security Info=False"
'ldc控件使用SQL命令,GET數據源數據
ldc.RecordSource = "select * from " & list1.Text
ldc.Refresh: Label1.Caption = "共" & ldc.Recordset.RecordCount & "條記錄," & ldc.Recordset.Fields.Count & "個分類字段"
End Sub
posted @
2008-11-26 07:16 大鳥 閱讀(392) |
評論 (0) |
編輯 收藏
只有注冊用戶登錄后才能閱讀該文。閱讀全文