当前位置:  开发笔记 > 编程语言 > 正文

只有foreach循环中的第一个存储过程才有效,但是内联查询会是什么?C#

如何解决《只有foreach循环中的第一个存储过程才有效,但是内联查询会是什么?C#》经验,为你挑选了1个好方法。

我正在尝试使用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工作,我无法弄清楚为什么它不能使用存储过程,谁能告诉我为什么?谢谢



1> Jakub Lortz..:

在第一个代码示例中,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();
}

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有