打开/关闭IVR系统的apsx页面中的数据库连接

本文关键字:数据库连接 apsx 打开 关闭 IVR 系统 | 更新日期: 2023-09-27 17:59:24

我目前正在开发一个IVR系统,我的问题更多地是关于基本架构和打开/关闭数据库连接的开发方面。从下面的代码中可以看到,在page_load中,我打开一个连接,传递变量,然后关闭连接。我的问题在于,变量不是在页面加载期间设置的,而是在调用到来时设置的,即在布尔ParseXML部分中。我需要知道在页面加载期间打开连接的最佳方式是什么,在收集变量后传递变量,然后最终关闭连接。最重要的是,如何做到这一点,我尝试了几种不同的方法,但都没有成功。

我最初的想法过程和方法是拆分数据库连接代码,并将它们放在页面生命周期的不同部分。但我在准确地把它放在哪里方面没有取得任何成功

布尔解析,写入文本文件。但我希望它也能写入数据库。

<%@ Page Language="C#" aspcompat="true" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Web.SessionState" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="System.Web.UI.HtmlControls" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Data" %>

   <script language="C#" runat="server">

       Boolean ParseXML(string XMLContent)
       {
           try
           {
               XmlDocument doc = new XmlDocument();
               doc.LoadXml(XMLContent);
               String MenuID, Duration, CallerID, CallID, DateAndTime, VoiceFileName;
               XmlNode TempNode;
               Byte[] VoiceFile;
               XmlElement root = doc.DocumentElement;
               XmlAttributeCollection attrColl = root.Attributes;
               //parse inbound values
               MenuID = attrColl["menuid"].Value;
               Duration = attrColl["duration"].Value;
               CallID = attrColl["callid"].Value;
               CallerID = attrColl["callerid"].Value;
               //writed parsed values to file
               StreamWriter w = File.AppendText(Request.MapPath("summaryincall.txt"));
               w.Write(String.Format("'"{0:MM/dd/yyyy}'",'"{0:HH:mm:ss}'"", DateTime.Now));
               XmlNodeList NodeCount = doc.SelectNodes("/campaign/prompts/prompt");
               foreach (XmlNode node in NodeCount)
               {
                   attrColl = node.Attributes;
                  w.WriteLine("Prompt ID: " + attrColl["promptid"].Value);
                  w.WriteLine("Keypress : " + attrColl["keypress"].Value);
                  w.Write(attrColl["keypress"].Value);

                   if (node.HasChildNodes)
                   {
                       TempNode = node.FirstChild;
                       attrColl = TempNode.Attributes;
                       //convert file to binary
                       VoiceFile = System.Convert.FromBase64String(TempNode.InnerText);
                       VoiceFileName = attrColl["filename"].Value;
                       //save file in application path
                       FileStream fs = new FileStream(Request.MapPath(VoiceFileName), FileMode.OpenOrCreate);
                       BinaryWriter bw = new BinaryWriter(fs);
                       bw.Write((byte[])VoiceFile);
                       bw.Close();
                       fs.Close();
                       w.WriteLine("Filename : " + VoiceFileName);
                   }
               }

               w.Close();
               return true;
           }
           catch (Exception e)
           {
               Response.Write(e.Message);
               return false;
           }
       }

       void Page_Load(object sender, System.EventArgs e)
       {
           string connectionString = "server=abc;database=abc;uid=abc;pwd=1234";
           SqlConnection mySqlConnection = new SqlConnection(connectionString);
           string procedureString = "Call_Import";
           SqlCommand mySqlCommand = mySqlConnection.CreateCommand();
           mySqlCommand.CommandText = procedureString;
           mySqlCommand.CommandType = CommandType.StoredProcedure;
           mySqlCommand.Parameters.Add("@CDate", SqlDbType.DateTime).Value = DateTime.Now;
           mySqlCommand.Parameters.Add("@CTime", SqlDbType.DateTime).Value = DateTime.Now;
           mySqlCommand.Parameters.Add("@ID", SqlDbType.Int).Value = keypress;
           mySqlCommand.Parameters.Add("@CType", SqlDbType.Int).Value = CallID;
           mySqlConnection.Open();
           mySqlCommand.ExecuteNonQuery();
           SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter();
           mySqlDataAdapter.SelectCommand = mySqlCommand;
           mySqlConnection.Close();

           try
          {
             String xmlcontent, PostResponse, campaign;
             Byte[] Bindata = Request.BinaryRead(Request.TotalBytes);
             string XML;
             XML = System.Text.Encoding.ASCII.GetString(Bindata);
             StreamWriter w = File.AppendText(Request.MapPath("xmlsummaryincall.txt"));
             w.WriteLine("--- "  + DateTime.Now + " ------------------------------------------------------");
             w.WriteLine(XML.Replace("<?xml version='"1.0'"?>", ""));  //needed so ?xml tag will display as text
             w.WriteLine("");
             w.WriteLine("");          
             w.Close();
             if (!ParseXML(XML)) Response.Write("Failed");
           }
           catch (Exception error)
           {
             Response.Write(error.Message);
           }
       }
   </script>

打开/关闭IVR系统的apsx页面中的数据库连接

我假设在调用ParseXml方法之后使用SqlDataAdapter。尝试以下操作:

  • 为SqlConnection和SqlCommand声明一个字段
  • 在Page_Load中打开连接
  • 在ParseXml中设置命令参数
  • 关闭Page_Unload中的连接
<script language="C#" runat="server">
    private SqlConnection mySqlConnection;
    private SqlCommand mySqlCommand;
           
    Boolean ParseXml(string XMLContent){
        // Do other work
        mySqlCommand.Parameters["@CDate"].Value = DateTime.Now; 
        mySqlCommand.Parameters["@CTime"].Value = DateTime.Now; 
        mySqlCommand.Parameters["@ID"].Value = keypress; 
        mySqlCommand.Parameters["@CType"].Value = CallID; 
        // Do other work
    }
     void Page_Load(object sender, System.EventArgs e)
     {
        string connectionString = "server=abc;database=abc;uid=abc;pwd=1234"; 
        mySqlConnection = new SqlConnection(connectionString); 
        string procedureString = "Call_Import"; 
        mySqlCommand = mySqlConnection.CreateCommand(); 
        mySqlCommand.CommandText = procedureString; 
        mySqlCommand.CommandType = CommandType.StoredProcedure; 
        mySqlCommand.Parameters.Add(new SqlParameter("@CDate", SqlDbType.DateTime));
        mySqlCommand.Parameters.Add(new SqlParameter("@CTime", SqlDbType.DateTime));
        mySqlCommand.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int));
        mySqlCommand.Parameters.Add(new SqlParameter("@CType", SqlDbType.Int));
        mySqlConnection.Open(); 
        SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(); 
        mySqlDataAdapter.SelectCommand = mySqlCommand;
     }
     void Page_UnLoad(object sender, System.EventArgs e){
        if (mySqlConnection.State != ConnectionState.Closed)
            mySqlConnection.Close();
     }
</script>

这里有一个链接,可以帮助您了解ASP.NET页面的生命周期。

我没有太多IVR经验,但以下是它在我工作的一个系统(使用VXML)上的工作方式。

IVR接听了电话。这导致IVR语音浏览器向web服务器发出HTTP请求。

web服务器接收到请求以及端口号,以识别唯一的调用者。在我的案例中,我们使用的是输出VMXL(而不是HTML或XHTML)的标准ASPX页面,因此所有处理都必须在Page_Load方法中完成。如果页面需要有关呼叫的其他信息,例如呼叫者号码,我们会向IVR发出web服务呼叫,包括端口号。

所有用户与IVR的交互(按钮按下等)都在IVR上处理,只有当请求不同的VXML文档时,web服务器才会参与其中。