情人節的晚上思緒萬千,想到了曾經的N次戀愛,想到現在生活,想到曾經的奮斗,想到曾經在身邊的女人,人生不易終於失眠了,上一篇我們介紹了 通用權限管理系統組件 (GPM - General Permissions Manager) 中超級經典的.NET2.0靜態數據庫訪問組件 兩者的區別就是一個是 static 的方法,另外一個是通過接口的方式實現的,接着我們介紹更加靈活的,動態數據庫5種實用方法,與上一篇的數據庫訪問組件結合實用會更加強大一些,真正功能強大的是沒任何封裝的ADO.NET,其實自己封裝的往往都是有些娛樂精神的人干出來的事情。
當然這些數據庫訪問組件都是可以單獨使用的,可以與通用權限管理系統組件無任何關聯。通用權限的很多實現理念就是無關性,通用權限與數據庫訪問組件是無關的,數據庫庫訪問組件就可以單獨用,甚至沒任何無用的代碼,配置在里面。
我們直接看代碼如下:
//
-----------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2012 , Hairihan TECH, Ltd.
// -----------------------------------------------------------------
using System;
using System.Data;
using System.Collections.Generic;
using DotNet.Utilities;
using DotNet.Business;
/// <summary>
/// DbTools2
/// 靜態數據庫訪問的方法程序
///
/// 修改紀錄
///
/// 2012-02-15 版本:1.0 JiRiGaLa 整理例子程序功能。
///
/// 版本:1.0
///
/// <author>
/// <name> JiRiGaLa </name>
/// <date> 2012-02-15 </date>
/// </author>
/// </summary>
public partial class DbTools2 : BasePage
{
protected void Page_Load( object sender, EventArgs e)
{
// 動態方法調用數據庫的方法
this.DynamicMethod();
// 動態打開數據庫的方法
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.Oracle))
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.MySql))
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.DB2))
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.Access))
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.SQLite))
using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.SqlServer))
{
dbHelper.Open(dbConnection);
}
}
private void DynamicMethod()
{
this.Fill();
this.ExecuteNonQuery();
this.ExecuteScalar();
this.ExecuteReader();
}
/// <summary>
/// Fill
/// 動態方法調用數據庫的方法,能有效控制數據庫的開關次數
/// </summary>
private void Fill()
{
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.DB2Helper(dbConnection);
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.MySqlHelper(dbConnection);
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.OleDbHelper(dbConnection);
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.OracleHelper(dbConnection);
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqLiteHelper(dbConnection);
DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqlHelper(dbConnection);
dbHelper.Open();
// 1:直接執行
string commandText = @" SELECT *
FROM BASE_USER
WHERE DELETIONSTATECODE = 0 ";
DataTable dataTable = dbHelper.Fill(commandText);
// 2:防注入的安全的參數化運行方式執行查詢
commandText = @" SELECT *
FROM BASE_USER
WHERE CODE = " + dbHelper.GetParameter( " Code ")
+ " AND DELETIONSTATECODE = " + dbHelper.GetParameter( " DeletionStateCode ");
// 這里是生成安全參數的方法
List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(dbHelper.MakeParameter( " Code ", " jirigala "));
dbParameters.Add(dbHelper.MakeParameter( " DeletionStateCode ", 0));
dataTable = dbHelper.Fill(commandText, dbParameters.ToArray());
// 3:執行存儲過程,假設也是需要傳遞這2個參數,類似功能的一個存儲過程
// 我們不建議用存儲過程,因為會對系統移植,多數據庫設計等上會遇到很多麻煩
commandText = " GET_USER ";
dataTable = dbHelper.Fill(commandText, dbParameters.ToArray(), CommandType.StoredProcedure);
dbHelper.Close();
}
/// <summary>
/// ExecuteNonQuery
/// 靜態方法調用數據庫的方法,調用事物的方式
/// </summary>
/// <returns> 影響行數 </returns>
private int ExecuteNonQuery()
{
int returnValue = 0;
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqlHelper(dbConnection);
try
{
dbHelper.Open();
dbHelper.BeginTransaction();
// 1:直接執行
string commandText = @" UPDATE BASE_USER
SET DELETIONSTATECODE = 0 ";
returnValue = dbHelper.ExecuteNonQuery(commandText);
// 2:防注入的安全的參數化運行方式執行查詢
commandText = @" UPDATE BASE_USER
SET DELETIONSTATECODE = 0
WHERE CODE = " + DotNet.Utilities.DbHelper.GetParameter( " Code ")
+ " AND DELETIONSTATECODE = " + DotNet.Utilities.DbHelper.GetParameter( " DeletionStateCode ");
// 這里是生成安全參數的方法
List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(dbHelper.MakeParameter( " Code ", " jirigala "));
dbParameters.Add(dbHelper.MakeParameter( " DeletionStateCode ", 0));
returnValue = dbHelper.ExecuteNonQuery(commandText, dbParameters.ToArray());
// 3:執行存儲過程,假設也是需要傳遞這2個參數,類似功能的一個存儲過程
// 我們不建議用存儲過程,因為會對系統移植,多數據庫設計等上會遇到很多麻煩
commandText = " UPDATE_USER ";
returnValue = dbHelper.ExecuteNonQuery(commandText, dbParameters.ToArray(), CommandType.StoredProcedure);
dbHelper.CommitTransaction();
}
catch (Exception ex)
{
dbHelper.RollbackTransaction();
BaseExceptionManager.LogException(dbHelper, this.UserInfo, ex);
throw ex;
}
finally
{
dbHelper.Close();
}
return returnValue;
}
/// <summary>
/// ExecuteScalar
/// 動態方法調用數據庫的方法, 支持Using的用法
/// </summary>
/// <returns> 結果 </returns>
private object ExecuteScalar()
{
object returnValue = null;
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
using (DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqlHelper(dbConnection))
{
// 1:直接執行
string commandText = @" SELECT CODE
FROM BASE_USER
WHERE DELETIONSTATECODE = 0 ";
returnValue = dbHelper.ExecuteScalar(commandText);
// 2:防注入的安全的參數化運行方式執行查詢
commandText = @" SELECT CODE
FROM BASE_USER
WHERE CODE = " + dbHelper.GetParameter( " Code ")
+ " AND DELETIONSTATECODE = " + dbHelper.GetParameter( " DeletionStateCode ");
// 這里是生成安全參數的方法
List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(dbHelper.MakeParameter( " Code ", " jirigala "));
dbParameters.Add(dbHelper.MakeParameter( " DeletionStateCode ", 0));
returnValue = dbHelper.ExecuteScalar(commandText, dbParameters.ToArray());
// 3:執行存儲過程,假設也是需要傳遞這2個參數,類似功能的一個存儲過程
// 我們不建議用存儲過程,因為會對系統移植,多數據庫設計等上會遇到很多麻煩
commandText = " GET_USER ";
returnValue = dbHelper.ExecuteScalar(commandText, dbParameters.ToArray(), CommandType.StoredProcedure);
}
return returnValue;
}
/// <summary>
/// ExecuteReader
/// 動態方法調用數據庫的方法,每次執行程序會自動打開關閉數據庫的例子,自動會多次打開關閉
/// </summary>
private void ExecuteReader()
{
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqlHelper(dbConnection);
// 1:直接執行
string commandText = @" SELECT *
FROM BASE_USER
WHERE DELETIONSTATECODE = 0 ";
dbHelper.ExecuteReader(commandText);
// 2:防注入的安全的參數化運行方式執行查詢
commandText = @" SELECT *
FROM BASE_USER
WHERE CODE = " + dbHelper.GetParameter( " Code ")
+ " AND DELETIONSTATECODE = " + dbHelper.GetParameter( " DeletionStateCode ");
// 這里是生成安全參數的方法
List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(dbHelper.MakeParameter( " Code ", " jirigala "));
dbParameters.Add(dbHelper.MakeParameter( " DeletionStateCode ", 0));
dbHelper.ExecuteReader(commandText, dbParameters.ToArray());
// 3:執行存儲過程,假設也是需要傳遞這2個參數,類似功能的一個存儲過程
// 我們不建議用存儲過程,因為會對系統移植,多數據庫設計等上會遇到很多麻煩
commandText = " GET_USER ";
dbHelper.ExecuteReader(commandText, dbParameters.ToArray(), CommandType.StoredProcedure);
}
}
// All Rights Reserved , Copyright (C) 2012 , Hairihan TECH, Ltd.
// -----------------------------------------------------------------
using System;
using System.Data;
using System.Collections.Generic;
using DotNet.Utilities;
using DotNet.Business;
/// <summary>
/// DbTools2
/// 靜態數據庫訪問的方法程序
///
/// 修改紀錄
///
/// 2012-02-15 版本:1.0 JiRiGaLa 整理例子程序功能。
///
/// 版本:1.0
///
/// <author>
/// <name> JiRiGaLa </name>
/// <date> 2012-02-15 </date>
/// </author>
/// </summary>
public partial class DbTools2 : BasePage
{
protected void Page_Load( object sender, EventArgs e)
{
// 動態方法調用數據庫的方法
this.DynamicMethod();
// 動態打開數據庫的方法
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.Oracle))
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.MySql))
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.DB2))
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.Access))
// using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.SQLite))
using (IDbHelper dbHelper = DbHelperFactory.GetHelper(CurrentDbType.SqlServer))
{
dbHelper.Open(dbConnection);
}
}
private void DynamicMethod()
{
this.Fill();
this.ExecuteNonQuery();
this.ExecuteScalar();
this.ExecuteReader();
}
/// <summary>
/// Fill
/// 動態方法調用數據庫的方法,能有效控制數據庫的開關次數
/// </summary>
private void Fill()
{
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.DB2Helper(dbConnection);
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.MySqlHelper(dbConnection);
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.OleDbHelper(dbConnection);
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.OracleHelper(dbConnection);
// DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqLiteHelper(dbConnection);
DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqlHelper(dbConnection);
dbHelper.Open();
// 1:直接執行
string commandText = @" SELECT *
FROM BASE_USER
WHERE DELETIONSTATECODE = 0 ";
DataTable dataTable = dbHelper.Fill(commandText);
// 2:防注入的安全的參數化運行方式執行查詢
commandText = @" SELECT *
FROM BASE_USER
WHERE CODE = " + dbHelper.GetParameter( " Code ")
+ " AND DELETIONSTATECODE = " + dbHelper.GetParameter( " DeletionStateCode ");
// 這里是生成安全參數的方法
List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(dbHelper.MakeParameter( " Code ", " jirigala "));
dbParameters.Add(dbHelper.MakeParameter( " DeletionStateCode ", 0));
dataTable = dbHelper.Fill(commandText, dbParameters.ToArray());
// 3:執行存儲過程,假設也是需要傳遞這2個參數,類似功能的一個存儲過程
// 我們不建議用存儲過程,因為會對系統移植,多數據庫設計等上會遇到很多麻煩
commandText = " GET_USER ";
dataTable = dbHelper.Fill(commandText, dbParameters.ToArray(), CommandType.StoredProcedure);
dbHelper.Close();
}
/// <summary>
/// ExecuteNonQuery
/// 靜態方法調用數據庫的方法,調用事物的方式
/// </summary>
/// <returns> 影響行數 </returns>
private int ExecuteNonQuery()
{
int returnValue = 0;
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqlHelper(dbConnection);
try
{
dbHelper.Open();
dbHelper.BeginTransaction();
// 1:直接執行
string commandText = @" UPDATE BASE_USER
SET DELETIONSTATECODE = 0 ";
returnValue = dbHelper.ExecuteNonQuery(commandText);
// 2:防注入的安全的參數化運行方式執行查詢
commandText = @" UPDATE BASE_USER
SET DELETIONSTATECODE = 0
WHERE CODE = " + DotNet.Utilities.DbHelper.GetParameter( " Code ")
+ " AND DELETIONSTATECODE = " + DotNet.Utilities.DbHelper.GetParameter( " DeletionStateCode ");
// 這里是生成安全參數的方法
List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(dbHelper.MakeParameter( " Code ", " jirigala "));
dbParameters.Add(dbHelper.MakeParameter( " DeletionStateCode ", 0));
returnValue = dbHelper.ExecuteNonQuery(commandText, dbParameters.ToArray());
// 3:執行存儲過程,假設也是需要傳遞這2個參數,類似功能的一個存儲過程
// 我們不建議用存儲過程,因為會對系統移植,多數據庫設計等上會遇到很多麻煩
commandText = " UPDATE_USER ";
returnValue = dbHelper.ExecuteNonQuery(commandText, dbParameters.ToArray(), CommandType.StoredProcedure);
dbHelper.CommitTransaction();
}
catch (Exception ex)
{
dbHelper.RollbackTransaction();
BaseExceptionManager.LogException(dbHelper, this.UserInfo, ex);
throw ex;
}
finally
{
dbHelper.Close();
}
return returnValue;
}
/// <summary>
/// ExecuteScalar
/// 動態方法調用數據庫的方法, 支持Using的用法
/// </summary>
/// <returns> 結果 </returns>
private object ExecuteScalar()
{
object returnValue = null;
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
using (DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqlHelper(dbConnection))
{
// 1:直接執行
string commandText = @" SELECT CODE
FROM BASE_USER
WHERE DELETIONSTATECODE = 0 ";
returnValue = dbHelper.ExecuteScalar(commandText);
// 2:防注入的安全的參數化運行方式執行查詢
commandText = @" SELECT CODE
FROM BASE_USER
WHERE CODE = " + dbHelper.GetParameter( " Code ")
+ " AND DELETIONSTATECODE = " + dbHelper.GetParameter( " DeletionStateCode ");
// 這里是生成安全參數的方法
List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(dbHelper.MakeParameter( " Code ", " jirigala "));
dbParameters.Add(dbHelper.MakeParameter( " DeletionStateCode ", 0));
returnValue = dbHelper.ExecuteScalar(commandText, dbParameters.ToArray());
// 3:執行存儲過程,假設也是需要傳遞這2個參數,類似功能的一個存儲過程
// 我們不建議用存儲過程,因為會對系統移植,多數據庫設計等上會遇到很多麻煩
commandText = " GET_USER ";
returnValue = dbHelper.ExecuteScalar(commandText, dbParameters.ToArray(), CommandType.StoredProcedure);
}
return returnValue;
}
/// <summary>
/// ExecuteReader
/// 動態方法調用數據庫的方法,每次執行程序會自動打開關閉數據庫的例子,自動會多次打開關閉
/// </summary>
private void ExecuteReader()
{
string dbConnection = " Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@1234; ";
DotNet.Utilities.IDbHelper dbHelper = new DotNet.Utilities.SqlHelper(dbConnection);
// 1:直接執行
string commandText = @" SELECT *
FROM BASE_USER
WHERE DELETIONSTATECODE = 0 ";
dbHelper.ExecuteReader(commandText);
// 2:防注入的安全的參數化運行方式執行查詢
commandText = @" SELECT *
FROM BASE_USER
WHERE CODE = " + dbHelper.GetParameter( " Code ")
+ " AND DELETIONSTATECODE = " + dbHelper.GetParameter( " DeletionStateCode ");
// 這里是生成安全參數的方法
List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(dbHelper.MakeParameter( " Code ", " jirigala "));
dbParameters.Add(dbHelper.MakeParameter( " DeletionStateCode ", 0));
dbHelper.ExecuteReader(commandText, dbParameters.ToArray());
// 3:執行存儲過程,假設也是需要傳遞這2個參數,類似功能的一個存儲過程
// 我們不建議用存儲過程,因為會對系統移植,多數據庫設計等上會遇到很多麻煩
commandText = " GET_USER ";
dbHelper.ExecuteReader(commandText, dbParameters.ToArray(), CommandType.StoredProcedure);
}
}
例子程序下載地址如下:
.NET 2.0 數據庫訪問層源碼在這里下載:
/Files/jirigala/DotNet.Utilities.rar