/[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 87 by william, Fri Jul 13 22:37:40 2012 UTC revision 154 by william, Sun Jul 15 13:27:58 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          public bool RunScript(string strFile, MsSqlConnector con, 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> :
36          IDBConnector<DBParameter, DBCommand, DBConnection, DBDataAdapter>          IDBConnector<DBParameter, DBCommand, DBConnection, DBDataAdapter>
# Line 34  namespace AnywhereTS.DBSupport Line 40  namespace AnywhereTS.DBSupport
40          where DBDataAdapter : DbDataAdapter, new()          where DBDataAdapter : DbDataAdapter, new()
41      {      {
42    
43          public DBConnector(string DBServerAddress, string DBServerInstance, string DBDatabase)          public DBConnector(string Server, string Instance, string Database)
44          {          {
45              this.DBServerAddress = DBServerAddress;              DBServerAddress = Server;
46              this.DBServerInstance = DBServerInstance;              DBServerInstance = Instance;
47              this.DBDatabase = DBDatabase;              DBDatabase = Database;
48                using (log4net.NDC.Push(string.Format("[Server={0}] [Instance={1}] [Database={2}]", Server, Instance, Database)))
49                {
50                    Logging.DatabaseLog.Debug("Creating DBConnector instance");
51                }
52          }          }
53    
54            public static string GetConnectionString(string server, string instance, string database)
55            {
56                return string.Format(@"Data Source={0}\{1};Database={2};Integrated Security=SSPI", server, instance, database);
57            }
58          protected DBConnection connection;          protected DBConnection connection;
59          protected string DBServerAddress = "";          #region DBServerAddress, DBServerInstance, DBDatabase
60          protected string DBServerInstance = "";          internal static string DBServerAddress = "";
61          protected string DBDatabase = "";          internal static string DBServerInstance = "";
62            internal static string DBDatabase = "";
63            #endregion
64            #region  private string SafeSqlLiteral(string inputSQL)
65          private string SafeSqlLiteral(string inputSQL) { return inputSQL.Replace("'", "''"); }          private string SafeSqlLiteral(string inputSQL) { return inputSQL.Replace("'", "''"); }
66            #endregion
67          #region IDBConnector members          #region IDBConnector members
68          public DBCommand CreateCommandInstance(string command, List<DBParameter> Params, out Exception ErrorInfo)          #region  public virtual bool ConnectionIsCreated
69            public virtual bool ConnectionIsCreated { get; protected set; }
70            #endregion
71            #region  public virtual bool ConnectionIsOpen
72            public virtual bool ConnectionIsOpen { get; protected set; }
73            #endregion
74            #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)
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          private bool _ConnectionIsOpen;          #endregion
114          public virtual bool ConnectionIsOpen { get { return _ConnectionIsOpen; } protected set { _ConnectionIsOpen = value; } }          #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 = string.Format(@"Data Source={0}\{1};Initial Catalog={2};Integrated Security=SSPI", DBServerAddress, DBServerInstance, DBDatabase);                  {
123                  connection = new DBConnection();                      connetionString = GetConnectionString(DBServerAddress, DBServerInstance, DBDatabase);
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 98  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));
153                  }                  }
154                  ErrorInfo = ex; throw ErrorInfo;                  ErrorInfo = ex; throw ErrorInfo;
155              }              }
156          }          }
157            #endregion
158            #region public virtual void OpenConnection(out Exception ErrorInfo)
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(DBServerAddress, DBServerInstance, DBDatabase);
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 125  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));
202                  }                  }
203                  ErrorInfo = ex; throw ErrorInfo;                  ErrorInfo = ex; throw ErrorInfo;
204              }              }
205          }          }
206            #endregion
207            #region public virtual void CloseConnection(out Exception ErrorInfo)
208          public virtual void CloseConnection(out Exception ErrorInfo)          public virtual void CloseConnection(out Exception ErrorInfo)
209          {          {
210              ErrorInfo = null;              ErrorInfo = null;
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 155  namespace AnywhereTS.DBSupport Line 233  namespace AnywhereTS.DBSupport
233                      Logging.DatabaseLog.Error(string.Format("Failed to close connection to {0} Database", DBDatabase));                      Logging.DatabaseLog.Error(string.Format("Failed to close connection to {0} Database", DBDatabase));
234                  }                  }
235                  ErrorInfo = ex; throw ErrorInfo;                  ErrorInfo = ex; throw ErrorInfo;
236              }              }
237          }          }
238            #endregion
239            #region public virtual DbDataReader ExecuteQuery(string command, List<DBParameter> Params, out Exception ErrorInfo)
240          public virtual DbDataReader ExecuteQuery(string command, List<DBParameter> Params, out Exception ErrorInfo)          public virtual DbDataReader ExecuteQuery(string command, List<DBParameter> Params, out Exception ErrorInfo)
241          {          {
242              ErrorInfo = null;              ErrorInfo = null;
# Line 187  namespace AnywhereTS.DBSupport Line 266  namespace AnywhereTS.DBSupport
266                      Logging.DatabaseLog.Error(string.Format("Failed to execute querey: {0}", command));                      Logging.DatabaseLog.Error(string.Format("Failed to execute querey: {0}", command));
267                  }                  }
268                  ErrorInfo = ex; throw ErrorInfo;                  ErrorInfo = ex; throw ErrorInfo;
269              }              }
270          }          }
271            #endregion
272            #region public virtual void ExecuteNonQuery(string command, List<DBParameter> Params, out Exception ErrorInfo)
273          public virtual void ExecuteNonQuery(string command, List<DBParameter> Params, out Exception ErrorInfo)          public virtual void ExecuteNonQuery(string command, List<DBParameter> Params, out Exception ErrorInfo)
274          {          {
275              ErrorInfo = null;              ErrorInfo = null;
# Line 217  namespace AnywhereTS.DBSupport Line 298  namespace AnywhereTS.DBSupport
298                      Logging.DatabaseLog.Error(string.Format("Failed to execute non querey: {0}", command));                      Logging.DatabaseLog.Error(string.Format("Failed to execute non querey: {0}", command));
299                  }                  }
300                  ErrorInfo = ex; throw ErrorInfo;                  ErrorInfo = ex; throw ErrorInfo;
301              }                  }
302          }          }
303            #endregion
304            #region public virtual List<string> ExecuteColumnNamesReader(string command, List<DBParameter> Params, out Exception ErrorInfo)
305          public virtual List<string> ExecuteColumnNamesReader(string command, List<DBParameter> Params, out Exception ErrorInfo)          public virtual List<string> ExecuteColumnNamesReader(string command, List<DBParameter> Params, out Exception ErrorInfo)
306          {          {
307              ErrorInfo = null;              ErrorInfo = null;
# Line 258  namespace AnywhereTS.DBSupport Line 341  namespace AnywhereTS.DBSupport
341                      Logging.DatabaseLog.Error(string.Format("Failed to get colum names from reader: {0}", command));                      Logging.DatabaseLog.Error(string.Format("Failed to get colum names from reader: {0}", command));
342                  }                  }
343                  ErrorInfo = ex; throw ErrorInfo;                  ErrorInfo = ex; throw ErrorInfo;
344              }                          }
         }  
         public string[] ParseScriptToCommands(string strScript)  
         {  
             string[] commands;  
             commands = Regex.Split(strScript, "GO\r\n", RegexOptions.IgnoreCase);  
             return commands;  
345          }          }
346          public virtual bool RunScript(string strFile, out Exception ErrorInfo)          #endregion
347            #region public string[] ParseScriptToCommands(string strScript)
348        
349            protected abstract bool ClientRunScript(string strFile, out Exception ErrorInfo);
350            #endregion
351            #region public virtual bool RunScript(string strFile, out Exception ErrorInfo)
352            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          }          }
392          #endregion          #endregion
393            #endregion
394    
395          #region IDisposable Members          #region IDisposable Members
396          public virtual void Dispose()          public virtual void Dispose()
# Line 318  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.87  
changed lines
  Added in v.154

  ViewVC Help
Powered by ViewVC 1.1.22