背景
従来Excelで管理していたデータをデータベース管理に移行したいと思い、いろいろと調べていたのですが、WindowsアプリケーションからWeb系へアクセスするような事をされている方が少ないのか、なかなか情報が見つかりませんでした。
Excelから直接MySQLへのアクセスも検討したのですが、Excelからだと使用者のPCにODBCドライバのインストールが必要になり、PC毎にインストールをしてもらうのは大変なので、ODBCに頼らないデータ転送手法を模索しました。
構成
元々Excelの帳票とそれをVBAのマクロでかき集めたシートで構成していたものを、Excelの帳票を読み込み、Web経由でデータベースへ流し込むという構成を検討しました。
Excelに限らず様々なデータを転送できるようにするため、帳票の読み込みはC#のアプリケーションによって作成することにしました。
また、登録するデータは複数のレコードを一括登録するために、構造体渡しのような形をとりたく、流行りのJSONフォーマットを使用。
データの受け渡しイメージは次の通りです。
C#アプリケーション> PHPページ> SQLデータベース
サンプルコード
送信するデータ
一括送信に使いたいデータ内容は次の通り。
元々はPOSTにてデータを渡す予定であったため、rootという頭のデータを作り、その中に実際に使用するデータを入れていますが、後述のPHP側の呼び出しでは平のデータでも大丈夫なのかもしれません。
{"root":[{"data1":100,"data2":"sample"}]}
送り側処理
JSONデータを生成し、送信するためのコードです。
予めJSONで渡したいデータと同じ構造を定義し、構造体のようにセットすることでやりとりが簡単になります。
下記サンプルでは前述のように一旦rootという親を設けている関係で、データのセットはData
クラスで直接作成し、後でDataContainer
にセットする形をとっています。
送信について、WebRequest
で指定するデータの送り先は、受信処理を記述した自作のページregist.php(後述)となります。
URLについてはphpコードの設置先の環境に合わせて変更してください。
// ===========================// データ定義// ===========================[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
によって連想配列に格納し利用します。
// 送信されたデータを一括受信する$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
何かのお役に立てば幸いです。