我正在尝试使用foreach
循环向表中插入几行数据,当我编写内联SQL时,它似乎工作正常;
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工作,我无法弄清楚为什么它不能使用存储过程,谁能告诉我为什么?谢谢
在第一个代码示例中,SqlCommand
在每次迭代中都会创建一个new :
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(); }