Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9293

C#アプリケーションからPHP経由でデータベースにデータを一括登録する方法

$
0
0

背景

従来Excelで管理していたデータをデータベース管理に移行したいと思い、いろいろと調べていたのですが、WindowsアプリケーションからWeb系へアクセスするような事をされている方が少ないのか、なかなか情報が見つかりませんでした。
Excelから直接MySQLへのアクセスも検討したのですが、Excelからだと使用者のPCにODBCドライバのインストールが必要になり、PC毎にインストールをしてもらうのは大変なので、ODBCに頼らないデータ転送手法を模索しました。

構成

元々Excelの帳票とそれをVBAのマクロでかき集めたシートで構成していたものを、Excelの帳票を読み込み、Web経由でデータベースへ流し込むという構成を検討しました。
Excelに限らず様々なデータを転送できるようにするため、帳票の読み込みはC#のアプリケーションによって作成することにしました。
また、登録するデータは複数のレコードを一括登録するために、構造体渡しのような形をとりたく、流行りのJSONフォーマットを使用。
データの受け渡しイメージは次の通りです。
C#アプリケーション> PHPページ> SQLデータベース

サンプルコード

送信するデータ

一括送信に使いたいデータ内容は次の通り。
元々はPOSTにてデータを渡す予定であったため、rootという頭のデータを作り、その中に実際に使用するデータを入れていますが、後述のPHP側の呼び出しでは平のデータでも大丈夫なのかもしれません。

data.json
{"root":[{"data1":100,"data2":"sample"}]}

送り側処理

JSONデータを生成し、送信するためのコードです。
予めJSONで渡したいデータと同じ構造を定義し、構造体のようにセットすることでやりとりが簡単になります。
下記サンプルでは前述のように一旦rootという親を設けている関係で、データのセットはDataクラスで直接作成し、後でDataContainerにセットする形をとっています。
送信について、WebRequestで指定するデータの送り先は、受信処理を記述した自作のページregist.php(後述)となります。
URLについてはphpコードの設置先の環境に合わせて変更してください。

sender.cs
// ===========================// データ定義// ===========================[DataContract]publicclassDataContainer{[DataMember]publicDataroot{get;set;}}[DataContract]publicclassData{[DataMember]publicintdata1{get;set;}[DataMember]publicstringdata2{get;set;}}// ===========================// 送信処理// ===========================privatevoidProc(){// データの生成(実際にはフォームや帳票データからの転記)Data_data=newData();_data.data1=100;// 数値データ_data.data2="sample";// 文字列データ// 送信データの生成(JSONコードへの変換)DataContainer_container=newDataContainer();_container.root=_data;var_serializer=newDataContractJsonSerializer(typeof(DataContainer));MemoryStream_stream=newMemoryStream();_serializer.WriteObject(_stream,_container);string_param=Encoding.UTF8.GetString(_stream.ToArray());byte[]_postData=Encoding.UTF8.GetBytes(_param);// 送信準備System.Net.WebRequest_req=System.Net.WebRequest.Create("http://sample.com/regist.php");_req.Method="POST";_req.ContentType="application/json";_req.ContentLength=_postData.Length;// 送信データの書き込みusing(Stream_reqStream=_req.GetRequestStream()){_reqStream.Write(_postData,0,_postData.Length);_reqStream.Close();}// 送信及び結果応答確認using(WebResponse_response=req.GetResponse()){switch(((HttpWebResponse)_response).StatusCode){caseHttpStatusCode.OK:// OK時の処理break;default:// その他の処理break;}}}

受信側処理

通常POSTによって渡されたデータは$_POSTによって受信しますが、JSON形式についてはうまく受信できないため、file_get_contentsを使用します。
受信後のデータをjson_decodeによって連想配列に格納し利用します。

regist.php
// 送信されたデータを一括受信する$json=file_get_contents("php://input");// 送られたデータをJSON形式として認識し、連想配列に格納$inputs=json_decode($json,true);// データ登録$sql="insert into db_name ( data1, data2 ) values (".$inputs['root']['data1'].", \"".$inputs['root']['data2']."\")";// SQLによるデータベースへの登録// Query($sql);// 応答http_response_code(200);// OK

何かのお役に立てば幸いです。

参考サイト


Viewing all articles
Browse latest Browse all 9293

Trending Articles