ベースから、SQLhelperから
19366 ワード
最初に考えた問題はこの3つです.
1.AccessもSQLServerも使えます.
2.できるだけ簡単で、はっきりしている.
3.性能に大きな問題はない.
書く過程で多くの問題が発見された:各属性は静的ではなく、初期値をどこで行うべきか、属性の書き方が適切かどうか、関数を構築する必要はありません.最も主要な疑問:SQL文の実行が終わったらすぐにCmdを解放したほうがいいか、それとも複数のCmdを待って同じCmdで実行したほうがいいか.
先輩にメールを送り、先輩に返事をします.
問題1、どんな工場、抽象的な工場、あるいは工場の方法を使うかを場合によって決める.問題2、接続もコマンドも使い終わったらすぐに解放します.あなたのやり方では、データベースの接続リソースをずっと占有しています.SQL SERVERの接続数はもともと少ないので、個人的にはよくないと思います.質問3、この質問にはきっぱり答えない.ADOを見ることをお勧めします.NETの考え方は,なぜ接続を提供した後に切断接続を提供したのかを考える.接続を切断するのは、データを読み取り終わったらすぐに接続リソースを解放するためです.接続プールが管理されているので、繰り返し接続しても大丈夫です.コード方面の異常処理私はプログラムの中で統一処理をして、補助クラスの中で異常処理コードをつけません.
これは変更後の第2版です.
いくつかの概念は依然としてあいまいで、文を実行するたびに直接リンクを切断する必要がありますか?この中のどんな書き方が間違っていますか.
よろしくお願いします.
1.AccessもSQLServerも使えます.
2.できるだけ簡単で、はっきりしている.
3.性能に大きな問題はない.
public class SQLHelp
{
#region
private static string ConnStr = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
private static string ProviderType = ConfigurationManager.AppSettings["ProviderType"].ToString();
private DbConnection _Conn;
private static DbProviderFactory DbFactory=DbProviderFactories.GetFactory(ProviderType);
private DbCommand _Cmd = DbFactory.CreateCommand();
private string _CmdText;
private CommandType _CmdType;
#endregion
#region
private DbConnection Conn
{
get
{ return _Conn; }
set
{ _Conn = value; }
}
public DbCommand Cmd
{
get { return _Cmd; }
set { _Cmd = value; }
}
public string CmdText
{
get { return _CmdText; }
set
{
_CmdText = value;
_Cmd.CommandText = value;
}
}
public CommandType CmdType
{
get { return _CmdType; }
set
{
_CmdType = value;
_Cmd.CommandType = value;
}
}
#endregion
#region
private void OpenCon()
{
try
{
if (Conn == null)
{
Conn = DbFactory.CreateConnection();
}
if (Conn.State == ConnectionState.Closed)
{
Conn.ConnectionString = ConnStr;
Conn.Open();
}
}
catch (Exception ex)
{
throw (new Exception(" , " + ex.Message));
}
}
private void CloseCon()
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
}
}
#endregion
/// <summary>
/// SQL ( 、 、 )
/// </summary>
/// <returns> </returns>
public int ExecuteNonQuery()
{
OpenCon();
try
{
return Cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw (new Exception(" : " + ex.Message));
}
finally
{
CloseCon();
}
}
/// <summary>
/// DataAdapter DataTable, DataTable
/// </summary>
/// <returns>DataTable</returns>
public DataTable ExecuteDataTable()
{
OpenCon();
try
{
using (DbDataAdapter da =DbFactory.CreateDataAdapter())
{
da.SelectCommand = Cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
catch (Exception ex)
{
throw (new Exception(" :" + ex.Message));
}
finally
{
CloseCon();
}
}
}
}
書く過程で多くの問題が発見された:各属性は静的ではなく、初期値をどこで行うべきか、属性の書き方が適切かどうか、関数を構築する必要はありません.最も主要な疑問:SQL文の実行が終わったらすぐにCmdを解放したほうがいいか、それとも複数のCmdを待って同じCmdで実行したほうがいいか.
先輩にメールを送り、先輩に返事をします.
問題1、どんな工場、抽象的な工場、あるいは工場の方法を使うかを場合によって決める.問題2、接続もコマンドも使い終わったらすぐに解放します.あなたのやり方では、データベースの接続リソースをずっと占有しています.SQL SERVERの接続数はもともと少ないので、個人的にはよくないと思います.質問3、この質問にはきっぱり答えない.ADOを見ることをお勧めします.NETの考え方は,なぜ接続を提供した後に切断接続を提供したのかを考える.接続を切断するのは、データを読み取り終わったらすぐに接続リソースを解放するためです.接続プールが管理されているので、繰り返し接続しても大丈夫です.コード方面の異常処理私はプログラムの中で統一処理をして、補助クラスの中で異常処理コードをつけません.
これは変更後の第2版です.
public class SQLHelp
{
#region
private static string ConnStr = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
private static string ProviderType = ConfigurationManager.AppSettings["ProviderType"].ToString();
private DbConnection _Conn;
private static DbProviderFactory DbFactory=DbProviderFactories.GetFactory(ProviderType);
private DbCommand _Cmd;
private string _CmdText;
private CommandType _CmdType = CommandType.Text;
#endregion
#region
private DbConnection Conn
{
get
{ return _Conn; }
set
{ _Conn = value; }
}
public DbCommand Cmd
{
get { return _Cmd; }
set { _Cmd = value; }
}
public string CmdText
{
get { return _CmdText; }
set { _CmdText = value;}
}
public CommandType CmdType
{
get { return _CmdType; }
set { _CmdType = value; }
}
#endregion
#region
private void OpenCon()
{
try
{
if (Conn == null)
{
Conn = DbFactory.CreateConnection();
}
if (Conn.State == ConnectionState.Closed)
{
Conn.ConnectionString = ConnStr;
Conn.Open();
}
}
catch (Exception ex)
{
throw (new Exception(" , " + ex.Message));
}
}
private void CloseCon()
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
}
if (Cmd != null)
{
Cmd.Dispose();
Cmd = null;
}
}
private void StartCommend()
{
OpenCon();
Cmd = Conn.CreateCommand();
Cmd.CommandText = CmdText;
Cmd.CommandType = CmdType;
}
#endregion
/// <summary>
/// SQL ( 、 、 )
/// </summary>
/// <returns> </returns>
public int ExecuteNonQuery()
{
StartCommend();
try
{
return Cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw (new Exception(" : " + ex.Message));
}
finally
{
CloseCon();
}
}
/// <summary>
/// DataAdapter DataTable, DataTable
/// </summary>
/// <returns>DataTable</returns>
public DataTable ExecuteDataTable()
{
StartCommend();
try
{
using (DbDataAdapter da =DbFactory.CreateDataAdapter())
{
da.SelectCommand = Cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
catch (Exception ex)
{
throw (new Exception(" :" + ex.Message));
}
finally
{
CloseCon();
}
}
}
}
いくつかの概念は依然としてあいまいで、文を実行するたびに直接リンクを切断する必要がありますか?この中のどんな書き方が間違っていますか.
よろしくお願いします.