DBVersionSql.cs 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. using System.Diagnostics;
  5. namespace LJLib.DBOption
  6. {
  7. public abstract class DBVersionSql
  8. {
  9. protected sealed class Script
  10. {
  11. public Script(string version, string script, string tablename)
  12. {
  13. this.version = version;
  14. this.script = script;
  15. this.tablename = tablename;
  16. }
  17. public readonly string version;
  18. public readonly string script;
  19. public readonly string tablename;
  20. }
  21. protected abstract string currentVersion { get; }
  22. protected abstract string dbname { get; }
  23. protected abstract Script[] scripts { get; }
  24. public void CreateTables(string connectionString)
  25. {
  26. using (SqlConnection con = new SqlConnection(connectionString))
  27. using (SqlCommand cmd = con.CreateCommand())
  28. {
  29. con.Open();
  30. CheckDbVersionTable(cmd);
  31. AutoUpdate(cmd);
  32. }
  33. }
  34. private void AutoUpdate(SqlCommand cmd)
  35. {
  36. cmd.CommandText = "SELECT dbversion FROM sys_dbversion WHERE dbname = @dbname";
  37. cmd.Parameters.Add("@dbname", SqlDbType.VarChar).Value = dbname;
  38. object rslt = cmd.ExecuteScalar();
  39. cmd.Parameters.Clear();
  40. string dbversion = (rslt == null || rslt == DBNull.Value ? "1.0.00000000" : Convert.ToString(rslt));
  41. if (string.Compare(currentVersion, dbversion) > 0)
  42. {
  43. foreach (Script script in scripts)
  44. {
  45. if (string.Compare(script.version, dbversion) > 0)
  46. {
  47. cmd.CommandText = script.script;
  48. try
  49. {
  50. cmd.ExecuteNonQuery();
  51. }
  52. catch (Exception ex)
  53. {
  54. Trace.Write(ex.ToString());
  55. if (cmd.Connection.State != ConnectionState.Open)
  56. {
  57. throw;
  58. }
  59. }
  60. }
  61. }
  62. cmd.CommandText = "UPDATE sys_dbversion SET dbversion = @dbversion WHERE dbname = @dbname";
  63. cmd.Parameters.Add("@dbname", SqlDbType.VarChar).Value = dbname;
  64. cmd.Parameters.Add("@dbversion", SqlDbType.VarChar).Value = currentVersion;
  65. int nrows = cmd.ExecuteNonQuery();
  66. cmd.Parameters.Clear();
  67. if (nrows <= 0)
  68. {
  69. cmd.CommandText = "INSERT INTO sys_dbversion(dbname, dbversion) VALUES(@dbname, @dbversion)";
  70. cmd.Parameters.Add("@dbname", SqlDbType.VarChar).Value = dbname;
  71. cmd.Parameters.Add("@dbversion", SqlDbType.VarChar).Value = currentVersion;
  72. cmd.ExecuteNonQuery();
  73. }
  74. }
  75. }
  76. private void CheckDbVersionTable(SqlCommand cmd)
  77. {
  78. cmd.CommandText = "SELECT COUNT(0) FROM dbo.sysobjects WHERE id = OBJECT_ID(N'sys_dbversion') AND OBJECTPROPERTY(id, N'IsUserTable') = 1";
  79. int cnt = Convert.ToInt32(cmd.ExecuteScalar());
  80. if (cnt <= 0)
  81. {
  82. cmd.CommandText = "CREATE TABLE sys_dbversion(dbname varchar(255) not null CONSTRAINT DF_sys_dbversion_dbname default(''),dbversion varchar(255) not null CONSTRAINT DF_sys_dbversion_dbversion default(''),CONSTRAINT PK_sys_dbversion Primary key(dbname asc))";
  83. cmd.ExecuteNonQuery();
  84. }
  85. }
  86. }
  87. }