2017-06-24 8 views
0

私のアプリがサーバーに接続し、それが実行されているどのPCでもデータベースを作成したい。私はコードを持っていますが、私のコンピュータ上でのみ動作し、他のコンピュータでは動作しません。他のコンピュータ上で実行すると、そのコンピュータのサーバに接続せずデータベースを作成しません。アプリケーションの実行時にサーバーに動的に接続してデータベースを作成

これは私のコードです。私は、アプリケーションが実行されるときに、データベースがそのPC上に存在するかどうか、また作成しないかどうかをチェックしたいと思う。私の問題が何であるかは、私のコードは、サーバー名をキャッチしていないということであると私は、私はSQLは

class Helper 
    { 
     public static SqlConnection ConnectionToDatabase() 
     { 
      string con = string.Format(@"Data Source=DESKTOP-RFJ38NM;Initial Catalog=MyDb;Integrated Security=True", Properties.Settings.Default.Server); 
      return new SqlConnection(con); 
     } 
     public static SqlConnection ConnectionToServer() 
     { 
      string con = string.Format(@"Data Source=DESKTOP-RFJ38NM;Integrated Security=True", Properties.Settings.Default.Server); 
      return new SqlConnection(con); 
     } 

    } 
をコマンドを使用するたびに、私が使用していることも、ヘルパークラスを持っているメッセージ「不正なサーバー名」

public partial class Splash : Form 
    { 
     public Splash() 
     { 
      InitializeComponent();    
      Properties.Settings.Default.Server = "(local)"; 
      timer.Enabled = true; 
     } 

     private void CheckDatabase() 
     { 
      try 
      { 
       using (SqlConnection conn = Helper.ConnectionToServer()) 
       { 
        if (Properties.Settings.Default.Server != string.Empty) 
        { 
         using (SqlCommand cmd = new SqlCommand(
          "IF EXISTS (SELECT name FROM sys.databases WHERE name = 'MyDb') SELECT 1 ELSE SELECT 0", 
          conn)) 
         { 
          conn.Open(); 
          int value = (int)cmd.ExecuteScalar(); 
          conn.Close(); 

          if (value != 1) 
          { 
           MessageBox.Show("Database doesn't exist"); 
           timer.Enabled = false; 
           CreateDatabase(); 

          } 

         } 
        } 
        else 
        { 
         timer.Enabled = true; 
        } 
       } 
      } 
      catch 
      { 
       MessageBox.Show("Bad server name"); 

      } 
     } 
     private void CreateDatabase() 
     { 
      string serverStr = "CREATE DATABASE [MyDb]"; 
      string databaseStr = @" 
CREATE TABLE [dbo].[Worker] (
    [FirstName] NVARCHAR (50) NOT NULL, 
    [Password] NVARCHAR (50) NOT NULL, 
    [LastName] NVARCHAR (50) NOT NULL, 

    PRIMARY KEY CLUSTERED ([Password] ASC) 
); 

CREATE TABLE [dbo].[Article] (
    [ItemName]  NVARCHAR (50) NOT NULL, 
    [Barcode] NVARCHAR (50) NOT NULL, 
    [Price] MONEY NOT NULL, 

    CONSTRAINT [PK_Article] PRIMARY KEY CLUSTERED ([Barcode] ASC) 
);"; 
      using (SqlConnection conn = Helper.ConnectionToServer()) 
      { 
       try 
       { 
        using (SqlCommand comm = new SqlCommand(serverStr, conn)) 
        { 
         conn.Open(); 
         comm.ExecuteNonQuery(); 
         conn.Close(); 
        } 
       } 
       catch 
       { 
        MessageBox.Show("Bad server name"); 

       } 

      } 
      using (SqlConnection conn = Helper.ConnectionToDatabase()) 
      { 
       using (SqlCommand comm = new SqlCommand(databaseStr, conn)) 
       { 
        conn.Open(); 
        comm.ExecuteNonQuery(); 
        conn.Close(); 
        timer.Enabled = true; 
       } 
      } 
     } 

を示し

+0

ほとんどのPCはサーバーではなく、MySQLを実行していません。 [ツアー]を読んでから[質問]、[mcve]の順にクリックして質問を編集して、何をしようとしているのか詳細を記入してください。たぶんSQLiteのようなライブラリが必要なだけかもしれませんが、十分に私たちに話しているわけではありません。 –

+0

@DaveS OPにはMysqlは言及されていませんが、残りのコメントが適用されます。 –

+1

問題は、サーバーの文字列を静的に定義していて、それが動作していないためです。 – Zorge

答えて

1

次のロジックは、2つのテーブルで新しいデータベースを作成します。私はこれをスプラッシュフォームではなく、通常のフォームで、非同期でなければならないと感じたセクションがある場合は、SmoApplicationを使用してデフォルトのSQL Serverインスタンス名を取得するためのものです。 DLLがここで発見され、多くのコンピュータに異なる場合が

C:\ Program Files \ MicrosoftのSQLサーバ\ 130 \ SDK \アセンブリ\ Microsoft.SqlServer.Smo.dll形で

は、単一のボタンがありますボタンのクリックイベントです。クリックするとコードが別のクラスに転送され、そこでコードがマッシュアップされます。操作クラスの上部に

using System; 
using System.Windows.Forms; 

namespace StackOverFlow 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private async void button1_Click(object sender, EventArgs e) 
     { 
      var ops = await Operations.Create(); 

      if (ops.FoundServerInstanceName) 
      { 
       if (ops.CheckDatabase()) 
       { 
        MessageBox.Show("Ready to work with tables!!!"); 
       } 
       else 
       { 
        if (ops.HasException) 
        { 
         MessageBox.Show($"Encountered the following issue(s)\n{ops.ExceptionMessage}"); 
        } 
        else 
        { 
         MessageBox.Show("Failed"); 
        } 
       } 
      } 
     } 
    } 
} 

(以下)いくつかのプロパティデータベースは

  • 既定のインスタンスを示すプロパティが存在するかどうかを示すため
  • つをスロー覚え例外の

    • 一つが存在しますSQL Serverの名前が見つかりました。
    • 新しいデータベース
    • 新しいデータベース

    初期化は、SQL-Serverのインスタンス名を取得するメソッドを使用するための接続文字列を作成するための接続文字列。データベースが存在するかどうかをチェックし、それ以外の場合はデータベースとテーブルを作成します。

    これを構築するには、VS2015を使用しています。ここでは、メッセージ内の文字列補間とプロパティの設定を利用しています。

    これは、現在のタスクで使用することをお勧めします。

    using Microsoft.SqlServer.Management.Smo; 
    using System; 
    using System.Data; 
    using System.Data.Sql; 
    using System.Data.SqlClient; 
    using System.Threading.Tasks; 
    
    namespace StackOverFlow 
    { 
    
        public class Operations 
        { 
         string mExceptionMessage; 
         public string ExceptionMessage { get { return mExceptionMessage; } } 
         public bool HasException { get; set; } 
    
         bool _databaseExists = false; 
    
         bool mFoundServerInstanceName; 
         public bool FoundServerInstanceName { get { return mFoundServerInstanceName; } } 
    
         static string databaseServer; 
         static string masterDefaultCatalog = "Master"; 
         string _masterConnectionString = $"Data Source={databaseServer};Initial Catalog={masterDefaultCatalog};Integrated Security=True"; 
         string MasterConnectionString 
         { 
          get 
          { 
           return _masterConnectionString; 
          } 
          set 
          { 
           _masterConnectionString = value; 
          } 
         } 
    
         static string DefaultCatalog = "MyDb"; 
         string _ConnectionString = $"Data Source={databaseServer};Initial Catalog={DefaultCatalog};Integrated Security=True"; 
         string ConnectionString 
         { 
          get 
          { 
           return _ConnectionString; 
          } 
          set 
          { 
           _ConnectionString = value; 
          } 
         } 
         public static async Task<Operations> Create() 
         { 
          var ops = new Operations(); 
          await ops.Initialize(); 
          return ops; 
         } 
         async Task<bool> Initialize() 
         { 
          return await GetDefaultInstanceAsync(); 
         } 
         public async Task<bool> GetDefaultInstanceAsync() 
         { 
          var serverInstanceTable = new DataTable(); 
          try 
          { 
           await Task.Run(() => { serverInstanceTable = SmoApplication.EnumAvailableSqlServers(true); }); 
           if (serverInstanceTable != null) 
           { 
            databaseServer = serverInstanceTable.Rows[0].Field<string>("name"); 
            mFoundServerInstanceName = true; 
           } 
           else 
           { 
            mFoundServerInstanceName = false; 
           } 
    
           return true; 
    
          } 
          catch (Exception ex) 
          { 
           mExceptionMessage = ex.Message; 
           HasException = true; 
           return false; 
          } 
    
         } 
         /// <summary> 
         /// Determine if the database exists 
         /// </summary> 
         /// <returns></returns> 
         public bool CheckDatabase() 
         { 
    
          try 
          { 
           using (SqlConnection conn = new SqlConnection() { ConnectionString = MasterConnectionString }) 
           { 
            using (SqlCommand cmd = new SqlCommand($"IF EXISTS (SELECT name FROM sys.databases WHERE name = '{DefaultCatalog}') SELECT 1 ELSE SELECT 0", conn)) 
            { 
             conn.Open(); 
             int value = (int)cmd.ExecuteScalar(); 
             conn.Close(); 
    
             if (value != 1) 
             { 
              CreateDatabase(); 
              _databaseExists = true; 
             } 
             else 
             { 
              _databaseExists = true; 
             } 
    
            } 
           } 
          } 
          catch (Exception ex) 
          { 
           mExceptionMessage = ex.Message; 
           _databaseExists = false; 
           HasException = true; 
          } 
    
          return _databaseExists; 
    
         } 
         /// <summary> 
         /// create the database and two tables 
         /// </summary> 
         /// <returns></returns> 
         bool CreateDatabase() 
         { 
          string tableCreateScript = [email protected]" 
          USE [{DefaultCatalog}] 
          CREATE TABLE [dbo].[Article](
           [ItemName] [nvarchar](50) NOT NULL, 
           [Barcode] [nvarchar](50) NOT NULL, 
           [Price] [money] NOT NULL, 
          CONSTRAINT [PK_Article] PRIMARY KEY CLUSTERED 
          (
           [Barcode] ASC 
          )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
          ) ON [PRIMARY]; 
          CREATE TABLE [dbo].[Worker](
           [FirstName] [nvarchar](50) NOT NULL, 
           [Password] [nvarchar](50) NOT NULL, 
           [LastName] [nvarchar](50) NOT NULL, 
          PRIMARY KEY CLUSTERED 
          (
           [Password] ASC 
          )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
          ) ON [PRIMARY];"; 
    
          using (SqlConnection conn = new SqlConnection() { ConnectionString = MasterConnectionString }) 
          { 
           try 
           { 
            using (SqlCommand comm = new SqlCommand($"CREATE DATABASE [{DefaultCatalog}];", conn)) 
            { 
             conn.Open(); 
    
             comm.ExecuteNonQuery(); 
    
             comm.CommandText = tableCreateScript; 
             comm.ExecuteNonQuery(); 
    
             return true; 
    
            } 
           } 
           catch (Exception ex) 
           { 
            mExceptionMessage = ex.Message; 
            HasException = true; 
            return false; 
           } 
    
          } 
    
         } 
        } 
    } 
    
  • 関連する問題