2015-12-30 48 views
0

我試圖用foreach循環向表中插入幾行數據,當我編寫內聯SQL時,它似乎工作正常;只有foreach循環中的第一個存儲過程才能工作,但是內聯查詢會如何? C#

connection.Open(); 

foreach (Bet bet in bets) 
{ 
    string insertQuery = "insert into BetTbl (FixtureId,BetTime,UserName,PlayerId) values (@FixtureId, @BetTime, @UserName, @PlayerId)"; 

    SqlCommand command = new SqlCommand(insertQuery, connection); 

    command.Parameters.AddWithValue("@FixtureId", bet.FixtureId); 
    command.Parameters.AddWithValue("@BetTime", bet.BetTime); 
    command.Parameters.AddWithValue("@UserName", bet.User); 
    command.Parameters.AddWithValue("@PlayerId", bet.PlayerId); 

    command.ExecuteNonQuery(); 
} 

bets.Clear(); 
connection.Close(); 

但是當我嘗試使用存儲過程時出現錯誤;

過程或函數InsertBets有太多的參數指定

下面是代碼:

connection.Open(); 

foreach (Bet bet in bets) 
{ 
    command.Connection = connection; 
    command.CommandType = CommandType.StoredProcedure; 

    command.CommandText = "InsertBets"; 

    command.Parameters.AddWithValue("@FixtureId", bet.FixtureId); 
    command.Parameters.AddWithValue("@BetTime", bet.BetTime); 
    command.Parameters.AddWithValue("@UserName", bet.User); 
    command.Parameters.AddWithValue("@PlayerId", bet.PlayerId); 

    command.ExecuteNonQuery(); 
} 

bets.Clear(); 
connection.Close(); 

這裏是存儲過程:

CREATE PROCEDURE [dbo].[InsertBets] 
    @FixtureId VARCHAR(50), 
    @BetTime VARCHAR(25), 
    @UserName NVARCHAR(20), 
    @PlayerId VARCHAR(25) 
AS 
    INSERT INTO dbo.BetTbl (FixtureId, BetTime, UserName, PlayerId) 
    VALUES (@FixtureId, @BetTime, @UserName, @PlayerId) 

雖然它的工作原理使用內聯SQL,我無法弄清楚爲什麼它不能使用存儲過程重新,誰能告訴我爲什麼?謝謝

+0

你應該看看[我們可以停止使用AddWithValue()了嗎?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already /),並停止使用'.AddWithValue()' - 它可能會導致意想不到的和令人驚訝的結果... –

回答

6

在一個新的SqlCommand在每次迭代中創建的第一個代碼示例:

SqlCommand command = new SqlCommand(insertQuery, connection); 

在第二一個,所有迭代修改相同的命令,增加越來越多的參數。只有第一個電話會有正確的參數數量,接下來的電話會有太多的參數。

循環之前添加參數,而值,然後在循環中設置的值並執行命令

command.Connection = connection; 
command.CommandType = CommandType.StoredProcedure; 
command.CommandText = "InsertBets"; 

command.Parameters.Add("@FixtureId", SqlDbType.Int); 
// add the other paramters 

foreach (Bet bet in bets) 
{ 
    command.Parameters["@FixtureId"].Value = bet.FixtureId; 
    // set the other parameters 
    command.ExecuteNonQuery(); 
} 
+0

謝謝,這解決了問題 – jeddie1991

1

您正在每次循環時將參數添加到命令變量。你循環的第一時間和

command.Parameters.AddWithValue 

command.Parameters.AddWithValue 

問題是添加參數,然後你再循環第二次,並添加參數,以前的參數仍然存在。您必須清除參數或從頭重新實例化變量。

1

答案是(可能)在您未顯示的部分 - >定義和初始化command的位置和方式。

由於您在foreach循環中使用AddWithValue(),因此您將在每次迭代中添加值字段,因此第一次迭代有4個字段,第二次迭代有8個,然後是12個等等。

取而代之,在初始化command時添加一次字段,然後只設置foreach循環內的值。


另外, AddWithValue()通常被認爲是不好的做法。

0

試着改變你的編碼風格

cmd.Parameters.Add(new SqlParameter("@FixtureId", bet.FixtureId)); 

我也相信你需要創建命令在循環中,而不是在循環外部

+2

或更好的 - 對此,**明確**陳述**類型** (和可能的長度):'cmd.Parameters.Add(「@ FixtureId」,SqlDbType.VarChar,50).Value = bet.FixtureId;'。你正在使用的構造函數的參數名稱和值是**棄用** –

0

您正在調用command.Parameters.AddWithValue並在每次循環時添加更多值。 Clear()參數每個循環,或者初始化一個新的Command實例。

相關問題