2017-07-25 44 views
0

我有一個for循環,它從我的C#web表單收集數據,並通過存儲過程將它找到的每個項目寫入數據庫。For循環只寫入我的mssql存儲過程一次?

我遇到的問題是它只寫入數據庫一次。我已經瀏覽了visual studio中的代碼並插入了測試變量,以檢查所有數據是否存在並正在被捕獲。還因爲第一次我知道存儲過程正常運行。

所以我認爲這個問題可能與我如何在for循環中獲得try catch有關?
或者完全可能是其他的東西 - 我真的可以用一雙新鮮的眼睛和某人指引我朝着正確的方向!

protected void log_hd_number() 
{ 
    ////write results to DB. 
    SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Integrated Security=True"); 
    SqlCommand cmd = conn.CreateCommand(); 
    SqlDataReader reader; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "insert_requested_hd"; 

    Dictionary<String, String> hdSize = new Dictionary<String, String>(); 

    hdSize.Add("hardDiskSizeData1", hardDiskSizeData1.Text); 
    hdSize.Add("hardDiskSizeData2", hardDiskSizeData2.Text); 

    int numberRequested = 2; 

    for (int i = 1; i <= numberRequested; i++) 
    { 
     cmd.Parameters.AddWithValue("@hd_size", hdSize["hardDiskSizeData" + i]); 
     cmd.Parameters.AddWithValue("@number_requested", numberRequested); 
     cmd.Parameters.AddWithValue("@vm_id", 15); 

     try 
     { 
      conn.Open(); 
      reader = cmd.ExecuteReader(); 
      reader.Close(); 
     } 
     catch (Exception exc) 
     { 

     } 
     finally 
     { 
      if (conn.State != ConnectionState.Closed) 
       conn.Close(); 
     } 
    } 
} 

編輯:

SP:

ALTER PROCEDURE [dbo].[insert_requested_hd] 
    -- Add the parameters for the stored procedure here 
    @hd_size nvarchar(150), 
    @number_requested int, 
    @vm_id int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    INSERT INTO dbo.hard_disk_size 
       (
        hd_size, 
        number_requested, 
        vm_id 
       ) 
    VALUES 
       (
        @hd_size, 
        @number_requested, 
        @vm_id 
       ) 
+0

你有沒有一行一行的調試代碼?檢查for循環中的「我」的值? –

+0

你爲什麼要做ExecuteReader()?你只是想要ExecuteNonQuery() –

+0

@hannan是我已經通過了正確的次數 – hlh3406

回答

6

你不斷地向循環中的cmd添加參數而不清除舊的參數。也許這是問題。

此外,我不確定你可以打開一個conn關閉後。我想你必須做一個新的。

+0

^這。當然。在循環之前添加一次,然後保持將新值設置爲現有參數。 – dlatikay

+0

就是這樣!謝謝!!! – hlh3406

+0

此外,@ hlh3406你捕捉異常,但你什麼都不做,所以很有可能因爲這裏指出的原因而失敗,但你沒有看到,因爲你已經隱藏了它。 –

-1

您應該使用

cmd.ExecuteNonQuery(); 

而不是

reader = cmd.ExecuteReader(); 
+0

之前,但該過程可能會返回一個行集,在OP情況下,該集只會被丟棄。當沒有行集時,對'ExecuteReader'的調用是否與'CommandType.StoredProcedure'有關? – dlatikay

-1

您正在關閉第一個循環後的連接。 如果你真的想每個循環都去DB,你必須爲每一輪打開一個新的連接。

無論哪種方式,我認爲你不應該擊中數據庫這麼多次。你有沒有想過BulkInsert? 看看here