using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;//using System.Data.OleDb;
using System.Data.SqlClient;namespace HKI
{
  public class Conn
  {
    #region <properties>
    public const char HKIDELIM = '★';
    private string HKIConnType = HttpContext.GetGlobalResourceObject("Resource", "ConnType").ToString(); // no use now
    private string HKIConnInstance = HttpContext.GetGlobalResourceObject("Resource", "ConnInstance").ToString();
    private string HKIConnDatabase = "web" + HttpContext.GetGlobalResourceObject("Resource", "CustomerID").ToString();
    private string HKIConnUser = HttpContext.GetGlobalResourceObject("Resource", "ConnUser").ToString();
    private string HKIConnPassword = HttpContext.GetGlobalResourceObject("Resource", "ConnPassword").ToString();    public static SqlConnection objConnection = null;    private string _SqlStatement = "";    public string SqlStatement
    {
      get
      {
        try { return this._SqlStatement; }
        catch (Exception ex) { throw ex; }
      }
      set
      {
        try { this._SqlStatement = value; }
        catch (Exception ex) { throw ex; }
      }
    }
    #endregion
    
    #region <constructors>
    public Conn()
    {
    }
    public Conn(string SqlStatement)
    {
      try
      {
        this._SqlStatement = SqlStatement;
      }
      catch (Exception ex)
      {
        throw ex;
      }
    }
    ~Conn()
    {
    }
    #endregion    #region <connection>
    private bool OpenConnection()
    {
      try
      {
        if (objConnection == null || objConnection.State == ConnectionState.Closed)
        {
          string sConnStr = "" +
            "Data Source=" + HKIConnInstance + ";" +
            "Database=" + HKIConnDatabase + ";" +
            "User Id=" + HKIConnUser + ";" +
            "Password=" + HKIConnPassword + ";";          objConnection = new SqlConnection(sConnStr);
          objConnection.Open();
        }
        return true;
      }      catch (Exception ex)
      {
        throw ex;
      }
    }
    public bool CloseConnection()
    {
      try
      {
        if (objConnection.State == ConnectionState.Open)
        {
          objConnection.Close();
        }
        objConnection.Dispose();
        objConnection = null;
        return true;
      }
      catch (Exception ex)
      {
        throw ex;
      }
    }
    #endregion    #region <execute sql>
    public DataSet SqlSelect()
    {
      try
      {
        OpenConnection();        SqlCommand objCommand = new SqlCommand();
        objCommand.Connection = objConnection;
        SqlTransaction objTrans = objConnection.BeginTransaction();
        objCommand.Transaction = objTrans;
        SqlDataAdapter objDataAdapter = new SqlDataAdapter(objCommand);
        DataSet oDataSet = new DataSet();        SqlStatement = SqlStatement.Trim();
        if (SqlStatement != "")
        {
          try
          {
            string sqlcmd = "";
            string[] SqlStatementArray = SqlStatement.Split(HKIDELIM);
            foreach (string SqlStatementSplit in SqlStatementArray)
            {
              sqlcmd = SqlStatementSplit.Trim();
              if (sqlcmd != "")
              {
                objCommand.CommandText = sqlcmd;
                objDataAdapter.Fill(oDataSet, "MyTable_" + oDataSet.Tables.Count.ToString());
              }
            }
            objTrans.Commit();
            oDataSet.DataSetName = "DataSet";
          }          catch (Exception ex2)
          {
            try
            {
              objTrans.Rollback();
            }
            catch (Exception ex3)
            {
              throw new ApplicationException("[HKI] Cannot rollback transaction: " + ex3.Message);
            }            
            throw new ApplicationException("[HKI] Cannot query database: " + ex2.Message);
          }
        }
        
        objCommand.Dispose();
        objCommand = null;
        objTrans.Dispose();
        objTrans = null;        return oDataSet;
      }
      catch (Exception ex)
      {
        throw new ApplicationException(ex.Message + "<br>SQL: " + this.SqlStatement);
      }
    }
    public int SqlUpdate()
    {
      return SqlUpdate("SELECT @@IDENTITY ");
    }
    public int SqlUpdate(string pSelectSql)
    {
      try
      {
        OpenConnection();        SqlCommand objCommand = new SqlCommand();
        objCommand.Connection = objConnection;
        SqlTransaction objTrans = objConnection.BeginTransaction();
        objCommand.Transaction = objTrans;        int iNewRowID = 0;        SqlStatement = SqlStatement.Trim();
        if (SqlStatement != "")
        {
          try
          {
            string sqlcmd = "";
            string[] SqlStatementArray = SqlStatement.Split(HKIDELIM);
            foreach (string SqlStatementSplit in SqlStatementArray)
            {
              sqlcmd = SqlStatementSplit.Trim();
              if (sqlcmd != "")
              {
                objCommand.CommandText = sqlcmd;
                objCommand.ExecuteNonQuery();
              }
            }            objCommand.CommandText = pSelectSql;
            string sIdentity = objCommand.ExecuteScalar().ToString();            if (sIdentity != "")
            {
              iNewRowID = int.Parse(objCommand.ExecuteScalar().ToString());
            }            objTrans.Commit();
          }          catch (Exception ex2)
          {
            try
            {
              objTrans.Rollback();
            }
            catch (Exception ex3)
            {              
              throw new ApplicationException("[HKI] Cannot rollback transaction: " + ex3.Message);
            }
            
            throw new ApplicationException("[HKI] Cannot update database: " + ex2.Message);
          }
          finally
          {
          }
        }        objCommand.Dispose();
        objCommand = null;
        objTrans.Dispose();
        objTrans = null;        return iNewRowID;
      }      catch (Exception ex)
      {
        throw new ApplicationException(ex.Message + "<br>SQL: " + this.SqlStatement);
      }
    }
    #endregion
  }
}