1

我有一个带有一个网页的 Asp.Net 网站,其唯一目的是以查询字符串的形式接收数据,然后根据需要将其分开并将这些数据存储到数据库中。

该数据来自多个车辆跟踪系统。每辆车每 30 秒发送一串数据作为查询字符串。

我在我的网页中编写了这样的代码,当网页被访问时,在页面加载中,我读取查询字符串并对数据库执行插入操作。像这样的东西-

protected void Page_Load(object sender, EventArgs e)
{
    con.Open();
    string input = Request.QueryString["vinput"];
    var m = Regex.Match(input, @"~(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@");
    if (m.Success)
    {
        string[] vals = new string[20];
        int j = 1;
        for (int i = 0; i < 20; i++)
        {
            vals[i] = m.Groups[j].Value;
            j++;
        }
        cmd.CommandText = "insert into tracking (vehicle_no,hardware_id,lat,lng,speed,direction,an0,an1,an2,an3,di0,di1,di2,di3,do0,do1,do2,do3,tdate,ttime) values('" + vals[0] + "','" + vals[1] + "','" + vals[2] + "','" + vals[3] + "','" + vals[4] + "','" + vals[5] + "','" + vals[6] + "','" + vals[7] + "','" + vals[8] + "','" + vals[9] + "','" + vals[10] + "','" + vals[11] + "','" + vals[12] + "','" + vals[13] + "','" + vals[14] + "','" + vals[15] + "','" + vals[16] + "','" + vals[17] + "','" + vals[18] + "','" + vals[19] + "')";
        cmd.Connection = con;
        cmd.ExecuteNonQuery();
    }
}

我创建了一个模拟器应用程序来测试这个站点来代替车辆跟踪系统。当有来自一到三个模拟器实例的数据时,此站点工作正常,但当超过 3 个模拟器实例同时发送数据时(大约)无法将数据保存到数据库。

例如,我要发送 5 条记录,每次从模拟器发送一条记录,并有 6 个这样的模拟器实例向页面发送数据。在数据库的最后,我看到只插入了 15 条记录,而不是 30 条记录。顺便说一下,这个网站在IIS 5.1中运行。

我该如何处理这个问题?请提出建议。


更新:终于找到了问题。经过大量谷歌搜索后找到了这个链接这个。它与服务器有关,因为在 windows xp IIS 中基本/启动器的请求限制仅为 3。

4

2 回答 2

1

当您可以使用重量较轻的东西(例如处理程序)时,使用 Page 毫无意义。您可以切换一些东西,但这不是一个繁重的操作。这是一种非常理想的方法,有一个例外,那就是创建一个存储过程,而不是从字符串生成插入语句:

public class htest : System.Web.IHttpHandler
{
    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(System.Web.HttpContext context)
    {
        System.Web.HttpRequest Request = context.Request;
        Match m = Regex.Match(Request.QueryString["vinput"], @"~(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@");
        if (m.Success)
        {
            using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection())
            {
                try
                {
                    con.Open();
                    System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("command", con);
                    string[] vals = new string[20];
                    int j = 1;
                    for (int i = 0; i < 20; i++)
                    {
                        vals[i] = m.Groups[j].Value;
                        j++;
                    }
                    cmd.CommandText = "insert into tracking (vehicle_no,hardware_id,lat,lng,speed,direction,an0,an1,an2,an3,di0,di1,di2,di3,do0,do1,do2,do3,tdate,ttime) values('" + vals[0] + "','" + vals[1] + "','" + vals[2] + "','" + vals[3] + "','" + vals[4] + "','" + vals[5] + "','" + vals[6] + "','" + vals[7] + "','" + vals[8] + "','" + vals[9] + "','" + vals[10] + "','" + vals[11] + "','" + vals[12] + "','" + vals[13] + "','" + vals[14] + "','" + vals[15] + "','" + vals[16] + "','" + vals[17] + "','" + vals[18] + "','" + vals[19] + "')";
                    cmd.Connection = con;
                    cmd.ExecuteNonQuery();
                }
                catch
                {
                   //At least do some type of logging in this event.
                }
                finally
                {
                    con.Close();
                }
            }
        }
        context.Response.ContentType = "text/plain";
        context.Response.Write("Success");
    }
}

显然,您可以使用一些布尔值来确定最后写回客户端的内容。

于 2012-10-01T06:36:49.067 回答
0

几个建议。。

您正在打开连接。请在底部关闭它。也处理 cmd 对象。

将您的 INSERT 语句放入 SQL 事务中

使用 try 和 Catch(使用 Catch 子句将错误消息存储到 Database 中,ex.message 返回错误详细信息。)

于 2012-10-01T06:31:42.447 回答