サンプル7

TCPソケット通信でひかり電話CTI(CTIサーバー)にアクセスし、顧客情報を1件変更するc#サンプルです。(発行するSQL文が複数行に改行している場合 or かなり長い場合。)

<サンプルプログラム c#>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HikariCTI_Sample_007
{
    class Program
    {
        static void Main(string[] args)
        {
            //SQL文
            string sendMsg = "[SQL_NON_QUERY_START]"
                               + "UPDATE m_kokyaku SET" + "\r\n"
                               + "corp_name = 'アグリモ'," + "\r\n"
                               + "busyo = 'IT事業部'" + "\r\n"
                               + "WHERE id = 5"
                           + "[SQL_NON_QUERY_END]";

            //サーバーのIPアドレス(または、ホスト名)とポート番号
            string ipOrHost = "192.168.24.9";
            int port = 3000;

            //TcpClientを作成し、サーバーと接続する
            System.Net.Sockets.TcpClient tcp =
                new System.Net.Sockets.TcpClient(ipOrHost, port);
            Console.WriteLine("サーバー({0}:{1})と接続しました({2}:{3})。",
                ((System.Net.IPEndPoint)tcp.Client.RemoteEndPoint).Address,
                ((System.Net.IPEndPoint)tcp.Client.RemoteEndPoint).Port,
                ((System.Net.IPEndPoint)tcp.Client.LocalEndPoint).Address,
                ((System.Net.IPEndPoint)tcp.Client.LocalEndPoint).Port);

            //NetworkStreamを取得する
            System.Net.Sockets.NetworkStream ns = tcp.GetStream();

            //読み取り、書き込みのタイムアウトを10秒にする
            //デフォルトはInfiniteで、タイムアウトしない
            //(.NET Framework 2.0以上が必要)
            ns.ReadTimeout = 10000;
            ns.WriteTimeout = 10000;

            //サーバーにデータを送信する
            //文字列をByte型配列に変換

            //エンコーディングは、SJIS
            System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift-jis");

            byte[] sendBytes = enc.GetBytes(sendMsg + '\n');
            //データを送信する
            ns.Write(sendBytes, 0, sendBytes.Length);
            Console.WriteLine(sendMsg);

            for(;;)
            {
                //サーバーから送られたデータを受信する
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                byte[] resBytes = new byte[256];
                int resSize = 0;
                do
                {
                    //データの一部を受信する
                    resSize = ns.Read(resBytes, 0, resBytes.Length);
                    //Readが0を返した時はサーバーが切断したと判断
                    if (resSize == 0)
                    {
                        Console.WriteLine("サーバーが切断しました。");
                        break;
                    }
                    //受信したデータを蓄積する
                    ms.Write(resBytes, 0, resSize);
                    //まだ読み取れるデータがあるか、データの最後が\nでない時は、
                    // 受信を続ける
                } while (ns.DataAvailable || resBytes[resSize - 1] != '\n');
                //受信したデータを文字列に変換
                string resMsg = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length);
                ms.Close();
                //末尾の\nを削除
                resMsg = resMsg.TrimEnd('\n');
                Console.WriteLine(resMsg);

                if(resMsg.IndexOf("[SQL_RESULT]") >= 0)
                {
                    break;
                }
            }

            //閉じる
            ns.Close();
            tcp.Close();
            Console.WriteLine("切断しました。");

            Console.ReadLine();
        }
    }
}

 

<サンプル画面 : 顧客情報を変更>

上の例では、顧客ID=5の会社名と部署を変更しています。

「[SQL_RESULT](○ 件処理されました)」が受信されます。

 

<テーブルレイアウト>

テーブル定義書(顧客情報マスター)