惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
云风的 BLOG
云风的 BLOG
美团技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
雷峰网
雷峰网
P
Proofpoint News Feed
IT之家
IT之家
人人都是产品经理
人人都是产品经理
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
T
The Blog of Author Tim Ferriss
月光博客
月光博客
V
Visual Studio Blog
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
Project Zero
Project Zero
U
Unit 42
T
Tor Project blog
Scott Helme
Scott Helme
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
I
InfoQ
Cloudbric
Cloudbric
P
Proofpoint News Feed
The Cloudflare Blog
H
Heimdal Security Blog
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
Attack and Defense Labs
Attack and Defense Labs
有赞技术团队
有赞技术团队
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
博客园 - 【当耐特】
Security Latest
Security Latest
The Register - Security
The Register - Security
F
Fortinet All Blogs
I
Intezer
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
NISL@THU
NISL@THU
T
Tenable Blog

博客园 - 冷风.net

以OO的思想利用JS來實現五子棋 開放幾個原來寫的js代碼,供大家娛樂一下 使用JS寫的第一個游戲[俄羅斯方塊] 假如現在讓你去說服客戶使用asp.net2.0開發系統,你會怎麼說服呢? 對象化javascript日期控件 - 冷风.net - 博客园 工作排程 防止圖片在WEB頁面上下載 - 冷风.net - 博客园 今天從新整理的大小寫數據轉換 - 冷风.net - 博客园 常用的XPATH說明 XmlHttp在DoNet中的完全应用---前/后台完成分离篇 系统用户权限与角色分析 学习设计模式之Composite 模式 改進Richer的WEB頁面進度條! 学习设计模式之Bridge模式 学习设计模式之生成器(Builder Pattern)模式 再谈Abstract Factory模式来实现数据库操作的类 不周表結構合併問題 今天下午困惑的問題,終於TMD搞出來了 利用線程實現錠時執行的運行模型
Factory Method来实现数据库操作的类
冷风.net · 2005-02-26 · via 博客园 - 冷风.net

今天看了看设计模式中的工场模式,感觉还不错,一时兴起,便将我原来利用简单工场模式写的一个操作数据库的类大至改成了工场模式,算是加深我对工场模式的理解吧。下面来看看实现过程:

一。采用工场模式实现对Connection对象的操作

using System;
using System.Data;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.SqlClient;

namespace DBFactory
{
    
/// <summary>抽象Connection工場類</summary>
    public abstract class ConnectionFactory
    
{
        
protected string connectionString;

        
public ConnectionFactory(string connString)
        
{
            
this.connectionString = connString;
        }


        
public abstract IDbConnection GetConnection();
    }


    
/// <summary>實現SqlConnection對象的具體工作類</summary>
    public class SqlConnection : ConnectionFactory
    
{
        
public SqlConnection() : this(null){}
        
public SqlConnection(string connString) : base(connString){}

        
public override IDbConnection GetConnection()
        
{
            
if(connectionString!=null)
            
{
                
return new System.Data.SqlClient.SqlConnection(connectionString);
            }

            
else
            
{
                
return new System.Data.SqlClient.SqlConnection();
            }

        }

    }


    
/// <summary>實現OleDbConnection對象的具體工場類</summary>
    public class AccessConnection :ConnectionFactory
    
{
        
public AccessConnection() : this(null){}
        
public AccessConnection(string connString) :base(connString){}

        
public override IDbConnection GetConnection()
        
{
            
if(connectionString!=null)
            
{
                
return new OleDbConnection(connectionString);
            }

            
else
            
{
                
return new OleDbConnection();
            }

        }

    }

}


二。采用工场模式实现对Command对象的操作

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

namespace DBFactory
{
    
/// <summary>抽象CommandFactory類</summary>
    public abstract class CommandFactory
    
{
        
protected string commandText;
        
protected IDbConnection iConn;

        
public CommandFactory(IDbConnection conn,string commText)
        
{
            
this.iConn = conn;
            
this.commandText = commText;
        }


        
public abstract IDbCommand GetCommand();
    }


    
/// <summary>實現SqlCommand對象的具體類</summary>
    public class SqlCommand : CommandFactory
    
{
        
public SqlCommand(IDbConnection conn,string commText) : base(conn,commText){}

        
public override IDbCommand GetCommand()
        
{
            
return new System.Data.SqlClient.SqlCommand(commandText,(System.Data.SqlClient.SqlConnection)iConn);
        }

    }


    
/// <summary>實現OleDbCommand對象的具體類</summary>
    public class AccessCommand : CommandFactory
    
{
        
public AccessCommand(IDbConnection conn,string commText) : base(conn,commText){}

        
public override IDbCommand GetCommand()
        
{
            
return new OleDbCommand(commandText,(OleDbConnection)iConn);
        }

    }

}


三。采用工场模式实现对DataAdapter对象的操作

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

namespace DBFactory
{
    
/// <summary>抽象DataAdapterFactory工場類</summary>
    public abstract class DataAdapterFactory
    
{
        
protected IDbCommand iComm;

        
public DataAdapterFactory(IDbCommand comm)
        
{
            
this.iComm = comm;
        }


        
public abstract DbDataAdapter GetDataAdapter();
    }


    
/// <summary>實現SqlDataAdapter對象的具體類</summary>
    public class SqlDataAdapter : DataAdapterFactory
    
{
        
public SqlDataAdapter(IDbCommand comm) : base(comm){}

        
public override DbDataAdapter GetDataAdapter()
        
{
            
return new System.Data.SqlClient.SqlDataAdapter((System.Data.SqlClient.SqlCommand)iComm);
        }

    }


    
/// <summary>實現OleDbDataAdapter對象的具體類</summary>
    public class AccessDataAdapter : DataAdapterFactory
    
{
        
public AccessDataAdapter(IDbCommand comm) : base(comm){}

        
public override DbDataAdapter GetDataAdapter()
        
{
            
return new OleDbDataAdapter((OleDbCommand)iComm);
        }


    }

}

四。这里利用简单工场模式来返回以上的抽象工场对象

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

namespace DBFactory
{
    
public class SimpleFactory
    
{
        
public SimpleFactory(){}

        
/// <summary>返回抽象的ConnectionFactory工場對象</summary>
        public static ConnectionFactory GetConnFactory(string connString,string dbType)
        
{
            ConnectionFactory factory;
            
switch(dbType.ToUpper())
            
{
                
case "SQL":
                    factory 
= new DBFactory.SqlConnection(connString);
                    
break;
                
case "ACCESS":
                    factory 
= new DBFactory.AccessConnection(connString);
                    
break;
                
default:
                    factory 
= null;
                    
break;
            }

            
return factory;
        }


        
/// <summary>返回抽象的CommandFactory工場對象</summary>
        public static CommandFactory GetCommFactory(IDbConnection conn,string commText,string dbType)
        
{
            CommandFactory factory;
            
switch(dbType.ToUpper())
            
{
                
case "SQL":
                    factory 
= new DBFactory.SqlCommand(conn,commText);
                    
break;
                
case "ACCESS":
                    factory 
= new DBFactory.AccessCommand(conn,commText);
                    
break;
                
default:
                    factory 
= null;
                    
break;
            }

            
return factory;
        }


        
/// <summary>返回抽象的DataAdapterFactory工場對象</summary>
        public static DataAdapterFactory GetDataAdapterFactory(IDbCommand comm,string dbType)
        
{
            DataAdapterFactory factory;
            
switch(dbType.ToUpper())
            
{
                
case "SQL":
                    factory 
= new DBFactory.SqlDataAdapter(comm);
                    
break;
                
case "ACCESS":
                    factory 
= new DBFactory.AccessDataAdapter(comm);
                    
break;
                
default:
                    factory 
= null;
                    
break;
            }

            
return factory;
        }

    }

}


五。封装的操作数据库存的类

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

namespace DBFactory
{
    
public class ExecuteDB
    
{
        
private static string connectionString;
        
private static string dbType;

        
public ExecuteDB(){}

        
/// <summary>數據庫連接字符串</summary>
        public static string ConnectionString
        
{
            
get
            
{
                
if(connectionString==null) connectionString = ConfigurationSettings.AppSettings["ConnectionString"];
                
return connectionString;
            }

            
set{connectionString = value;}
        }


        
/// <summary>數據庫類型</summary>
        public static string DBType
        
{
            
get
            
{
                
if(dbType==null) dbType = ConfigurationSettings.AppSettings["DataBaseType"];
                
return dbType;
            }

            
set{dbType=value;}
        }


        
/// <summary>執行SQL語句返回DataSet</summary>
        public static DataSet ExcuteSql(string sqlString)
        
{
            DataSet ds 
= new DataSet();
            ConnectionFactory objConn 
= SimpleFactory.GetConnFactory(ConnectionString,DBType);
            IDbConnection iConn 
= objConn.GetConnection();
            iConn.Open();
            CommandFactory objComm 
= SimpleFactory.GetCommFactory(iConn,sqlString,DBType);
            IDbCommand iComm 
= objComm.GetCommand();
            DataAdapterFactory objAdapter 
= SimpleFactory.GetDataAdapterFactory(iComm,DBType);
            DbDataAdapter dataAdaper 
= objAdapter.GetDataAdapter();
            dataAdaper.Fill(ds);
            iComm.Dispose();
            iConn.Close();
            iConn.Dispose();
            
return ds;
        }

    }

}

上面對具體的數據庫的選擇采用的是簡單工場模式來實現的(因工場模式中的具體類只能實現具體的對象,感覺不好實現)

實現方法:

string connString = "data source=192.168.1.9;initial catalog=sqldll;persist security info=False;user id=sa;password=123456;workstation id=Server;packet size=4096";
            
string commString = "select * from tbl_Vip";

            ExecuteDB.ConnectionString 
= connString;
            ExecuteDB.DBType 
= "sql";
            DataGrid1.DataSource
=ExecuteDB.ExcuteSql(commString);
            DataGrid1.DataBind();