none
DataTableやDataSetの参照渡しをする方法について RRS feed

  • 質問


  • 皆様たびたび、お世話になっています。m(__)m恐縮です

    現在DataTableまたはDataSetにデータをFillし
    そのデータをDataGridViewにセットするコードを書いているのですが。

    「参照渡しでデータを受け渡す方法」が解りません。

    実行したいのはこんなフローです

    ---------------------------------------------------------------------------
    関数1
    1.DataTableの宣言
     DataTable dt1 = gcnew DataTable();

    2.SQLの作成
    sql_str = "SELECT * FROM DBTABLE";


    3.関数2をコール
    (仮)DataTableにデータをセットして帰ってくる関数(&dt1 , sql_str );


    4.セットしてきたテーブルをDataGridView1に表示する
    DataGridView1->DataSource = dt1;


    ---------------------------------------------------------------------------
    関数2
    DataTableにデータをセットして帰ってくる関数(DataTable *p_dt , sql_str )
    {
     //コネクト

     //Fill
     
     return;

    }
    ---------------------------------------------------------------------------
    このような処理は可能なのでしょうか?
    DataTable *p_dtと記述しているところを
    array<DataTable^> ^dt
    と書いてみたのですがコンパイルエラーがでてしまいました・・・

    そもそも発想が間違っているのでしょうか?
    DataTableをポインタ渡しのようなことは不可能なのでしょうか?
    VB.NETだと ByRefやValRef などでできるかと思うのですが。
    できるのであればC++ではどのようにしてコーディングすれば
    実現可能なのでしょうか?

     

    2006年10月12日 11:47

すべての返信

  •  tomonori_tomo さんからの引用


    1.DataTableの宣言
     DataTable dt1 = gcnew DataTable();


    DataTable^ dt1 = gcnew DataTable(); では?

     tomonori_tomo さんからの引用
    DataTable *p_dtと記述しているところを
    array<DataTable^> ^dt
    と書いてみたのですがコンパイルエラーがでてしまいました・・・

    arrayを使う理由は?arrayは(名前のとおり)配列ですよ? 

    2006年10月12日 14:02
  • ちなみに参照渡し(%)を使うときは下のようなコードを書くときぐらいでしょうか。
    public ref struct Foo { System::String^ text; };
    
    void test1( Foo^ f )
    {
        f = gcnew Foo();
        f->text = L"test1";
    }
    
    void test2( Foo^% f )
    {
        f = gcnew Foo();
        f->text = L"test2";
    }
    
    public value struct Bar { System::String^ text; };
    
    void test3( Bar b )
    {
        b.text = L"test3";
    }
    
    void test4( Bar% b )
    {
        b.text = L"test4";
    }
    
    // ※のみ表示される
    int main( void )
    {
        Foo ^f1 = nullptr, ^f2 = nullptr;
    
        test1( f1 );
        if ( ( f1 != nullptr ) && ( f1->text != nullptr ) )
            System::Console::WriteLine( f1->text );
        test2( f2 );
        if ( ( f2 != nullptr ) && ( f2->text != nullptr ) )
            System::Console::WriteLine( f2->text ); // ※
    
        Bar b1, b2;
    
        test3( b1 );
        if ( b1.text != nullptr )
            System::Console::WriteLine( b1.text );
        test4( b2 );
        if ( b2.text != nullptr )
            System::Console::WriteLine( b2.text ); // ※
    
        return 0;
    }
    Barが参照型のクラス(refクラス)である場合は % をつけなくても設定されます。(C言語のポインタと同様)
    (大抵のクラスは refクラスですので、普通はつけないでいけます)
    つまり、下のコードは % をつけてもつけなくても結果は同じ。
    public ref struct Foo { System::String^ text; };
    
    void test1( Foo^ f )
    {
        f->text = L"test1";
    }
    
    void test2( Foo^% f )
    {
        f->text = L"test2";
    }
    
    int main( void )
    {
        Foo ^f1 = nullptr, ^f2 = nullptr;
    
        f1 = gcnew Foo();
        f2 = gcnew Foo();
    
        test1( f1 );
        if ( f1->text != nullptr )
            System::Console::WriteLine( f1->text );
        test2( f2 );
        if ( f2->text != nullptr )
            System::Console::WriteLine( f2->text );
    
        return 0;
    }
    2006年10月12日 14:21