質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

6849閲覧

C# DataSet.ReadXml() するデータの、一部の列の型を指定する方法について

siruku6

総合スコア1382

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

1クリップ

投稿2015/10/27 02:11

###前提・実現したいこと

C# .Net の FormApllication で、Xmlファイルを読み込んでデータセットに復元させようとしています。

復元する際に、データセット内の特定テーブルの特定列のデータ型(DataType)のみをint型にしたいのですが、どうすればいいかわかりません。全部string型になってしまいます。

###発生している問題・エラーメッセージ

「データを指定した後に DataType を変更することはできません。」

###ソースコード
C#

public static DataSet dataSet { get; set; }
public static void OpenFile(string fileFullPass)
{
if (dataSet == null)
{
dataSet = new DataSet();
}
else if (dataSet.Tables != null)
{
dataSet.Tables.Clear();
}
dataSet.ReadXml(fileFullPass);
for(int i = 1; i < dataSet.Tables.Count; i++){
dataSet.Tables[i].Columns[3].DataType = typeof(int); ← ここでエラー発生
}
}
}

読み込ませたファイルは以下のようなものです。
ちなみに、int型にしたいのは"cost"の項目です。

<?xml version="1.0" standalone="yes"?> <NewDataSet> <property> ← Tables[0] <activeFilePass> ・・・ </activeFilePass> <firstYear>0</firstYear> </property> <_x0032_01510> ← ここからTables[1] <date>2015/09/24</date> <group>食費</group> <itemName>ガリガリ君</itemName> <cost>60</cost> <remark /> </_x0032_01510> <_x0032_01510> <date>2015/10/24</date> <group>食費</group> <itemName>ガリガリ君</itemName> <cost>60</cost> <remark /> </_x0032_01510> </NewDataSet>

###補足情報(言語/FW/ツール等のバージョンなど)
①なお、インターネットで検索した結果、次のような方法であれば実現できることはわかったのですが、行のコピー作業が無駄に感じたので、他の方法を希望しています。

1 あらかじめデータテーブルを作って、int型指定をしておく。
2 Xmlファイルから読み込んだデータを、「1」で作ったテーブルに1行ずつImportRow()メソッドでコピーする。

②DataTable の中に"SchemaSerializationMode"というプロパティがあることがわかったのですが、これを使ってできないでしょうか? 使い方がわかりません。

③Xmlファイル自体に何かを書き込む形で、「これはint型のデータだ」とプログラムにわからせるための記述方法があれば知りたいです。

長くなりましたが、ご教示いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ちゃんとするならXML Schema側で処理するとか..

DataTable t = new DataTable();
t.ReadXmlSchema(@"FullPath\schema.xml");
t.ReadXml(@"FullPath\data.xml");

投稿2015/10/27 03:22

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siruku6

2015/10/27 04:10

 お二人の両方ともほぼベストアンサーにしたかったのですが、今回作っていたのは素人さん用のソフトだったので、データファイルが二つあると間違って片方消されてしまったり・・・ということが心配なので、今回は、一つのファイルにまとめられるTak1waさんの方式を採用させていただきました。  ただ、今後の開発でdojikkoさんの方法も使っていきたいと思っています!  ありがとうございました!!
guest

0

ベストアンサー

こんにちは。

③に関して、XML上にスキーマ情報を吐き出すことが出来ます。
このXMLをデータセットにReadXMLしてやれば良いです。

XML

1<?xml version="1.0" standalone="yes"?> 2<ds_name> 3 <xs:schema id="ds_name" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 4 <xs:element name="ds_name" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 5 <xs:complexType> 6 <xs:choice minOccurs="0" maxOccurs="unbounded"> 7 <xs:element name="dt_name"> 8 <xs:complexType> 9 <xs:sequence> 10 <xs:element name="string_col" type="xs:string" minOccurs="0" /> 11 <xs:element name="int_col" type="xs:int" minOccurs="0" /> 12 </xs:sequence> 13 </xs:complexType> 14 </xs:element> 15 </xs:choice> 16 </xs:complexType> 17 </xs:element> 18 </xs:schema> 19 <dt_name> 20 <string_col>hoge1</string_col> 21 <int_col>1</int_col> 22 </dt_name> 23 <dt_name> 24 <string_col>hoge2</string_col> 25 <int_col>2</int_col> 26 </dt_name> 27 <dt_name> 28 <string_col>hoge3</string_col> 29 <int_col>3</int_col> 30 </dt_name> 31</ds_name>

スキーマ定義の詳細は調べたことないですけど、以下のようにWriteXMLすることで同じ内容のものが出力できるはず。

C#

1ds.WriteXml(filePath, XmlWriteMode.WriteSchema);

投稿2015/10/27 02:38

編集2015/10/27 02:40
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siruku6

2015/10/27 04:12

たった1行で実現できたなんて・・・私の調査不足にもかかわらず、具体的で丁寧な回答ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問