Oracle,SqlServer,Access資料庫通用訪問類設計(轉)

sinsofts發表於2008-01-05
 

本專案除用到"實時資料庫"外, 還需要用Oracle資料庫儲存大量的配置資訊和生成的資料,而且對Oracle的讀取相當的頻繁,在專案開始之處,資料訪問就是一個很令人煩惱的問題,僅僅資料訪問類就修改了好多版本,直到目前正在使用的這個版本.同時為了應付開發過程中不時需要讀取SqlServer和Access資料庫,所以就寫成三種資料來源的通用訪問類,雖然有點四不象,不過挺省事的,嘻嘻!

此模組分為兩個CS檔案:

using System; 
using System.Data; 
using System.Data.Common; 
using System.Data.SqlClient; 
using System.Data.OleDb; 
using System.Data.OracleClient; 
using System.Collections;

namespace REAP.Utility
{
    
public enum DataBaseType
    
{
        Access,
        SQLServer,
        Oracle
    }


    
/// <summary>
    
/// DataFactory  的摘要說明。
    
/// </summary>

    class DataFactory
    
{
        
public DataFactory()
        
{ }

        
public static IDbConnection CreateConnection(string ConnectionString, DataBaseType dbtype)
        
{
            IDbConnection cnn;

            
switch (dbtype)
            
{
                
case DataBaseType.Access:
                    cnn 
= new OleDbConnection(ConnectionString);
                    
break;

                
case DataBaseType.SQLServer:
                    cnn 
= new SqlConnection(ConnectionString);
                    
break;

                
case DataBaseType.Oracle:
                    cnn 
= new OracleConnection(ConnectionString);
                    
break;

                
default:
                    cnn 
= new SqlConnection(ConnectionString);
                    
break;
            }

            
return cnn;
        }


        
public static IDbCommand CreateCommand(DataBaseType dbtype, IDbConnection cnn)
        
{
            IDbCommand cmd;
            
switch (dbtype)
            
{
                
case DataBaseType.Access:
                    cmd 
= new OleDbCommand("", (OleDbConnection)cnn);
                    
break;

                
case DataBaseType.SQLServer:
                    cmd 
= new SqlCommand("", (SqlConnection)cnn);
                    
break;

                
case DataBaseType.Oracle:
                    cmd 
= new OracleCommand("", (OracleConnection)cnn);
                    
break;
                
default:
                    cmd 
= new SqlCommand("", (SqlConnection)cnn);
                    
break;
            }


            
return cmd;
        }


        
public static IDbCommand CreateCommand(string CommandText, DataBaseType dbtype, IDbConnection cnn)
        
{
            IDbCommand cmd;
            
switch (dbtype)
            
{
                
case DataBaseType.Access:
                    cmd 
= new OleDbCommand(CommandText, (OleDbConnection)cnn);
                    
break;

                
case DataBaseType.SQLServer:
                    cmd 
= new SqlCommand(CommandText, (SqlConnection)cnn);
                    
break;

                
case DataBaseType.Oracle:
                    cmd 
= new OracleCommand(CommandText, (OracleConnection)cnn);
                    
break;
                
default:
                    cmd 
= new SqlCommand(CommandText, (SqlConnection)cnn);
                    
break;
            }


            
return cmd;
        }


        
public static DbDataAdapter CreateAdapter(IDbCommand cmd, DataBaseType dbtype)
        
{
            DbDataAdapter da;
            
switch (dbtype)
            
{
                
case DataBaseType.Access:
                    da 
= new OleDbDataAdapter((OleDbCommand)cmd);
                    
break;

                
case DataBaseType.SQLServer:
                    da 
= new SqlDataAdapter((SqlCommand)cmd);
                    
break;

                
case DataBaseType.Oracle:
                    da 
= new OracleDataAdapter((OracleCommand)cmd);
                    
break;

                
default:
                    da 
= new SqlDataAdapter((SqlCommand)cmd);
                    
break;
            }


            
return da;
        }


        
public static IDataParameter CreateParameter(DataBaseType dbtype)
        
{
            IDataParameter param 
= null;
            
switch (dbtype)
            
{
                
case DataBaseType.Access:
                    param 
= new OleDbParameter();
                    
break;

                
case DataBaseType.SQLServer:
                    param 
= new SqlParameter();
                    
break;

                
case DataBaseType.Oracle:
                    param 
= new OracleParameter();
                    
break;

                
default:
                    param 
= new SqlParameter();
                    
break;
            }


            
return param;
        }

    }

}


DBAccess.cs

using System; 
using System.Data; 
using System.Data.Common; 
using System.Data.SqlClient; 
using System.Data.OleDb; 
using System.Data.OracleClient;
using System.Configuration;

namespace REAP.Utility
{
    
/// <summary>
    
/// 由於可能會在多種資料來源,如ORACLE,SQLSERVER,ACCESS等之間進行切換,
    
/// 所以將資料來源連線字串和資料來源型別定義為類屬性,在預設情況下有配置檔案定義;
    
/// 當需要在兩種不同的資料來源之間進行切換時,可以重新為屬性賦值。
    
/// </summary>

    public class DBAccess
    
{
        
屬性設定

        
DataSet生成操作

        
SQL執行操作

        
DataReader操作

        
//其他功能,故意省略
    }

}

舉例如下:

預設情況下是訪問Oracle資料庫,資料庫連線字串已經在Config檔案中定義,所以不需要再設定其ConnectionString和DataSourceType屬性,此時返回一個DataSet的程式碼如下:

DBAccess db = new DBAccess();
//同時執行兩條查詢語句
string strSql = "SELECT * FROM TABLE1;SELECT * FROM TABLE2";
DataSet ds 
= db.GetDataSet(strSql);

但是如果在程式中需要臨時訪問SqlServer資料庫,則需要設定屬性,此時程式碼如下:

DBAccess db = new DBAccess();
db.ConnectionString 
= "server=localhost;UID=sa;PWD=123456;DATABASE=Money;connect timeout=120";
db.DataSourceType 
= DataBaseType.SQLServer;

(完)


 

相關文章