2016-12-08 14 views
1

Я программист-хобби, новый в мире ООП. В своем стремлении к самообучению я разрабатываю небольшое приложение на базе SQL. Поскольку я планирую несколько раз подключаться к базе данных SQL Server Compact, я решил поместить его в свой класс. Соединение выполняется при первом вызове метода класса, но во второй раз, когда тот же метод класса называется, он выдает исключение недопустимого типа пути. Лучше всего я могу сказать, что при первом запуске он находит .sdf, как и следовало ожидать, но во втором режиме он ищет в папке отладки проектного файла визуальной студии, которая, конечно, неверна.C# SQL Server Компактное соединение успешно выполняется при первом вызове, но не во втором

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

При первом вызове '' crmDB.sdf "' при втором вызове '' cmrDB.sdf "'. «Хорошей практикой является сохранение строки подключения для вашего приложения в [файле конфигурации] (https://www.connectionstrings.com/store-connection-string-in-webconfig/)». Кроме того, вы можете принять некоторые [соглашения об именах] (https://msdn.microsoft.com/library/ms229045.aspx), чтобы упростить чтение кода. По крайней мере, сохраняйте классы, свойства и методы UpperCaseCamelCase.^_^ – Corak

+1

Вау ... Я серьезно провел последние два часа, чтобы устранить эту проблему .... Наверное, мне нужна была вторая пара глаз. Очень признателен. Я планирую использовать конфигурационные файлы для хранения данных, но SQL очень новичок в программировании, поэтому я просто стрелял, чтобы заставить его работать в стиле ООП, прежде чем двигаться дальше. Спасибо за ссылку, я сделаю все возможное, чтобы применить ее. – Phexyaa

ответ

0

Я пробовал свой код на своем компьютере, и он работает. Я создал базу данных SQL Compact Edition в Visual Studio, используя меню «Проект», «Добавить новый элемент» и «Локальная база данных». Он отлично подходит для первого запроса и второго запроса. Я заметил, что вы не закрываете соединение, но я не думаю, что это причина вашей проблемы. На моем компьютере файл .sdf создается в папке проекта и отображается в обозревателе решений как часть проекта. Если ваш .sdf-файл не включен в проект, возможно, вы можете попробовать его добавить сначала, а затем попробовать свой код.

+0

Он опустился до опечатки во втором звонке. Я не думаю, что мне нужно закрыть соединение, так как я его завернул в оператор using. Не стесняйтесь исправить меня, если я ошибаюсь – Phexyaa

+0

Вы правы, соединение закрывается при выходе из инструкции using. Виноват. – daniel