// 2年以上前のソースなので、今以上にくソースです...orz
環境:VS.NET2003(C#,WINAP)+SQLServer2000
▼DB→XML
・DataSet.WriteXml
DataSetからXMLデータを書き込む。
このメソッドを走らせる前に、以下の処理が必要になる。
→FileStream(ファイルパス,ファイルの書き込み方法)
→XmlTextWriter(上記で生成したオブジェクト名,エンコードの種類)
―Source_Start――――――――――――――――――――――――――――――――――――――
private void btn2_Click(object sender, System.EventArgs e) {
//XMLデータ生成処理
selSaveFile.Filter = "XML files (*.xml)|*.xml|All files (*.*)|*.*" ;
if(selSaveFile.ShowDialog() == DialogResult.OK) {
SqlConnection con =
new SqlConnection("User ID=***;password=***;Initial Catalog=***;Data Source=(local)");
SqlDataAdapter adp = new SqlDataAdapter();
DataSet ds = new DataSet();
System.IO.FileStream myFileStream = new System.IO.FileStream
(selSaveFile.FileName,System.IO.FileMode.Create);
System.Xml.XmlTextWriter MyXmlTextWriter = new System.Xml.XmlTextWriter
(myFileStream, System.Text.Encoding.Unicode);
try {
adp.SelectCommand = new SqlCommand("SelectAllTable", con);
adp.SelectCommand.CommandType = CommandType.StoredProcedure;
adp.Fill(ds);
ds.WriteXml(MyXmlTextWriter, XmlWriteMode.IgnoreSchema);
MessageBox.Show("保存しました。\n" + selSaveFile.FileName);
}
catch (System.Exception ex) {
MessageBox.Show(ex.ToString());
}
finally {
MyXmlTextWriter.Close();
myFileStream.Close();
con.Close();
}
}
}
―Source_End―――――――――――――――――――――――――――――――――――――――
※selSaveFileはSystem.Windows.Forms.SaveFileDialog
―StoredProcedure_Start――――――――――――――――――――――――――――――――――
CREATE PROCEDURE SelectAllTable AS
Select * From テーブル名1
Select * From テーブル名2
Select * From テーブル名3
GO
―StoredProcedure_End―――――――――――――――――――――――――――――――――――
ただし、複数テーブルを一度にDataSetに落とすと
テーブル名が「Table、Table1、Table2・・・」で生成されてしまう。
・FORXML(SQLServer2000で使用可能)
SELECTで指定したテーブル名にしたいので、WriteXmlは諦めて
FORXMLでXML化したテーブルデータをファイルストリームで落とすことにした。
SELECT * FROM テーブル名 FORXML AUTO/RAW/EXPLICIT [,オプション]
―Source_Start――――――――――――――――――――――――――――――――――――――
private void btn2_Click(object sender, System.EventArgs e) {
//XMLデータ生成処理
selSaveFile.Filter = "XML files (*.xml)|*.xml|All files (*.*)|*.*" ;
if(selSaveFile.ShowDialog() == DialogResult.OK) {
string strCon =
"Provider=SQLOLEDB;Server=(local);database=***;" +
"Integrated Security=SSPI;Trusted_Connection=Yes;";
SqlXmlCommand cmd = new SqlXmlCommand(strCon);
FileStream f = new FileStream(@"c:\products.xml",FileMode.Create);
try{
cmd.RootTag="Hogehoge";
cmd.CommandText= "EXEC SelectAllTable";
cmd.ClientSideXml = true;
cmd.ExecuteToStream(f);
MessageBox.Show("保存しました。\n" + selSaveFile.FileName);
}
finally {
f.Close();
}
}
}
―Source_End―――――――――――――――――――――――――――――――――――――――
―StoredProcedure_Start――――――――――――――――――――――――――――――――――
CREATE PROCEDURE SelectAllTable AS
Select * From テーブル名1 FOR XML AUTO,ELEMENTS
Select * From テーブル名2 FOR XML AUTO,ELEMENTS
Select * From テーブル名3 FOR XML AUTO,ELEMENTS
GO
―StoredProcedure_End―――――――――――――――――――――――――――――――――――
▼XML→DB
・OPENXML(SQLServer2000で使用可能)
SELECT * FROM テーブル名
OPENXML(ドキュメントハンドル, Xpath式, [1/2/8]) WITH スキーマ
ストアドプロシージャで実行。
―StoredProcedure_Start――――――――――――――――――――――――――――――――――
CREATE PROC InsData @doc text
AS
DECLARE @idoc int
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
INSERT INTO テーブル名1
SELECT * FROM
OPENXML(@idoc, '/root/テーブル名1', 2) WITH テーブル名1
INSERT INTO [テーブル名2]
SELECT * FROM
OPENXML(@idoc, '/root/テーブル名2', 2) WITH テーブル名2
INSERT INTO [テーブル名3]
SELECT * FROM
OPENXML(@idoc, '/root/テーブル名3', 2) WITH テーブル名3
EXEC sp_xml_removedocument @idoc
GO
―StoredProcedure_End―――――――――――――――――――――――――――――――――――
*全角文字、半角カナ入力で解析エラー
サーバー : メッセージ 6603、レベル 16、状態 1、
プロシージャ sp_xml_preparedocument、行 16
XML 解析エラー: テキストの内容に無効な文字が見つかりました。
→SP入れてないから?→入れても変わらなかった
→OPENXMLのXPathとXMLの要素名が異なっていただけ^^;
*修正後、再度実行したらまた解析エラー
XML 解析エラー: 終了タグ "テーブル名" が開始タグ "カラム名" と一致していません。
→文字化けしていたのが原因。
*エンコードをかけたら、また「テキストの内容に無効な~」
の解析エラーが出た。
→文字コードが"utf-8"だから、全角等は解析してもらえない?
*XMLデータ生成時に
cmd.OutputEncoding = "Shift_JIS";
を追加するとXML文書には
<?xml version="1.0" encoding="Shift_JIS" ?>
で書き込まれる。(指定しないとutf-8)
これをOPENXMLで解析したら、
全角文字、半角カナが含まれていてもXMLデータが
各テーブルに追加されていたことを確認した。
以上の方法でテーブルデータの受け渡しが実現できますた。