我有一个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 。
我该如何处理这个问题?建议请。
更新:终于找到了问题。经过大量的Google搜索后发现了link和this。它与服务器,因为Windows XP IIS中的基本/启动请求限制只有3。
答案 0 :(得分:1)
当你可以像处理程序一样使用更轻的重量时,使用Page是没有意义的。你可以切换一些东西,但这不是一个繁重的操作。这是一个非常优化的方法来做一个例外,那就是创建一个存储过程,而不是从字符串生成一个insert语句:
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");
}
}
显然,您可以使用一些布尔值来确定最后写回客户端的内容。
答案 1 :(得分:0)
几点建议..
您正在打开连接。请在底部关闭它。同时处理cmd对象。
将INSERT Ststement放入SQL Transcation
使用try和Catch(使用Catch子句将错误消息存储到数据库中,ex.message返回错误详细信息。)