none
類別庫專案和DataSet一問。 RRS feed

  • 問題

  • 請問一下:

        (標題不知如何下,請見諒!) 

        我想要開發一個類別庫,讓同事去使用,而不用大家去各自去做連線資料庫,做相同的增刪修的動作。  

          所以,我一個方案中,有三 個專案,一個類別庫專案,一個是windows專案(測試用)

       另一個是ClsData,去連接資料庫,裏面是有放DateSet(and TableAdapter)

      目前做到在windows專案中,可以new 一個實體,類似這樣:

    ------------------------------------------------------
            Dim obj As New MyCls.Student

            obj.age = Me.txtAge.Text
            obj.name = Me.txtName.Text
            obj.tel = Me.txtTel.Text
            obj.Save()

    ------------------------------------------------------

        可以正常寫入。 

        但是現在有個問題,就是使用者端,如果是用DataGridView時,我要怎麼有一個DataSet讓他們使用?因為我不想讓使用者直接去引用到,ClsData,而可以直接去資料庫做讀取,因為vs 2005中有tableAdapter會有一些方法,可以操作資料庫,請問這個要如何做到呢? 

        如果我說的不清楚,我可以再描述一下。感謝回答

    • 已移動 璉璉 2010年2月7日 上午 04:51 (從:Visual Studio一般討論區(General))
    2007年8月28日 上午 01:27

解答

  • HI,

     

    如果StudentDataTable放在ClsData中, 當使用者的專案要使用StudentDataTable類別時就必須參考ClsData所在的組件, 否則就不能將StudentDataTable放在ClsData中

     

    tihs

    • 已標示為解答 璉璉 2010年2月7日 上午 04:51
    2007年8月29日 上午 01:52
  • 我用C#寫一個虛擬Code 你參考一下

    //資料存取自訂物件

    Namespace CompanyName.DataAccess{

        public class CustomerDataTableBig SmileataTable{

        }

    }

    //資料存取物件

    Namespace CompanyName.DataAccess{

        public class CustomerDataAccess{

           public CustomerDataTable GetCustomers(){

              SqlConnection.....

              ...........

             ...........

             return customerDataTable;

           }

        }

    }

     

    //企業層

    Namespace CompanyName.BizLogic{

          public class BusinessCustomer{

                public  List<Customer>  GetCustomer(){

                 CustomerDataAccess cda=new CustomerDataAccess();

                 CustomerDataTable cdt=cda.GetCustomers();

                 List<Customer> customers=new List<Customer>();

                 .....

                ......

                ......

               customers.Add(customer);

               return customers;

               }

                  //重點在這裡傳 DataAccess 取代 CustomerDataTable 這是oo的精神

       public  DataAccess  GetCustomer(){

                 CustomerDataAccess cda=new CustomerDataAccess();

                 CustomerDataTable cdt=cda.GetCustomers();

                 return cdt;

               }

         }

    }

    //UI端如Windows或ASPX或PDA...

     

    Namespace CompanyName.UI{

        public class MyForm:WindowsForm

       {

           public Form_Load(object sender,EventArgs args){

            BusinessCustomer bc=new BusinessCustomer ();

            DataTable dt=bc.GetCustomer();

            dgCustomer.DataSource=dt;

          } 

        }

    }

     

    你這樣就能切的很清楚,不用讓UI端知道DataAccess端的事了

    • 已標示為解答 璉璉 2010年2月7日 上午 04:51
    2007年8月29日 上午 08:34

所有回覆

  • HI,

     

    如果適用的話, 可以為類別庫專案加入一個傳回DATASET的方法, 將DATASET傳給用戶端程式使用

     

    tihs

    2007年8月28日 上午 03:01
  • hi This

       有個問題發生,我在mycls定義一個function

       Function GetDsData() As clsData.classDataDataSet.studentDataTable


            Dim ta As New clsData.classDataDataSetTableAdapters.studentTableAdapter

            _tb = ta.GetData()
            Return _tb


        End Function

     

       但是我在windows form 中,並無  clsData.classDataDataSet.studentDataTable  這個型別,vs 2005出現:

    ------------------------------------------------------------------------------------------------------

       錯誤 1 建構會間接參考含有 'clsData.classDataDataSet' 的專案 'clsData'。請在您的專案中加入 'clsData' 的專案參考。 C:\Documents and Settings\michaels\My Documents\Visual Studio 2005\Projects\WinOO\WinOO\Form2.Designer.vb 24 9 WinOO

    -------------------------------------------------------------------------------------------------------

        但是如果讓使用者參考到,clsData的話,這是我不想要的。請問還要如何做修改呢?

        感謝回答

    2007年8月28日 上午 03:11
  • HI,

     

    如果StudentDataTable放在ClsData中, 當使用者的專案要使用StudentDataTable類別時就必須參考ClsData所在的組件, 否則就不能將StudentDataTable放在ClsData中

     

    tihs

    • 已標示為解答 璉璉 2010年2月7日 上午 04:51
    2007年8月29日 上午 01:52
  • hi this

     

       如果使用者參考到clsdata的話,他也就可以使用tableAdapter中的各種方法了。如果要這樣的話,是要如何避免呢?

       記得在.net 2003時,是可以做一個純dataset的Class讓使用者端參考,但是現在的vs 2005的DataSet包了方法在裏頭。

       感謝回答
    2007年8月29日 上午 05:49
  • 我用C#寫一個虛擬Code 你參考一下

    //資料存取自訂物件

    Namespace CompanyName.DataAccess{

        public class CustomerDataTableBig SmileataTable{

        }

    }

    //資料存取物件

    Namespace CompanyName.DataAccess{

        public class CustomerDataAccess{

           public CustomerDataTable GetCustomers(){

              SqlConnection.....

              ...........

             ...........

             return customerDataTable;

           }

        }

    }

     

    //企業層

    Namespace CompanyName.BizLogic{

          public class BusinessCustomer{

                public  List<Customer>  GetCustomer(){

                 CustomerDataAccess cda=new CustomerDataAccess();

                 CustomerDataTable cdt=cda.GetCustomers();

                 List<Customer> customers=new List<Customer>();

                 .....

                ......

                ......

               customers.Add(customer);

               return customers;

               }

                  //重點在這裡傳 DataAccess 取代 CustomerDataTable 這是oo的精神

       public  DataAccess  GetCustomer(){

                 CustomerDataAccess cda=new CustomerDataAccess();

                 CustomerDataTable cdt=cda.GetCustomers();

                 return cdt;

               }

         }

    }

    //UI端如Windows或ASPX或PDA...

     

    Namespace CompanyName.UI{

        public class MyForm:WindowsForm

       {

           public Form_Load(object sender,EventArgs args){

            BusinessCustomer bc=new BusinessCustomer ();

            DataTable dt=bc.GetCustomer();

            dgCustomer.DataSource=dt;

          } 

        }

    }

     

    你這樣就能切的很清楚,不用讓UI端知道DataAccess端的事了

    • 已標示為解答 璉璉 2010年2月7日 上午 04:51
    2007年8月29日 上午 08:34