2010-11-09 4 views
1

У меня возникли проблемы с моей собственностью, всегда имеющей значение null в моем приложении, но я считаю, что проблема может быть более глубокой. Требование состоит в том, чтобы класс данных, содержащий мою строку подключения, в мою базу данных доступа. Это вызывает другой класс, который извлекает информацию о базе данных и возвращает ее обратно в класс слоя данных. Затем я должен использовать ТОЛЬКО класс уровня данных для получения моих записей. Проблема в том, что мое свойство всегда равно нулю. Вот код для класса слоя данных:Проблема с моей собственностью с использованием C#

{ 
class CustomerDL 
{ 

    OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=CIS3341.accdb;"); 
    string names; 
    public void initializeConnection() 
    { 
     Customer.initializeConnection(aConnection); 
    } 


    public string getNames 
    { 
     get { return names; } 
     set { names = value; } 
    } 

} 

}

А вот другой класс:

class Customer 
{ 

    static OleDbConnection aConnection = null; 
    string names; 

    public static void initializeConnection(OleDbConnection aDbConnection) 
    { 

     aConnection = aDbConnection; 
     aConnection.Open(); 
     getNames(); 
    } 
    public static void getNames() 
    { 
     CustomerDL aCustomer = new CustomerDL(); 
     OleDbDataAdapter myAdapter = new OleDbDataAdapter(); 
     if (aConnection.State == ConnectionState.Closed) 
     { 
      aConnection.Open(); 
     } 
     OleDbCommand cmd = aConnection.CreateCommand(); 
     OleDbDataReader dbReader = null; 
     cmd.CommandText = "SELECT CustomerName FROM Customer"; 
     dbReader = cmd.ExecuteReader(); 
     while (dbReader.Read()) 
     { 
      aCustomer.getNames += (string)dbReader["CustomerName"].ToString() + "\r\n"; 
     } 

     dbReader.Close(); 
     //return aCustomer ; 


    } 

} 

Теперь, когда я использую этот код на моей форме:

public partial class Form1 : Form 

{ 
    CustomerDL customer = new CustomerDL(); 
    public Form1() 
    { 
     InitializeComponent(); 
     customer.initializeConnection(); 
     string fast = customer.getNames; 
     richTextBox1.Text = fast; 
    } 

customer.getNames; всегда равно нулю. Есть идеи?

ответ

2

Вы не присваиваете ничего надлежащему экземпляру CustomerDL.

+0

Извините, вы могли бы разработать и, возможно, предоставить образец. Я немного запутался. – broke

+0

Думаю, Дэниел говорит о том, что вы создаете новый 'CustomerDL' в' Customer.getNames (...) 'вместо того, чтобы передавать существующий экземпляр в качестве параметра из' CustomerDL.initializeConnection() '. –

+0

@Albin: Я не знаю, что вы подразумеваете под существующим экземпляром. Я все еще немного новичок в этом. – broke

1

customer.getNames никогда не получает доступа вообще. Вы инициализируете свое соединение, но в этом методе вы используете новый CustomerDL: CustomerDL aCustomer = new CustomerDL();. Вы должны предоставить этот экземпляр статическому методу, чтобы он мог что-то сделать.

+0

Извините, вы могли бы разработать и, возможно, предоставить образец. Я немного смущен – broke

1

в CustomerDL член names имеет значение по умолчанию обнулить, вы можете инициализировать его с string names = string.Empty;

1

Вы действительно должны консолидировать клиентов и классы CustomerDL в один класс. Слишком много дублирования. Поэтому вместо того, чтобы CustomerDL вызывать Customer, просто поместите код getnames() в ваш класс CustomerDL. И отбросьте все статические модификаторы. В качестве примера вы создаете CustomerDL и вызываете на нем методы. Сделайте класс и его методы нестатичными, и это будет работать намного лучше для вас.

+0

Вот как я бы тоже это сделал, но это домашнее задание, и я должен следовать конкретным рекомендациям. – broke

+0

Было бы очень полезно, если бы вы могли опубликовать параметры для назначения. Например, что вам нужно начинать с класса, который предопределен для вас учителем, или вы можете создать свой собственный. Если да, то каков исходный код для класса. Если нет, то каковы именно письменные требования? – Lane

+0

Да, этот код основан на классе, который предопределен для нас. Мне пришлось изменить его для моей программы, но у меня должно быть 2 класса, и я могу их только назвать. – broke

1

Одна из проблем, которая мешает вам выяснить это один из вашего именования конвенция ...

  • Вы оба свойства и метода называются так же (я бы оставить слово «получить» прочь свойства).
  • У вас есть объект «CustomerDL», который вы назвали «заказчиком». Проблема в том, что у вас также есть класс «Клиент».
  • У вас есть статический метод, закодированный для выполнения того, что вы хотите, но вы его никогда не называете.

IMHO Если вы немного позаботитесь о своих соглашениях об именах, будет намного проще устранить эти проблемы ... В коде есть несколько ошибок, но я быстро дал исправление это выстрел.Надеюсь, что это помогает:

class CustomerDL 
{ 
    OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=CIS3341.accdb;"); 

    public string GetNames() 
    { 
     string NamesToReturn = ""; 

     try 
     { 
      OleDbDataAdapter myAdapter = new OleDbDataAdapter();  
      if (aConnection.State == ConnectionState.Closed)  
      {  
       aConnection.Open();  
      }  

      OleDbCommand cmd = aConnection.CreateCommand();  
      OleDbDataReader dbReader = null;  

      cmd.CommandText = "SELECT CustomerName FROM Customer";  

      dbReader = cmd.ExecuteReader();  

      while (dbReader.Read())  
      {  
       NamesToReturn += (string)dbReader["CustomerName"].ToString() + "\r\n";  
      }  

      dbReader.Close(); 

     catch(Exception ex) 
     { 

     } 
     finally 
     { 
      aConnection.Close(); //makes sure it closes... 
     } 


     return NamesToReturn; 
    }  

}  


Тогда вы можете сделать это:

class Customer    
{   

    private CustomerDL customerData = new CustomerDL(); 

    public string Names { get; set; }    

    public string FillNames() 
    { 
     this.Names = customerData.GetNames(); 
    } 
}    


public partial class Form1 : Form      
{    
    Customer customer = new Customer();    
    public Form1()    
    {    
     InitializeComponent(); 

     customer.FillNames(); 
     richTextBox1.Text = customer.Names;       
    } 
} 

Примечание: Этот код очень сырой, и я не проверил его , но я верю, что это заставит вас указывать в правильном направлении.

Смежные вопросы