我需要使用c#和php添加新记录到我的SQL数据库。我使用以下代码:
string server = "http://www.naseelco.com/scorm/populatecode.php";
foreach (string code in codeList)//codelist has 200 items
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(server);
request.Method = "POST";
string postData = "Code=" + code + "&Active=false";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
try
{
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
}
catch
{
}
}
是populatcode .php文件的内容:
<?php
$Code = $_POST['Code'];
$Active = $_POST['Active'];
mysql_connect("localhost","myUserName","myPassword") or die ('Error updating database');
mysql_select_db("naseelc1_AC");
mysql_query("INSERT INTO codes (code,Active)VALUES ('$Code','$Active')");
echo $Code;
?>
但是这段代码需要太多时间来更新SQL数据库。我的问题是:
是否有更有效的方法来插入多个记录在SQL数据库?
分析性能问题的第一件事是测试和验证哪里浪费了时间,而不是假设是系统的一个特殊部分。
你说"更新SQL数据库要花太多时间",你怎么知道是insert拖慢了你的速度?
首先,您必须度量系统每个部分的运行时间。然后优化这部分。
如果你不知道要优化哪一部分,就不要开始优化。
使用分析器或简单的时间测量代码,使用PHP中的microtime()
和c#中的Stopwatch类来计算程序中某个部分的运行时间,以确定热点。
假设您已经完成了所有这些,但仍然发现' INSERTìng单行花费的时间太长,那么还有几个领域需要探索。索引太多可能是首先要检查的。
看到您的程序,我敢打赌Anders Abel是对的,您是在HTTP开销上浪费时间,而不是在insert
期间。另一种方法是将整个列表发送到PHP代码,然后使用多行INSERT
插入所有内容,只需一条语句:
INSERT INTO codes (code,Active)
VALUES
('code_1', true),
('code_2', false),
('code_3', true),
('code_4', false),
('code_5', true)
但我仍然相信这是你的概念发送每个代码作为一个POST到后端,这是采取所有的时间…
200个后续web请求的延迟可能是导致性能下降的原因。两个建议:
- 修改php代码以接受完整的列表并遍历它。 在c#代码中使用
Parallel.Foreach
来并行运行请求。我知道您没有明确询问安全性,但是ESCAPE YOUR USER FIELDS!你应该永远不要在你的查询中直接使用$_GET
或$_POST
变量。必须先转义它们。您当前的代码很容易被利用。您可以使用mysql_real_escape_string()
见:http://php.net/manual/en/function.mysql-real-escape-string.php
无论如何,要真正回答你的问题,你可能想看看MySQL连接器/NET。它是一个库,直接连接到MySQL服务器,并与标准System.Data
类集成。