- PR -

C#にてオブジェクトの参照渡しが出来ないです。

投稿者投稿内容
とよはら
常連さん
会議室デビュー日: 2003/05/09
投稿数: 21
投稿日時: 2005-07-06 11:49
初めまして。

現在C#にて開発を行っているのですが、
以下の様にTableオブジェクトを参照渡ししても中身が渡す前と変わりません。
またC#はオブジェクト型は全て参照渡しとなると認識しております。
どなたか原因が判る方がおられましたら御指摘お願いします。

懸念点:呼び出し側と呼ばれる側はそれぞれ別のプロジェクト配下にしてあります。
    (ソリューションは同一です。)

<呼び出し側>
DataTable table = new DataTable();
eBiz_CommonComponent.DBManager obj = new DBManager();
obj.getDataTable("server=***;database=***;user id=***;password=***;packet size=4096",30,"SELECT * FROM trn_order_head",table);
-->ここの時点ではtableに値が入るはずなのですが・・・。

<呼ばれ側>
public class DBManager
{
public void getDataTable(string dbConnString,
int cmdTimeOut,
string sql,
System.Data.DataTable dataTable)
{
System.Data.SqlClient.SqlConnection sqlConn ;
System.Data.SqlClient.SqlDataAdapter sqlAdapter;
System.Data.DataSet ds;

try
{
sqlConn = new System.Data.SqlClient.SqlConnection(dbConnString);
sqlConn.Open();
sqlAdapter = new System.Data.SqlClient.SqlDataAdapter(sql,sqlConn);
ds = new System.Data.DataSet();
sqlAdapter.SelectCommand.CommandTimeout = cmdTimeOut;
sqlAdapter.Fill(ds);
sqlAdapter.Dispose();
sqlConn.Close();
if(ds.Tables.Count == 1)
{
dataTable = ds.Tables[0];
--->ここでは問題なく値が入っています。
}
else
{
throw new System.Exception("対象DataTableが一つではありません。");
}
}
catch(Exception e)
{
throw new System.Exception(e.ToString());
}
if(sqlConn != null)
{
if(sqlConn.State == ConnectionState.Open)
{
sqlConn.Close();
}
sqlConn = null;
}
if(sqlAdapter != null)
{
sqlAdapter.Dispose();
sqlAdapter = null;
}
if(ds != null)
{
ds.Dispose();
ds = null;
}
}
}
とよはら
常連さん
会議室デビュー日: 2003/05/09
投稿数: 21
投稿日時: 2005-07-06 12:09
すみません。
自己解決いたしました。
(C#初心者なので・・・。)

双方に「ref」修飾子と書き込むことで解決いたしました。

<呼び出し側>
obj.getDataTable("server=***;database=***;user id=***;password=***;packet size=4096",30,"SELECT * FROM trn_order_head",ref<space>table);

<呼ばれ側>
public class DBManager
{
public void getDataTable(string dbConnString,
int cmdTimeOut,
string sql,
ref<space>System.Data.DataTable dataTable)

117
ベテラン
会議室デビュー日: 2005/05/09
投稿数: 94
お住まい・勤務地: 大阪府
投稿日時: 2005-07-06 12:10
ref を指定してみてはいかが
_________________
# Future Is On Fire !
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-07-06 12:11
参照渡しが必要な場面とは思えませんけど...



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
餅宮餅吉
ベテラン
会議室デビュー日: 2005/03/04
投稿数: 57
お住まい・勤務地: 月餅のうまい店の隣
投稿日時: 2005-07-06 12:14
引用:

とよはらさんの書き込み (2005-07-06 11:49) より:
以下の様にTableオブジェクトを参照渡ししても中身が渡す前と変わりません。
またC#はオブジェクト型は全て参照渡しとなると認識しております。


パラメータは普通、値渡しだと思います。

解決方法
1.取得したDataTableの中身をパラメータのDataTableに追加する
2.パラメータのDataTableをrefにする
3.戻り値で、DataTableを返す

あと、finallyとか使ったほうが良いです。

#スペルミスです・・
[ メッセージ編集済み 編集者: 餅宮餅喜 編集日時 2005-07-06 12:15 ]


[ メッセージ編集済み 編集者: 餅宮餅喜 編集日時 2005-07-06 12:17 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-07-06 13:07
"値型-参照型"

"値渡し-参照渡し"
は全く関係ない概念ですので、区別されるとよろしいかと。
とよはら
常連さん
会議室デビュー日: 2003/05/09
投稿数: 21
投稿日時: 2005-07-06 13:41
>"値型-参照型" と "値渡し-参照渡し"

すみません。
ヘルプを読み直したところ勘違いに気づきました。
2つを混同しておりました。
御指摘ありがとうございます。


>パラメータは普通、値渡しだと思います。

今回の様にオブジェクトが大きくなる可能性がある場合は、
個人的にはメモリの確保のしかたからref のほうが良いと思っております。


みなさま御指摘ありがとうございます。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-07-06 13:46
引用:
とよはらさんの書き込み (2005-07-06 13:41) より:
>パラメータは普通、値渡しだと思います。

今回の様にオブジェクトが大きくなる可能性がある場合は、
個人的にはメモリの確保のしかたからref のほうが良いと思っております。


この例では、refにしたところで渡したDataTableインスタンスはそのまま破棄されるだけで、ただの無駄だと思いますが。
返値で返した方が単純にスマートだと思います。

スキルアップ/キャリアアップ(JOB@IT)