C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ストアアプリ開発


(過去ログ 128 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■76163 / inTopicNo.1)  ストアアプリ開発でDataTable,DataRowの自作
  
□投稿者/ 困り人 (1回)-(2015/06/04(Thu) 19:53:06)

分類:[.NET 全般] 

はじめまして、この度システムの改修業務に当たり、タブレット(ストアアプリ版.NET)にて
C#開発を行う事になったのですが、既存システム(VB.NET)の流用できる箇所については
そのまま流用する(ロジックのみ)というような要件を受けております。

環境はWin8.1、VS2013Pro,SQLiteなどです。

当方デスクトップ版.NETでの開発経験はあるのですが、ストアアプリでの
開発は初めてであります。

いざ作業を始めようとした所、System.Data.dll関係のものが利用出来なかったり
色々制約がある事に驚きを隠せません。

残念な事に、既存システムでDataTableやDataRowなどを大量に利用しており
代替案で乗り切ることが出来ない状態になった為、仕方がなく自前で実装する方向で
話がまとまってしまいました。

実装に関しては基本的なプロパティやメソッドのみを実装したいと考えておりますが、
フレームワーク開発のような事は経験がなく、どのようにすれば良いのかわかりません。

現在最低限必要なものとして
DataTable/Rowsプロパティなど
DataRow/rowState/設定・変更の仕組み/値へのアクセス方法など
DataRowCollection/AddやRemoveメソッドなど
あとはカラム系ですが、こちらはひとまず置いておきます。
などがあります。

今回、疑似的に作成するにあたりDictionaryなどを利用して頑張ろうとしたのですが、
何をどうすれば良いのかわからずにいます。

参考にもならないと思ますが、私が書いているコードを添付させて頂き
どうすれば実用に耐えうるものにできるかなどご意見を頂けないでしょうか?

サンプル

[DataRow.cs]
/// <summary>
/// DataRowクラス(擬似的)
/// </summary>
public class DataRow
{
/// <summary>
/// データ保存用メモリ領域
/// </summary>
private Dictionary<string, Object> Table = new Dictionary<string, Object>();

/// <summary>
/// コンストラクタ
/// </summary>
public DataRow()
{
Table = new Dictionary<string, Object>();
this.RowState = DataRowState.Detached;
}

#region アクセサー
/// <summary>
/// インデックス用アクセサー
/// </summary>
/// <param name="columnIndex">カラムのインデックス</param>
/// <returns>値</returns>
public Object this[int columnIndex]
{
get
{
Object result = null;

int count = 0;
foreach (var row in Table)
{
if (count < columnIndex)
{
count++;
continue;
}

result = row.Value;
break;
}
return result;
}
set
{
Table.Add(columnIndex.ToString(), value);
this.RowState = DataRowState.Modified;
columnIndex = Table.Count;
}
}

/// <summary>
/// カラム名用アクセサー
/// </summary>
/// <param name="columnName">カラム名</param>
/// <returns>値</returns>
public Object this[string columnName]
{
get
{
Object result = null;

if (Table.ContainsKey(columnName))
{
result = Table[columnName];
}

return result;
}
set
{
Table.Add(columnName, value);
this.RowState = DataRowState.Modified;
columnName = value.ToString();
}
}
#endregion

#region rowState
/// <summary>
/// rowState変更用
/// </summary>
private DataRowState rowState;

public DataRowState RowState
{
get { return rowState; }
set { rowState = value; }
}

//[FlagsAttribute]
public enum DataRowState
{
Added,
Deleted,
Modified,
Detached,
Unchanged
};
#endregion
}




[DataTable.cs]
public class DataTable
{
public DataRow NewRow()
{
DataRow dr = new DataRow();
return dr;
}

private DataRowCollection rows = new DataRowCollection();

public DataRowCollection Rows
{
get { return rows; }
}

public class Columns
{
public void Add(DataRow dr)
{

}

}
}




[DataRowCollection.cs]
public class DataRowCollection : System.Collections.IEnumerable
{
public Dictionary<string, DataRow> list = new Dictionary<string, DataRow>();

public void Add(DataRow dr)
{
list.Add(list.Count.ToString(), dr);
}

public System.Collections.IEnumerator GetEnumerator()
{
return list.GetEnumerator();
}
}



[MainPage.cs] //これはストアアプリのLoadイベント内のつもりで利用しています。
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();

DataTable dt = new DataTable();

DataRow dr = dt.NewRow();

// 値を入れてみる
// 基本的にキーは文字列のみとして扱う事で良い仕様なので
// dr[2]と記述した場合は、"2"というキーでの扱いになる
dr["a"] = 0;
dr["b"] = "string";
dr["3"] = 123;
dr[2] = "string123";

// 値を確認してみる
string a = dr["a"].ToString();
string b = dr[1].ToString();
string c = dr["3"].ToString();
string d = dr[3].ToString();

dt.Rows.Add(dr);

// 型が違うのでエラーとなる Varで受ければいいのだが、
// 既存システムでは通用しないので困ってます
foreach (DataRow dr2 in dt.Rows)
{

}
}
}
引用返信 編集キー/
■76164 / inTopicNo.2)  Re[1]: ストアアプリ開発でDataTable,DataRowの自作
□投稿者/ 魔界の仮面弁士 (375回)-(2015/06/04(Thu) 21:34:06)
No76163 (困り人 さん) に返信
> そのまま流用する(ロジックのみ)というような要件を受けております。
ロジックの単純流用は危険な気がするのですが、
第三者がとやかく言う話でも無いので、それは置いといて:


> どのようにすれば良いのかわかりません。
とりあえず、本物の実装を眺めてみるとか。
http://referencesource.microsoft.com/


> /// カラム名用アクセサー
アクセサーではなく、インデクサーでは無いでしょうか。
アクセサーというのは、プロパティやインデクサーの get および set の部分のことですよね。


>   if (Table.ContainsKey(columnName))
本物の DataRow の場合、存在しない列名を指定すれば、例外が発生しますよね。

今回作りこんでいるのは、アプリ側ではなく、ライブラリ側のはずです。
誤った columnName を指定するのは、ライブラリ側の責任ではなく、
呼び出したアプリケーション側の責任です。

ですからライブラリとしては、それを引数例外(ArgumentOutOfRangeException)として
throw するべきでしょう。(あるいはそのまま、KeyNotFoundException を発生させるとか)


アプリ側は、ユーザーに例外を見せないように作りこむことが肝心ですが、
それはライブラリ作成時には当てはまりません。

たとえば、列名の指定ミスを下手に握りつぶしてしまうと、
"UserForm" と "UserFrom" の誤記を見逃すなどして、
余計に問題を複雑化させてしまいます。

呼びだし側のミスを、ライブラリ側で隠してしまうのは、
バグの発見を遅らせる要因になりえます。



> // dr[2]と記述した場合は、"2"というキーでの扱いになる
今の実装はそうなっておらず、dr["2"] と dr[2] が別物となりますね。

コメントを信じるのであれば、this[int columnIndex] の実装は、
 get { return this[columnIndex.ToString()]; }
となるのでは無いでしょうか。(コメントの方が間違っている可能性もありますが)



> // 型が違うのでエラーとなる Varで受ければいいのだが、
Var ではなく
var ですね。


> // 既存システムでは通用しないので困ってます
> foreach (DataRow dr2 in dt.Rows)
DataRowCollection の GetEnumerator() において、
Dictionary<string, DataRow> の GetEnumerator() を
返させているため、DataRow ではなく、
KeyValuePair<string, DataRow> になってしまっています。

今回の場合、DataRowCollection を
 public System.Collections.IEnumerator GetEnumerator()
 {
   //return list.GetEnumerator();
   return list.Values.GetEnumerator();
 }
のようにすれば、列挙されてくるオブジェクトが
KeyValuePair<string, DataRow> ではなく DataRow になります。


ただ、そもそも Dictionary で管理している理由は何でしょうか?

DataRow 内のコレクションは、Dictionary<列名, 値> 型で良いと思いますが、
DataRowCollection については Dictionary<string, DataRow> ではなく、
List<DataRow> で良いと思うので、ちょっと気になりました。


ついでに言うと、列挙子を実装するのであれば、IEnumerable よりも
IEnumerable<DataRow> を実装させた方が、利用しやすいと思いますよ。
引用返信 編集キー/
■76165 / inTopicNo.3)  Re[2]: ストアアプリ開発
□投稿者/ Azulean (490回)-(2015/06/04(Thu) 22:50:32)
2015/06/04(Thu) 22:51:20 編集(投稿者)

> とりあえず、本物の実装を眺めてみるとか。
> http://referencesource.microsoft.com/

ここを見るときはきちんとライセンスも見ておいていただくよう、念のために注記しておきます。

http://referencesource.microsoft.com/license.html

> "Reference use" means use of the software within your company as a reference, in read only form, for the sole purposes of debugging your products, maintaining your products, or enhancing the interoperability of your products with the software, and specifically excludes the right to distribute the software outside of your company.

デバッグであるとか、保守であるとか、ソフトウェアとの相互運用性を高めるとか、利用目的の制限されたソースコードです。
このソースコードを下に、似たようなものを作るために提供されているものではないのでご注意を。
引用返信 編集キー/
■76166 / inTopicNo.4)  Re[3]: ストアアプリ開発
□投稿者/ 困り人 (3回)-(2015/06/05(Fri) 08:06:19)
魔界の仮面弁士様
Azulean様

ご返信頂き有難う御座います。

拙いソースコードで恥ずかしい限りですが、ご指摘を頂けて大変嬉しく思います。
言い回しや、私の理解不足にてトップコメント内の内容で余計な混乱をさせてしまいました...
申し訳ありません。

概ね魔界の仮面弁士様がご理解された通りだと、変な話、書いた本人も思います。
#このプロジェクト参画約4日目な為、私自信もあまり仕様等理解していませんでした。恥ずかしい...

参考になりそうなリファレンスの提示までして頂き、有難う御座います!!
朝一でチェックさせて頂きましたが、Dataホゲホゲ関係をそのまま実装するのは
単に利用しないプロパティやメソッドを削って利用というのは私の技術では難しそうです。

一応本日中に仲間内でDataTableやDataRowを提供しなければならず(開発中手直しなどは想定していますが...)
リファレンスの読み込みは流す程度になってしまいますが、後学の為、利用させて頂きます。

Azulean様のコメントも有難う御座います。
言い方は悪いですが時間が無い為、丸々コピーで動くものだ!!!!
と思ってしまいました。
#度重なる恥を晒してしまい申し訳ありません^^;

頂いたコメントについて、私の方で確かめれていない事が多くありますので
もうしばらくは助言を受けたいと考えております。

大変自分勝手な理由ではありますが、解決済みはもう少し先にさせて下さい。


引用返信 編集キー/
■76175 / inTopicNo.5)  Re[4]: ストアアプリ開発
□投稿者/ 困り人 (4回)-(2015/06/05(Fri) 14:33:33)
魔界の仮面弁士様
Azulean様

出社後に確認をさせて頂きました。
ご指摘頂いた箇所などを一通り手直しを行い基本的な動作の担保が取れました!!
大変助かりました^^

この場を借りてお礼申し上げます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -