[Android x86]安裝在SD卡上

心血來潮~想在我的NB試試Android~
不過因為原本的硬碟是空間小小的SSD~
我也不想把原本安裝在上面的Windows直接覆蓋掉~
所以就想著如果能直接把Android裝在SD卡或USB上~這樣似乎不錯~
如果能直接安裝在SD卡上更好,因為我的NB上有內建讀卡機~
這樣機器就不會凸出一個大大的USB隨身碟~
而實際上嘗試過後~雖然一開始不順利~但最後還真的可以達成~
以下是我的作法~

安裝環境

  • 最少要有個支援USB的電腦(我的有支援用讀卡機開機~所以也能支援使用SD卡)
  • 以下步驟是使用Windows7建立安裝用的USB與預訂安裝Android的SD卡
  • SD卡~建議準備一張2G以上速度快一點的~最少要有1G會比較實用
  • 一個500MB以上的隨身碟,要當作安裝來源開機USB

下載檔案與工具

安裝步驟

1.分割SD卡

基本上不分割也能執行~也可以在電腦上同時外接多個USB當作額外的儲存空間~
不過我比較希望我這張SD卡既能當主硬碟又能當額外的空間~
So~~~我打算把SD卡切成兩個區塊~一個當主硬碟一個當儲存空間
  • 開啟MiniTool Partition Wizard(操作方法可自行參考網路上的文章)
  • 選擇SD卡後,把所有的空間都刪除(當然如果你裡面有資料請先移到別的地方去…)
  • 我這邊希望的是資料空間也能被Windows讀取,所以第一個區塊是資料區塊。設成Primary,格式化為Fat32,空間大小隨便,但建議剩餘空間留個1G以上~最好有2G給第二個區塊
  • 第二個區塊式系統區塊,設成Primary,格式化為Ext3,空間大小為1G以上~最好有2G
  • 最後點Apply,開始進行分割與格式化

2.建立安裝用的USB

這一步是把下載下來的Android x86 ISO檔放到USB裡做為安裝來源的開機USB~
  • 開啟Unetbootin(操作方法可自行參考網路上的文章)
  • 選擇ISO檔與目標的USB,再來就開始建立

3.開機設定

再來就可以把USB與SD卡都插上,重新開機,然後進BIOS畫面
把第一個Boot的優先權設為USB,把第二優先權設為SD卡(讀卡機)

4.安裝Android x86到SD卡

使用USB開機後,會出現Live CD與安裝的選單
  • 選擇最底下的[Installation - Install Android-x86 to harddisk]
  • 選擇分割區,選到剛才在SD卡建立的Ext3分割區
  • 如果他問你要不要Format,使用Ext3
  • 然後會問要不要安裝GRUB開機管理程式,選擇Yes(我試過不安裝,會無法順利開機)
  • 然後問要不要讓system可讀寫,選擇是
  • 再來就會開始安裝,這中間會有段時間只有藍色畫面,不要心急,等他跳出詢問要不要直接執行或是重新開機
  • 選擇重新開機,並把開機用的USB隨身碟拔除,讓它用SD卡開機
  • 再來就是耐心的等Android開機完成就大功告成了(這時候就是不成功~便成仁~禱告吧XD)

5.BIOS開機順序

成功後~我把BIOS開機順序設定成 先讀讀卡機,再讀硬碟~

這樣想用Android就把SD卡插進去開機,平常還是可以用原本的windows~

6.安裝檔案瀏覽器

安裝ES檔案瀏覽器Root browser lite後,就可以在mnt/USB0目錄找到SD卡中分割的區塊

之後如果外接更多儲存設備也可以這樣存取

後記

使用上雖然還是有些小問題,像是youtube 不能用HD播放~輸入法不容易習慣~
還有一堆以ARM為基礎的App都不能裝(雖然有文章有提到解決方法-ARM emulation,但我還是試不出來)
但能在NB用Abdroid還是很感動~~~

[Unity]加入Subversion(SVN)的步驟

將Unity加入Subversion(SVN)的步驟
可參考
但不能直接砍掉整個Library目錄
實際步驟如下

  1. *建議在開始前先備份整個Unity專案目錄
  2. 在Unity開發程式中選擇Edit → Project Settings → Editor

  3. Inspector中會出現Editor Settings,將Version Control Mode改為Meta Files、Asset Serialization Mode改為Force Text

  4. 儲存後關閉整個Unity,確保所有設定都被儲存了
  5. 刪除根目錄的以下附檔名檔案
    *.csproj
    *.pidb
    *.sln
    *.userprefs
  6. 保留Library目錄的*.asset與AssetServerCacheV3檔案,刪除其他Library目錄的檔案與子目錄

  7. 將整個Unity專案目錄Import到SVN,並Check out出來用Unity開啟來看看有沒有問題

[MS-SQL]不具自動容錯移轉的鏡像設定

以下的資料庫鏡像架構大致上就是

應用程式==data==>主體伺服器==data==>鏡像伺服器

環境

兩台一樣環境的伺服器

  • Windows Server 2003 R2
  • Microsoft SQL Server 2008 R2
  • Microsoft SQL Server Management Studio 10.0.1600.22

SQL Server服務啟動帳號設定

  1. 在windows服務(services.msc) 列表中,找到SQL Server,右鍵選內容或雙擊
  2. 後選擇登入頁,在此帳戶中這裡配置登錄用戶和密碼,這個地方建議兩台伺服器都配置一組一樣的帳號,並將此帳戶加到SQL Server的管理帳戶,後續的鏡像會用這組帳號繼續設定
  3. SQL Server Agent 啟動帳號也一樣設置

主體伺服器備份

  1. 在主體伺服器用windows帳戶登入Management Studio工具,這個動作是為了後續使用語法產生SQL檔時才不會有權限錯誤
  2. 產生資料庫建立語法
    以物件總管詳細資料選取需要鏡像的資料庫,並產生Create語法(選檔案即可產生.sql檔)
  3. 匯出每個資料庫的備份檔
    backup database [DataBaseName1] to disk='D:\dbbackup\[DataBaseName1].bak'  with init
    GO
    backup database [DataBaseName2] to disk='D:\dbbackup\[DataBaseName2].bak' with init
    GO
  4. 匯出每個資料庫的記錄檔
    BACKUP LOG [DataBaseName1] TO DISK = 'D:\dbbackup\[DataBaseName1].log'
    GO
    BACKUP LOG [DataBaseName2] TO DISK = 'D:\dbbackup\[DataBaseName2].log'
    GO

還原資料到鏡像伺服器

  1. 將上一步驟產生的檔案(含*.sql、*.bak、*.log)所在dbbackup資料夾複製到鏡像資料庫
  2. 在鏡像伺服器用windows帳戶登入Management Studio工具
  3. 建立資料庫:以Management Studio開啟建立資料庫用的sql檔並執行,即可產生與主體伺服器相同名稱的資料庫
  4. 還原資料
    restore database [DataBaseName1] from disk='D:\backupz\[DataBaseName1].bak' with replace,norecovery
    GO
    restore database [DataBaseName2] from disk='D:\backupz\[DataBaseName2].bak' with replace,norecovery
    GO
  5. 還原記錄檔
    RESTORE LOG [DataBaseName1] FROM DISK = 'D:\backupz\[DataBaseName1].log'  WITH FILE=1, NORECOVERY
    GO
    RESTORE LOG [DataBaseName2] FROM DISK = 'D:\backupz\[DataBaseName2].log' WITH FILE=1, NORECOVERY
    GO
  6. 成功後會看到建立起來的資料庫名稱後面會出現(正在還原...)的狀態

於主體伺服器啟動鏡像服務

  1. 在主體伺服器的資料庫上點右鍵,選屬性,並選擇[鏡像]頁籤。接著點選[設定安全性]鈕就會開啟[設定資料庫鏡像安全性精靈]

  2. 於見證伺服器選擇頁選擇否,不使用見證伺服器

  3. 第一次使用鏡像設定會選擇本機的鏡像服務Port與鏡像端點名稱,此處採用預設值即可

  4. 設定鏡像伺服器的連線資訊

  5. 服務帳戶不用設定

  6. 完成後就會進行設定,第一次設定時會自動產生服務端點,這時就會啟動服務的Port

  7. 完成後會詢問是否要啟動鏡像,選擇不要啟動鏡像。這時如果直接啟動如果連線網域名稱錯誤就會失敗(而且還不給設定…)

  8. 接著就可以在伺服器網路位址確認鏡像伺服器的連線資訊

    需注意的是他有個奇怪的驗證,就是預設他會把鏡像伺服器的電腦名稱帶到鏡像的位址,但他的預設格式是[電腦名稱.網域名稱],沒有網域名稱時就必須在電腦名稱後面加一個句點.,否則你就會看到下面的錯誤

  9. 啟動成功後如下圖

  10. 重覆此上述動作把所有資料庫的鏡像都啟動

[C#]MS-SQL資料庫存取函式

序言

我將C#存取MS-SQL的程式包了一層方便使用。

環境

  • VS2008
  • MS-SQL 2008

存取函式類別

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Text;
using System.Data;

namespace MyCommon.DAO
{

    /// 
    /// MS-SQL連線物件
    /// 
    public class MSSQLBaseIO
    {
        SqlConnection sqlConn = null;
        /// 
        /// 建立連線物件
        /// 
        /// 連線字串,如Data Source=localhost;Initial Catalog=dbName;User id=Account;Password=Password;
        public MSSQLBaseIO(string connectionString)
        {
            sqlConn = new SqlConnection(connectionString);
        }
        /// 
        /// 建立連線物件
        /// 
        /// 可為localhost / domainname  / 或 IP
        /// 若Host為IP,則需為true
        /// 不設定則填0,則會用MSSQL預設port
        /// 不設定則填null,express版預設為SQLEXPRESS,正式版預設為MSSQLSERVER,從服務組態可以看到
        /// 資料庫名稱
        /// 是否使用 Windows 整合驗証方式連線,false則必需填帳號密碼
        /// 登入帳號
        /// 登入密碼
        /// 連線逾期,不設定則填0
        public MSSQLBaseIO(string host,bool isHostIP,int port,
            string instanceName, string dbName,
            bool isIntegratedSecurity,
            string id, string password,
            int timeout)
        {
            StringBuilder connectionString = new StringBuilder();
            if (isHostIP) connectionString.Append("Data Source=tcp:" + host);
            else connectionString.Append("Data Source=" + host);
            if (instanceName != null) connectionString.Append("\\" + instanceName);
            if (port != 0) connectionString.Append("," + port);
            connectionString.Append(";");
            connectionString.Append("Initial Catalog=" + dbName + ";");
            if (isIntegratedSecurity) connectionString.Append("integrated security=true;");
            if (id!=null) connectionString.Append("User id=" + id + ";");
            if (password!=null) connectionString.Append("Password=" + password + ";");
            if (timeout>0) connectionString.Append("Connect Timeout=" + timeout + ";");
            sqlConn = new SqlConnection(connectionString.ToString());
        }
        /// 
        /// 取得目前連線物件
        /// 
        /// 
        public SqlConnection getConnection()
        {
            return sqlConn;
        }

        Exception _exception = null;
        /// 
        /// 取得上次執行後的錯誤
        /// 
        /// 
        public Exception getException(){
            return _exception;
        }
        /// 
        /// 關閉連線
        /// 
        public void closeConn()
        {
            closeConn(true);
        }
        /// 
        /// 關閉連線
        /// 
        /// 是否關閉連線
        public void closeConn(bool isCloseConn){
            if (sqlConn != null && isCloseConn && sqlConn.State!=System.Data.ConnectionState.Closed)
            {
                sqlConn.Close();
            }
        }
        /// 
        /// 取得新的Transaction物件
        /// 
        /// Transaction物件
        public SqlTransaction getNewTransaction()
        {
            if (sqlConn.State != System.Data.ConnectionState.Open)
                sqlConn.Open();
            return sqlConn.BeginTransaction();
        }

        /// 
        /// 執行SQL命令,執行後會關閉SQL連線
        /// 
        /// SQL命令
        /// 是否為預存程序
        /// 變動筆數
        public int ExecuteNonQuery(string sqlcmd, bool isStoredProcedure)
        {
            return ExecuteNonQuery(sqlcmd,isStoredProcedure, true);
        }
        /// 
        /// 執行SQL命令
        /// 
        /// SQL命令
        /// 是否為預存程序
        /// 是否關閉連線
        /// 變動筆數
        public int ExecuteNonQuery(string sqlcmd, bool isStoredProcedure, bool isCloseConn)
        {
            SqlParameter[] sqlparams = null;
            return ExecuteNonQuery(sqlcmd, ref sqlparams, isStoredProcedure, isCloseConn);
        }
        /// 
        /// 執行SQL命令
        /// 
        /// SQL命令
        /// 命令參數,可為null,參數名稱為 @參數名稱
        /// 是否為預存程序
        /// 是否關閉連線
        /// 變動筆數
        public int ExecuteNonQuery(string sqlcmd, ref SqlParameter[] sqlparams, bool isStoredProcedure, bool isCloseConn)
        {
            return ExecuteNonQuery(sqlcmd, ref sqlparams, isStoredProcedure, null, isCloseConn);
        }
        /// 
        /// 執行SQL命令
        /// 
        /// SQL命令
        /// 命令參數,可為null,參數名稱為 @參數名稱
        /// 是否為預存程序
        /// SqlTransaction,可為null
        /// 是否關閉連線
        /// 變動筆數
        public int ExecuteNonQuery(string sqlcmd, ref SqlParameter[] sqlparams,bool isStoredProcedure, SqlTransaction trans, bool isCloseConn)
        {
            int result = -1;
            _exception = null;
            try
            {
                if (sqlConn.State != System.Data.ConnectionState.Open)
                    sqlConn.Open();
                SqlCommand cmd;
                if (trans==null)
                    cmd = new SqlCommand(sqlcmd, sqlConn);
                else
                    cmd = new SqlCommand(sqlcmd, sqlConn, trans);
                if(isStoredProcedure)
                    cmd.CommandType = CommandType.StoredProcedure;
                if (sqlparams!=null)
                    cmd.Parameters.AddRange(sqlparams);
                result = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                _exception = ex;
            }
            finally
            {
                closeConn(isCloseConn);
            }
            return result;
        }
        /// 
        /// 取得多列資料,執行後會關閉SQL連線
        /// 
        /// SQL命令
        /// 是否為預存程序
        /// 是否關閉連線
        /// 多列資料
        public List ExecuteReader(string sqlcmd, bool isStoredProcedure)
        {
            return ExecuteReader(sqlcmd, isStoredProcedure, true);
        }
        /// 
        /// 取得多列資料
        /// 
        /// SQL命令
        /// 是否為預存程序
        /// 是否關閉連線
        /// 多列資料
        public List ExecuteReader(string sqlcmd, bool isStoredProcedure, bool isCloseConn)
        {
            SqlParameter[] sqlparams = null;
            return ExecuteReader(sqlcmd, ref sqlparams, isStoredProcedure, isCloseConn);
        }
        /// 
        /// 取得多列資料
        /// 
        /// SQL命令
        /// 命令參數,可為null,參數名稱為 @參數名稱
        /// 是否為預存程序
        /// 是否關閉連線
        /// 多列資料
        public List ExecuteReader(string sqlcmd, ref SqlParameter[] sqlparams, bool isStoredProcedure, bool isCloseConn)
        {
            return ExecuteReader(sqlcmd, ref sqlparams, isStoredProcedure, null, isCloseConn);
        }
        /// 
        /// 取得多列資料
        /// 
        /// SQL命令
        /// 命令參數,可為null,參數名稱為 @參數名稱
        /// 是否為預存程序
        /// SqlTransaction,可為null
        /// 是否關閉連線
        /// 多列資料
        public List ExecuteReader(string sqlcmd, ref SqlParameter[] sqlparams, bool isStoredProcedure, SqlTransaction trans, bool isCloseConn)
        {
            List result = null;
            _exception = null;
            SqlDataReader reader = null;
            try
            {
                if (sqlConn.State != System.Data.ConnectionState.Open)
                    sqlConn.Open();
                SqlCommand cmd;
                if (trans == null)
                    cmd = new SqlCommand(sqlcmd, sqlConn);
                else
                    cmd = new SqlCommand(sqlcmd, sqlConn, trans);
                if (isStoredProcedure)
                    cmd.CommandType = CommandType.StoredProcedure;
                if (sqlparams != null)
                    cmd.Parameters.AddRange(sqlparams);
                reader = cmd.ExecuteReader();
                object[] item;
                if (reader.HasRows)
                {
                    result = new List();
                    while (reader.Read())
                    {
                        item = new object[reader.FieldCount];
                        for (int j = 0; j < reader.FieldCount; j++)
                        {
                            item[j] = reader[j];
                        }
                        result.Add(item);
                    }
                }
            }
            catch (Exception ex)
            {
                _exception = ex;
            }
            finally
            {
                if (reader!=null) reader.Close();
                closeConn(isCloseConn);
            }
            return result;
        }

        /// 
        /// 取得單一值,執行後會關閉SQL連線
        /// 
        /// SQL命令
        /// 是否為預存程序
        /// 單一值
        public object ExecuteScalar(string sqlcmd, bool isStoredProcedure)
        {
            return ExecuteScalar(sqlcmd, isStoredProcedure, true);
        }
        /// 
        /// 取得單一值
        /// 
        /// SQL命令
        /// 是否為預存程序
        /// 是否關閉連線
        /// 單一值
        public object ExecuteScalar(string sqlcmd, bool isStoredProcedure, bool isCloseConn)
        {
            SqlParameter[] sqlparams = null;
            return ExecuteScalar(sqlcmd, ref sqlparams, isStoredProcedure, isCloseConn);
        }
        /// 
        /// 取得單一值
        /// 
        /// SQL命令
        /// 命令參數,可為null,參數名稱為 @參數名稱
        /// 是否為預存程序
        /// 是否關閉連線
        /// 單一值
        public object ExecuteScalar(string sqlcmd,ref SqlParameter[] sqlparams, bool isStoredProcedure, bool isCloseConn)
        {
            return ExecuteScalar(sqlcmd,ref sqlparams, isStoredProcedure, null, isCloseConn);
        }
        /// 
        /// 取得單一值
        /// 
        /// SQL命令
        /// 命令參數,可為null,參數名稱為 @參數名稱
        /// 是否為預存程序
        /// SqlTransaction,可為null
        /// 是否關閉連線
        /// 單一值
        public object ExecuteScalar(string sqlcmd,ref SqlParameter[] sqlparams, bool isStoredProcedure, SqlTransaction trans, bool isCloseConn)
        {
            object result = null;
            _exception = null;
            try
            {
                if (sqlConn.State != System.Data.ConnectionState.Open)
                    sqlConn.Open();
                SqlCommand cmd;
                if (trans == null)
                    cmd = new SqlCommand(sqlcmd, sqlConn);
                else
                    cmd = new SqlCommand(sqlcmd, sqlConn, trans);
                if (isStoredProcedure)
                    cmd.CommandType = CommandType.StoredProcedure;
                if (sqlparams != null)
                    cmd.Parameters.AddRange(sqlparams);
                result = cmd.ExecuteScalar();
              
            }
            catch (Exception ex)
            {
                _exception = ex;
            }
            finally
            {
                closeConn(isCloseConn);
            }
            return result;
        }

        /// 
        /// 取得單一列資料,執行後會關閉SQL連線
        /// 
        /// SQL命令
        /// 是否為預存程序
        /// 單一列資料
        public object[] ExecuteReaderSingleRow(string sqlcmd, bool isStoredProcedure)
        {
            return ExecuteReaderSingleRow(sqlcmd, isStoredProcedure, true);
        }
        /// 
        /// 取得單一列資料
        /// 
        /// SQL命令
        /// 是否為預存程序
        /// 是否關閉連線
        /// 單一列資料
        public object[] ExecuteReaderSingleRow(string sqlcmd, bool isStoredProcedure, bool isCloseConn)
        {
            SqlParameter[] sqlparams = null;
            return ExecuteReaderSingleRow(sqlcmd, ref sqlparams, isStoredProcedure, isCloseConn);
        }
        /// 
        /// 取得單一列資料
        /// 
        /// SQL命令,參數部份以 @參數名稱 標示
        /// 命令參數,可為null,參數名稱為 @參數名稱
        /// 是否為預存程序
        /// 是否關閉連線
        /// 單一列資料
        public object[] ExecuteReaderSingleRow(string sqlcmd,ref SqlParameter[] sqlparams, bool isStoredProcedure, bool isCloseConn)
        {
            return ExecuteReaderSingleRow(sqlcmd,ref sqlparams, isStoredProcedure, null, isCloseConn);
        }
        /// 
        /// 取得單一列資料
        /// 
        /// SQL命令,參數部份以 @參數名稱 標示
        /// 命令參數,可為null,參數名稱為 @參數名稱
        /// 是否為預存程序
        /// SqlTransaction,可為null
        /// 是否關閉連線
        /// 單一列資料
        public object[] ExecuteReaderSingleRow(string sqlcmd, ref SqlParameter[] sqlparams, bool isStoredProcedure, SqlTransaction trans, bool isCloseConn)
        {
            object[] result = null;
            _exception = null;
            SqlDataReader reader = null;
            try
            {
                if (sqlConn.State != System.Data.ConnectionState.Open)
                    sqlConn.Open();
                SqlCommand cmd;
                if (trans == null)
                    cmd = new SqlCommand(sqlcmd, sqlConn);
                else
                    cmd = new SqlCommand(sqlcmd, sqlConn, trans);
                if (isStoredProcedure)
                    cmd.CommandType = CommandType.StoredProcedure;
                if (sqlparams != null)
                    cmd.Parameters.AddRange(sqlparams);
                reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
                object[] item;
                if (reader.HasRows)
                {
                    reader.Read();
                    item = new object[reader.FieldCount];
                    for (int j = 0; j < reader.FieldCount; j++)
                    {
                        item[j] = reader[j];
                    }
                    result = item;
                }
            }
            catch (Exception ex)
            {
                _exception = ex;
            }
            finally
            {
                if (reader != null) reader.Close();
                closeConn(isCloseConn);
            }
            return result;
        }
    }
}
 

[C++]Oracle資料庫存取函式(OCCI)


開發環境

  • VS2008
  • Oracle 10g Express Edition

下載OCCI函式庫

  1. 下載occivc9win32-111060-132181.zip,解壓縮到自行建立的lib目錄後可以得到目錄
  2. 下載instantclient-sdk-win32-11.2.0.1.0.zip,解壓縮後可在[instantclient_11_2\sdk\]目錄找到[include]
  3. 將上述兩個目錄複製到某個目錄下,如[D:\Project\CPPProject\occivc9win32-111060-132181]

設定開發專案

  1. 將[lib]目錄中的oraocci11.dll與oraocci11d.dll都複製到[C:\WINDOWS\system32]
  2. 於開發用的C++專案設定屬性:展開[組態屬性→C/C++→一般],修改[其他Include目錄],指到[include]目錄
  3. 展開[組態屬性→連結器→一般],修改[其他程式庫目錄],指到lib目錄
  4. 展開[組態屬性→連結器→輸入],修改[其他相依性],,增加[oraocci11d.lib]

資料庫連線函式庫

  1. OracleIO.h
    #pragma once
    #include
    namespace commonio {
     class OracleIO
     {
      private:
       oracle::occi::Environment *env;
       oracle::occi::Connection *conn;
       oracle::occi::Statement *stmt;
       oracle::occi::ResultSet *rs;
       const char* _ip;
       unsigned int _port;
       const char* _account;
       const char* _pswd;
       const char* _defaultDB;
      public:
       OracleIO(const char* ip,unsigned int port,const char* account,const char* pswd,const char* defaultDB);
       ~OracleIO(void);
    
       
       /**
       **取得連線
       **/
       oracle::occi::Connection *getConn();
       void closeConn();
       void closeStatement();
       /**
       **執行查詢
       **/
       oracle::occi::ResultSet *executeQuery(const char* sqlStr);
       /**
       **執行新增、更新、刪除
       **/
       unsigned int executeUpdate(const char* sqlStr);
     };
    };
  2. OracleIO.cpp
    #include "StdAfx.h"
    #include "OracleIO.h"
    #include "CommonFunc.h"
    #include 
    using namespace std;
    using namespace commonio;
    using namespace oracle::occi;
    OracleIO::OracleIO(const char* ip,unsigned int port,const char* account,const char* pswd,const char* defaultDB)
    {
     _ip=ip;
     _port=port;
     _account=account;
     _pswd=pswd;
     _defaultDB=defaultDB;
     env = oracle::occi::Environment::createEnvironment("UTF8","UTF8",Environment::THREADED_MUTEXED);
     conn=NULL;
     stmt=NULL;
     rs=NULL;
    }
    
    
    
    OracleIO::~OracleIO(void)
    {
     closeConn();
     oracle::occi::Environment::terminateEnvironment(env);
    }
    
    Connection* OracleIO::getConn(){
     if(conn==NULL){
      string port;
      commonio::CommonFunc::itostr(_port,port,10);
      string connectString="//";
      connectString=connectString + _ip+ ":" + port + "/" + _defaultDB;
      conn = env->createConnection(_account, _pswd, connectString);
     }
     return conn;
    }
    void OracleIO::closeConn(){
     if(conn!=NULL){
      closeStatement();
      env->terminateConnection(conn);
      conn=NULL;
     }
    }
    void OracleIO::closeStatement(){
     if(stmt!=NULL){
      if(rs!=NULL){
       stmt->closeResultSet(rs);
       rs=NULL;
      }
      conn->terminateStatement(stmt);
      stmt=NULL;
     }
    }
    
    ResultSet *OracleIO::executeQuery(const char* sqlStr){
     try{
      getConn();
      string sql=string(sqlStr);
      stmt = conn->createStatement(sql);
      rs = stmt->executeQuery();  
     }catch (SQLException &sqlExcp){
      cerr <createStatement(sql);
      result=stmt->executeUpdate();
      closeStatement();
     }catch (SQLException &sqlExcp){
      cerr <
  3. 額外函式
    • CommonFunc.h
      #pragma once
      using namespace std;
      namespace commonio {
       class CommonFunc
       {
       public:
        static void itostr(int value, std::string& buf, int base);
       };
      };
    • CommonFunc.cpp
      #include "stdafx.h"
      #include 
      #include "CommonFunc.h"
      using namespace std;
      using namespace commonio;
      
      void CommonFunc::itostr(int value, std::string& buf, int base){
       
       int i = 30;
       
       buf = "";
       
       for(; value && i ; --i, value /= base) buf = "0123456789abcdef"[value % base] + buf;
       
      }

使用範例

#include "stdafx.h"
#include 
#include 
#include "OracleIO.h"
using namespace std;
using namespace commonio;

int main(int argc, _TCHAR* argv[])
{

 OracleIO oracleio=OracleIO("localhost",1521,"oracle","oracle","XE");
 /**
 **更新測試Start
 **/ 
 unsigned int changeNum= oracleio.executeUpdate("update test1 set testname='test123' where testsn=1");
 cout<<"changeNum:"< listOfColumns =rs->getColumnListMetaData();
 for(int i=0;inext())
 {
  for(int i=0;igetString(i+1)<<"\t";
  }
  cout <
這裡是關於技術的手札~

也歡迎大家到

倫與貓的足跡



到噗浪來

關心一下我唷!
by 倫
 
Copyright 2009 倫倫3號Beta-Log All rights reserved.
Blogger Templates created by Deluxe Templates
Wordpress Theme by EZwpthemes