2016-12-08 10 views
1

私はOOPの世界に新しいプログラマーです。私が自力で教えるために、小さなSQLベースのアプリケーションを開発しています。 SQL Server Compactデータベースに複数回接続する予定であるため、独自のクラスに格納することにしました。最初にクラスメソッドが呼び出されたときに接続は成功しますが、同じクラスメソッドが呼び出されて2回目に無効なパスタイプの例外がスローされます。最高の私は最初の実行でそれは.sdfのように見つける必要がありますが、2番目の視覚スタジオのプロジェクトファイルのデバッグフォルダーを見て、それは当然間違っています。C#SQL Serverのコンパクト接続は、最初の呼び出しで成功しますが、2番目の呼び出しでは成功しません。

using System.IO; 
using System.Data.SqlServerCe; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 

namespace Horizon_CRM_Server 
{ 
    public class sqlengine 
    { 
     public string sqlinst { get; set; } 
     public string sqlpass { get; set; } 
     public string sqlquery { get; set; } 
     public string sqlquerytype { get; set; } 
     public string[] sqldata { get; set; } 
     public string[] sqlstringoutput { get; set; } 
     public Int32 sqlintoutput { get; set; } 

     public sqlengine() { } 

     public void runsqlengine() 
     { 
      using (SqlCeConnection main_conn = new SqlCeConnection("Data Source=" + this.sqlinst + ";Password=" + this.sqlpass)) 
      { 
       try 
       { 
        Console.WriteLine("SQL ENGINE CALLED"); 
        Console.WriteLine(); 

        SqlCeCommand sqlcommand = new SqlCeCommand(sqlquery, main_conn); 
        sqlcommand.Connection.Open(); 

        switch (this.sqlquerytype) 
        { 
         case "count": 
          Console.WriteLine("SQLENGINE COUNTING"); 
          Console.WriteLine(); 
          this.sqlintoutput = (Int32)sqlcommand.ExecuteScalar(); 
          Console.WriteLine("Initial Connection to Database Succeeded. There are " + this.sqlintoutput + " Users registered"); 
          break; 

         default: 
          Console.WriteLine("ERROR"); 
          break; 
        } 
       } 
       catch (SqlCeException ex) 
       { 
        string expath = null; 
        Console.WriteLine("ERROR:"); 
        Console.WriteLine(ex); 
        Console.WriteLine(); 

        try 
        { 
         string ez = ex.ToString(); 
         expath = AppDomain.CurrentDomain.BaseDirectory + DateTime.Now.ToString("dd_MM_yyyy_hhmmss_fff") + "HorizonCRM_ERR.txt"; 
         System.IO.File.WriteAllText(expath, ez); 

         Console.WriteLine("ERROR HAS BEEN LOGGED TO: "); 
         Console.WriteLine(expath); 
         Console.WriteLine(); 
        } 
        catch (IOException ex2) 
        { 
         Console.WriteLine("ERROR: Could not log exception!"); 
         Console.WriteLine(ex2); 
         Console.WriteLine(); 
        } 
        catch (Exception ex3) 
        { 
         Console.WriteLine("ERROR: UNKNOWN!"); 
         Console.WriteLine(ex3); 
         Console.WriteLine(); 
        } 
       } 
      } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      IPHostEntry crmhost = Dns.GetHostEntry("127.0.0.1"); 
      IPAddress crmip = crmhost.AddressList[0]; 
      IPEndPoint localendpoint = new IPEndPoint(crmip, 11000); 

      sqlengine sqlusers = new sqlengine(); 
      sqlusers.sqlinst = "crmDB.sdf"; 
      sqlusers.sqlpass = "4or1Z0n"; 
      sqlusers.sqlquery = "SELECT COUNT(*) Id FROM user_data"; 
      sqlusers.sqlquerytype = "count"; 

      sqlusers.runsqlengine(); 

      sqlengine sqlcustomers = new sqlengine(); 
      **sqlcustomers.sqlinst = "cmrDB.sdf";** 
      sqlcustomers.sqlpass = "4or1Z0n"; 
      sqlcustomers.sqlquery = "SELECT COUNT (*) Id FROM customer_data"; 
      sqlcustomers.sqlquerytype = "count"; 

      sqlcustomers.runsqlengine(); 
      Console.ReadLine(); 
     } 
    } 
} 

私は接続文字列を直接定義できますが、必要に応じて起動時にこれを別のデータベースファイルにポイントするオプションを保持したいと考えています。

私はこれについてすべて間違っていますか?コンパクトエディションデータベースに間違って接続していますか?

これまで私にスタックオーバーフローが不可欠でした。誰もが提供してくれたことに本当に感謝しています。

+1

最初の呼び出しでは、2回目の呼び出しでは '' cmmDB.sdf ''です。 「アプリケーションの接続文字列を[configファイル](https://www.connectionstrings.com/store-connection-string-in-webconfig/)に保存することをお勧めします。また、コードを読みやすくするために、いくつかの[命名規則(https://msdn.microsoft.com/library/ms229045.aspx)]を採用することもできます。少なくともクラス、プロパティ、およびメソッドを保持するUpperCaseCamelCase。^_^ – Corak

+1

うわー...私は真剣にこれを解決する最後の2時間を費やした....私は目の第二のペアが必要だったと思う。とても有難い。私は設定ファイルを使ってデータを保存することを計画していますが、SQLはプログラミング面では非常に新しくなっているので、前に移動する前にOOPスタイルで作業するようにしていました。リンクをありがとう、私はそれを適用するために最善を尽くします。 – Phexyaa

答えて

0

私のPCであなたのコードを試してみました。 Visual StudioでProjectメニューとAdd New Itemと選択したLocal Databaseを使用してSQL Compact Editionデータベースを作成しました。最初のクエリと2番目のクエリで正常に動作します。私はあなたが接続を閉じないことに気づいたが、私はこれがあなたの問題の理由だとは思わない。私のPC上では、.sdfファイルはプロジェクトフォルダに作成され、プロジェクトの一部としてソリューションエクスプローラに表示されます。 .sdfファイルがプロジェクトに含まれていない場合は、最初に追加してからコードを試してみてください。

+0

2回目の呼び出しでタイプミスが発生しました。私はusingステートメントでラップされているので、接続を閉じる必要はないと思います。私が間違っていたら私を修正してください。 – Phexyaa

+0

あなたが正しいです、usingステートメントを終了するときに接続が終了しています。私の間違い。 – daniel

関連する問題