2011-11-13 80 views
0

我需要使用C#和php將新記錄添加到我的SQL數據庫。我使用此代碼:向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 
    { 

    } 
} 

這是populatecode.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數據庫中插入多個記錄?

+3

我很確定一隻小貓每次有人要求進行性能優化,同時保持所涉及的RDMS是祕密的,都會被着火。 –

+1

你可以直接從C#插入它們,而不是http發佈到PHP? –

+1

哇 - 安全問題!首先,一定要使用這個:http://php.net/manual/en/function.mysql-real-escape-string.php – Faust

回答

3

的第一件事,分析性能問題時,是測試驗證,你失去的時候,不要假設,它是你的系統的一個特殊組成部分。

你說「花費了太多時間來更新SQL數據庫」,你怎麼知道這是INSERTs會減慢你的速度?

首先,您必須測量系統各部分的運行時間。然後優化該部分。

如果您不知道要優化哪個部分,請不要開始優化。

使用PHP中的microtime()和C#中的Stopwatch類來計算程序中片斷的運行時間以查明熱點,從而使用分析器或簡單時間測量代碼。

假設你已經完成了所有這些工作,仍然發現`INSERTìng單行花費的時間太長,那麼有幾個方面需要探索。太多索引可能是首先要檢查的。

看到你的計劃,我敢打賭安德斯·阿貝爾是正確的,你失去的HTTP開銷的時間,而不是在INSERT語句

另一種approache將整個列表發送到PHP代碼然後用多排INSERT到只是一個單一的語句插入的一切:

INSERT INTO codes (code,Active) 
    VALUES 
    ('code_1', true), 
    ('code_2', false), 
    ('code_3', true), 
    ('code_4', false), 
    ('code_5', true) 

但我仍然相信這是你的每個代碼一個POST發送到正在採取所有的時間後端的概念...

+0

+ 1爲「不要過早優化」警告!! –

+0

OP實際上並不「過早」(畢竟他確實存在性能問題)。但他從錯誤的地方開始。 –

+0

有效的點 - 我想我應該更多地沿着這樣的句子說:「不要猜測它是什麼,知道它是什麼!」 –

2

200個後續web請求的延遲可能是殺死性能。兩條建議:

  • 更改php代碼以接受完整列表並通過它循環。
  • 在C#代碼中使用Parallel.Foreach以並行運行請求。
2

我知道你沒有明確詢問安全問題,但是可以跳過你的用戶區域!您應該從來沒有直接在您的查詢中使用$_GET$_POST變量。你必須第一次逃脫他們。你目前的代碼是可以利用的。您可以使用逃脫mysql_real_escape_string()

見每個領域:http://php.net/manual/en/function.mysql-real-escape-string.php

無論如何,真正回答你的問題,你可能想看看MySQL Connector/NET。它是一個直接連接到MySQL服務器並與標準System.Data類集成的庫。