/[AnywhereTS-MSSQL]/trunk/AnywhereTS.DBSupport/DBConnector.cs
ViewVC logotype

Diff of /trunk/AnywhereTS.DBSupport/DBConnector.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 116 by william, Sat Jul 14 08:03:33 2012 UTC revision 133 by william, Sun Jul 15 05:00:59 2012 UTC
# Line 5  using System.Data.SqlClient; Line 5  using System.Data.SqlClient;
5  using System.Data.Common;  using System.Data.Common;
6  using System.Data;  using System.Data;
7  using System.Text.RegularExpressions;  using System.Text.RegularExpressions;
8    using System.IO;
9    
10    
11  namespace AnywhereTS.DBSupport  namespace AnywhereTS.DBSupport
12  {  {
# Line 14  namespace AnywhereTS.DBSupport Line 16  namespace AnywhereTS.DBSupport
16          where DBConnection : DbConnection, new()          where DBConnection : DbConnection, new()
17          where DBDataAdapter : DbDataAdapter, new()          where DBDataAdapter : DbDataAdapter, new()
18      {      {
19            bool ConnectionIsCreated { get; }
20          bool ConnectionIsOpen { get; }          bool ConnectionIsOpen { get; }
21          void CreateConnection(out Exception ErrorInfo);          void CreateConnection(out Exception ErrorInfo);
22          void OpenConnection(out Exception ErrorInfo);          void OpenConnection(out Exception ErrorInfo);
23    
24            void GetConnectionClone(out DBConnection connection, out Exception ErrorInfo);
25    
26          void CloseConnection(out Exception ErrorInfo);          void CloseConnection(out Exception ErrorInfo);
27    
28          DbDataReader ExecuteQuery(string command, List<DBParameter> Params, out Exception ErrorInfo);          DbDataReader ExecuteQuery(string command, List<DBParameter> Params, out Exception ErrorInfo);
29          void ExecuteNonQuery(string command, List<DBParameter> Params, out Exception ErrorInfo);          void ExecuteNonQuery(string command, List<DBParameter> Params, out Exception ErrorInfo);
30          List<string> ExecuteColumnNamesReader(string command, List<DBParameter> Params, out Exception ErrorInfo);          List<string> ExecuteColumnNamesReader(string command, List<DBParameter> Params, out Exception ErrorInfo);
31    
32          DBCommand CreateCommandInstance(string command, List<DBParameter> Params, out Exception ErrorInfo);          //DBCommand CreateCommandInstance(string command, List<DBParameter> Params, out Exception ErrorInfo);
33          bool RunScript(string strFile, out Exception ErrorInfo);          bool RunScript(string strFile, out Exception ErrorInfo);
34      }      }
35      public abstract class DBConnector<DBParameter, DBCommand, DBConnection, DBDataAdapter> :      public abstract class DBConnector<DBParameter, DBCommand, DBConnection, DBDataAdapter> :
# Line 47  namespace AnywhereTS.DBSupport Line 53  namespace AnywhereTS.DBSupport
53    
54          public static string GetConnectionString()          public static string GetConnectionString()
55          {          {
56              return string.Format(@"Data Source={0}\{1};Initial Catalog={2};Integrated Security=SSPI", DBServerAddress, DBServerInstance, DBDatabase);              return string.Format(@"Data Source={0}\{1};Database={2};Integrated Security=SSPI", DBServerAddress, DBServerInstance, DBDatabase);
57          }          }
58          protected DBConnection connection;          protected DBConnection connection;
59          #region DBServerAddress, DBServerInstance, DBDatabase          #region DBServerAddress, DBServerInstance, DBDatabase
# Line 59  namespace AnywhereTS.DBSupport Line 65  namespace AnywhereTS.DBSupport
65          private string SafeSqlLiteral(string inputSQL) { return inputSQL.Replace("'", "''"); }          private string SafeSqlLiteral(string inputSQL) { return inputSQL.Replace("'", "''"); }
66          #endregion          #endregion
67          #region IDBConnector members          #region IDBConnector members
68            #region  public virtual bool ConnectionIsCreated
69            public virtual bool ConnectionIsCreated { get; protected set; }
70            #endregion
71          #region  public virtual bool ConnectionIsOpen          #region  public virtual bool ConnectionIsOpen
72          public virtual bool ConnectionIsOpen { get; protected set; }          public virtual bool ConnectionIsOpen { get; protected set; }
73          #endregion          #endregion
74          #region public virtual DBCommand CreateCommandInstance(string command, List<DBParameter> Params, out Exception ErrorInfo)          #region public virtual DBCommand CreateCommandInstance(string command, List<DBParameter> Params, out Exception ErrorInfo)
75          public virtual DBCommand CreateCommandInstance(string command, List<DBParameter> Params, out Exception ErrorInfo)          //public virtual DBCommand CreateCommandInstance(string command, List<DBParameter> Params, out Exception ErrorInfo)
76            //{
77            //    ErrorInfo = null;
78            //    try
79            //    {
80            //        command = this.SafeSqlLiteral(command);
81            //        DBCommand sqlComm = new DBCommand();
82            //        sqlComm.CommandText = command;
83            //        sqlComm.Connection = connection;
84            //        foreach (DBParameter p in Params) { sqlComm.Parameters.Add(p); }
85            //        return sqlComm;
86            //    }
87            //    catch (SqlException ex)
88            //    {
89            //        SqlException e = (ex.GetBaseException() as SqlException);
90            //        using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", e.Number.ToString(), e.Message, System.Environment.NewLine, e.ToString())))
91            //        {
92            //            Logging.DatabaseLog.Error(string.Format("Failed to create command instance using command: {0}", command));
93            //        }
94            //        ErrorInfo = ex; throw ErrorInfo;
95            //    }
96            //    catch (Exception ex)
97            //    {
98            //        Exception e = ex.GetBaseException();
99            //        using (log4net.NDC.Push(string.Format("{0}: MESSAGE={1}{2}Diagnostics:{2}{3}", e.GetType().Name, e.Message, System.Environment.NewLine, e.ToString())))
100            //        {
101            //            Logging.DatabaseLog.Error(string.Format("Failed to create command instance using command: {0}", command));
102            //        }
103            //        ErrorInfo = ex; throw ErrorInfo;
104            //    }
105            //}
106            #endregion
107            #region public virtual void GetConnectionClone(ref DBConnection connection)
108            public virtual void GetConnectionClone(out DBConnection connection, out Exception ErrorInfo)
109          {          {
110              ErrorInfo = null;              ErrorInfo = null;
111              try              connection = this.connection;
             {  
                 command = this.SafeSqlLiteral(command);  
                 DBCommand sqlComm = new DBCommand();  
                 sqlComm.CommandText = command;  
                 sqlComm.Connection = connection;  
                 foreach (DBParameter p in Params) { sqlComm.Parameters.Add(p); }  
                 return sqlComm;  
             }  
             catch (SqlException ex)  
             {  
                 using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", ex.Number.ToString(), ex.Message, System.Environment.NewLine, ex.ToString())))  
                 {  
                     Logging.DatabaseLog.Error(string.Format("Failed to create command instance using command: {0}", command));  
                 }  
                 ErrorInfo = ex; throw ErrorInfo;  
             }  
             catch (Exception ex)  
             {  
                 using (log4net.NDC.Push(string.Format("{0}: MESSAGE={1}{2}Diagnostics:{2}{3}", ex.GetType().Name, ex.Message, System.Environment.NewLine, ex.ToString())))  
                 {  
                     Logging.DatabaseLog.Error(string.Format("Failed to create command instance using command: {0}", command));  
                 }  
                 ErrorInfo = ex; throw ErrorInfo;  
             }  
112          }          }
113          #endregion          #endregion
114          #region  public virtual void CreateConnection(out Exception ErrorInfo)          #region  public virtual DBConnection CreateConnection(out Exception ErrorInfo)
115          public virtual void CreateConnection(out Exception ErrorInfo)          public virtual void CreateConnection(out Exception ErrorInfo)
116          {          {
117              ErrorInfo = null;              ErrorInfo = null;
118                string connetionString = string.Empty;
119              try              try
120              {              {
121                  string connetionString = null;                  if (!this.ConnectionIsCreated)
122                  connetionString = GetConnectionString();                  {
123                  connection = new DBConnection();                      connetionString = GetConnectionString();
124                  connection.ConnectionString = connetionString;                      using (log4net.NDC.Push(string.Format("connetionString={0}", connetionString)))
125                        {
126                            Logging.DatabaseLog.Debug("Creating Connection");
127                            connection = new DBConnection();
128                            connection.ConnectionString = connetionString;
129                            Logging.DatabaseLog.Debug("Created Connection");
130                            this.ConnectionIsCreated = true;
131                        }
132                    }
133                    else
134                    {
135                        throw new Exception("Connection has already been created.");
136                    }
137              }              }
138              catch (SqlException ex)              catch (SqlException ex)
139              {              {
140                    this.ConnectionIsCreated = false;
141                  using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", ex.Number.ToString(), ex.Message, System.Environment.NewLine, ex.ToString())))                  using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", ex.Number.ToString(), ex.Message, System.Environment.NewLine, ex.ToString())))
142                  {                  {
143                      Logging.DatabaseLog.Error(string.Format("Failed to create connection to {0} Database", DBDatabase));                      Logging.DatabaseLog.Error(string.Format("Failed to create connection to {0} Database", DBDatabase));
# Line 114  namespace AnywhereTS.DBSupport Line 146  namespace AnywhereTS.DBSupport
146              }              }
147              catch (Exception ex)              catch (Exception ex)
148              {              {
149                    this.ConnectionIsCreated = false;
150                  using (log4net.NDC.Push(string.Format("{0}: MESSAGE={1}{2}Diagnostics:{2}{3}", ex.GetType().Name, ex.Message, System.Environment.NewLine, ex.ToString())))                  using (log4net.NDC.Push(string.Format("{0}: MESSAGE={1}{2}Diagnostics:{2}{3}", ex.GetType().Name, ex.Message, System.Environment.NewLine, ex.ToString())))
151                  {                  {
152                      Logging.DatabaseLog.Error(string.Format("Failed to create connection to {0} Database", DBDatabase));                      Logging.DatabaseLog.Error(string.Format("Failed to create connection to {0} Database", DBDatabase));
# Line 126  namespace AnywhereTS.DBSupport Line 159  namespace AnywhereTS.DBSupport
159          public virtual void OpenConnection(out Exception ErrorInfo)          public virtual void OpenConnection(out Exception ErrorInfo)
160          {          {
161              ErrorInfo = null;              ErrorInfo = null;
162                string connetionString = string.Empty;
163              try              try
164              {              {
165                  //this.CloseConnection(out ErrorInfo);                  if (this.ConnectionIsCreated && this.ConnectionIsOpen)
166                  connection.Open();                      this.CloseConnection(out ErrorInfo);
167                  this.ConnectionIsOpen = true;                  if (!this.ConnectionIsCreated)
168                        this.CreateConnection(out ErrorInfo);
169                    connetionString = GetConnectionString();
170                    using (log4net.NDC.Push(string.Format("connectionString={0}", connetionString)))
171                    {
172                        Logging.DatabaseLog.Debug("Opening Connection");
173                        connection.Open();  
174                        this.ConnectionIsOpen = true;
175                        Logging.DatabaseLog.Debug("Opened Connection");
176                    }
177              }              }
178              //catch (SqlException ex) { Console.WriteLine(ex.ToString()); ErrorInfo = ex;  throw ErrorInfo;}              //catch (SqlException ex) { Console.WriteLine(ex.ToString()); ErrorInfo = ex;  throw ErrorInfo;}
179              catch (SqlException ex)              catch (SqlException ex)
180              {              {
181                    this.ConnectionIsOpen = false;
182                    if (ex.Message.ToLower().Contains(string.Format("Cannot open database").ToLower()))
183                    {
184                        ErrorInfo = null;
185                    }
186                  using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", ex.Number.ToString(), ex.Message, System.Environment.NewLine, ex.ToString())))                  using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", ex.Number.ToString(), ex.Message, System.Environment.NewLine, ex.ToString())))
187                  {                  {
188                      Logging.DatabaseLog.Error(string.Format("Failed to open connection to {0} Database", DBDatabase));                      Logging.DatabaseLog.Error(string.Format("Failed to open connection to {0} Database", DBDatabase));
# Line 143  namespace AnywhereTS.DBSupport Line 191  namespace AnywhereTS.DBSupport
191              }              }
192              catch (Exception ex)              catch (Exception ex)
193              {              {
194                    this.ConnectionIsOpen = false;
195                    if (ex.Message.ToLower().Contains(string.Format("Cannot open database").ToLower()))
196                    {
197                        ErrorInfo = null;
198                    }
199                  using (log4net.NDC.Push(string.Format("{0}: MESSAGE={1}{2}Diagnostics:{2}{3}", ex.GetType().Name, ex.Message, System.Environment.NewLine, ex.ToString())))                  using (log4net.NDC.Push(string.Format("{0}: MESSAGE={1}{2}Diagnostics:{2}{3}", ex.GetType().Name, ex.Message, System.Environment.NewLine, ex.ToString())))
200                  {                  {
201                      Logging.DatabaseLog.Error(string.Format("Failed to open connection to {0} Database", DBDatabase));                      Logging.DatabaseLog.Error(string.Format("Failed to open connection to {0} Database", DBDatabase));
# Line 158  namespace AnywhereTS.DBSupport Line 211  namespace AnywhereTS.DBSupport
211              try              try
212              {              {
213                  if (this.ConnectionIsOpen)                  if (this.ConnectionIsOpen)
214                    {
215                      connection.Close();                      connection.Close();
216                        this.ConnectionIsOpen = false;
217                        this.ConnectionIsCreated = false;
218                        this.connection = null;
219                    }
220              }              }
221              catch (SqlException ex)              catch (SqlException ex)
222              {              {
# Line 287  namespace AnywhereTS.DBSupport Line 345  namespace AnywhereTS.DBSupport
345          }          }
346          #endregion          #endregion
347          #region public string[] ParseScriptToCommands(string strScript)          #region public string[] ParseScriptToCommands(string strScript)
348          public string[] ParseScriptToCommands(string strScript)      
349          {          protected abstract bool ClientRunScript(string strFile, out Exception ErrorInfo);
             string[] commands;  
             commands = Regex.Split(strScript, "GO\r\n", RegexOptions.IgnoreCase);  
             return commands;  
         }  
350          #endregion          #endregion
351          #region public virtual bool RunScript(string strFile, out Exception ErrorInfo)          #region public virtual bool RunScript(string strFile, out Exception ErrorInfo)
352          public virtual bool RunScript(string strFile, out Exception ErrorInfo)          public bool RunScript(string strFile, out Exception ErrorInfo)
353          {          {
354              ErrorInfo = null;              ErrorInfo = null;
355              try              try
356              {              {
                 string[] strCommands;  
                 strCommands = ParseScriptToCommands(strFile);  
357                  if (this.ConnectionIsOpen)                  if (this.ConnectionIsOpen)
358                  {                  {
359                      foreach (string strCmd in strCommands)                      if (!ClientRunScript(strFile, out ErrorInfo))
360                      {                      {
361                          if (strCmd.Length > 0)                          if(ErrorInfo != null)
362                          {                              throw ErrorInfo;
363                              // Substitute database directory with the decided one.                          return false;
                             DBCommand command = this.CreateCommandInstance(strCmd, new List<DBParameter>(), out ErrorInfo);  
                             command.ExecuteNonQuery();  
                         }  
364                      }                      }
                     return true;  
365                  }                  }
366                  else                  else
367                  {                  {
368                      Logging.ATSAdminLog.Fatal(string.Format("Failed to run script: [database connection is not open] {0}{1}", System.Environment.NewLine, strFile));                      Logging.DatabaseLog.Fatal(string.Format("Failed to run script: [database connection is not open] {0}{1}", System.Environment.NewLine, strFile));
369                      return false;                      return false;
370                  }                  }
371              }              }
372              catch (SqlException ex)              catch (SqlException ex)
373              {              {
374                  using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", ex.Number.ToString(), ex.Message, System.Environment.NewLine, ex.ToString())))                  SqlException e = (ex.GetBaseException() as SqlException);
375                    using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", e.Number.ToString(), e.Message, System.Environment.NewLine, e.ToString())))
376                  {                  {
377                      Logging.DatabaseLog.Error(string.Format("Failed to run script: {0}{1}", System.Environment.NewLine, strFile));                      Logging.DatabaseLog.Error(string.Format("Failed to run script: {0}{1}", System.Environment.NewLine, strFile));
378                  }                  }
379                  ErrorInfo = ex;                  ErrorInfo = ex; throw ErrorInfo;
380              }              }
381              catch (Exception ex)              catch (Exception ex)
382              {              {
383                  using (log4net.NDC.Push(string.Format("{0}: MESSAGE={1}{2}Diagnostics:{2}{3}", ex.GetType().Name, ex.Message, System.Environment.NewLine, ex.ToString())))                  Exception e = ex.GetBaseException();
384                    using (log4net.NDC.Push(string.Format("{0}: MESSAGE={1}{2}Diagnostics:{2}{3}", e.GetType().Name, e.Message, System.Environment.NewLine, e.ToString())))
385                  {                  {
386                      Logging.DatabaseLog.Error(string.Format("Failed to run script: {0}{1}", System.Environment.NewLine, strFile));                      Logging.DatabaseLog.Error(string.Format("Failed to run script: {0}{1}", System.Environment.NewLine, strFile));
387                  }                  }
388                  ErrorInfo = ex;                  ErrorInfo = ex; throw ErrorInfo;
389              }              }
390              return false;              return false;
391          }          }
# Line 348  namespace AnywhereTS.DBSupport Line 398  namespace AnywhereTS.DBSupport
398              try              try
399              {              {
400                  Exception ErrorInfo;                  Exception ErrorInfo;
401                  CloseConnection(out ErrorInfo);                  if (this.ConnectionIsOpen)
402                        CloseConnection(out ErrorInfo);
403              }              }
404              catch              catch
405              {              {

Legend:
Removed from v.116  
changed lines
  Added in v.133

  ViewVC Help
Powered by ViewVC 1.1.22