Я пытаюсь вставить несколько строк данных в таблицу с использованием цикла {{x0}}, когда я пишу встроенный 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();

Но когда я пытаюсь использовать хранимую процедуру, я получаю сообщение об ошибке;

Процедура или функциональные inserbets имеют слишком много аргументов, указанных

Вот код:

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
jeddie1991 31 Дек 2015 в 00:55

5 ответов

Лучший ответ

В первом примере кода новый {{x0}} создан в каждой итерации:

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();
}
6
Jakub Lortz 30 Дек 2015 в 22:02

Вы добавляете параметры в командную переменную каждый раз, когда выполняете цикл. Вы выполняете цикл в первый раз и добавляете параметры с помощью

command.Parameters.AddWithValue

А затем вы снова циклируете второй раз и добавляете параметры с

command.Parameters.AddWithValue

Проблема в том, что предыдущие параметры остались прежними. вам нужно очистить параметры или повторно создать экземпляр переменной с нуля.

1
Shockwave 30 Дек 2015 в 22:01

Попробуйте изменить свой стиль кодирования

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

Я также считаю, что вам нужно каждый раз создавать команду в цикле, а не вне цикла

0
techspider 30 Дек 2015 в 22:12

Ответ (вероятно) в детали, которую вы не отображаете - & gt; где и как {{x0}} определяется и инициализируется.

Поскольку вы используете AddWithValue() внутри цикла foreach, вы добавляете поля значений с каждой итерацией, поэтому первая итерация имеет 4 поля, вторая - 8, затем 12 и так далее.

Вместо этого добавьте поле один раз, когда вы инициализированы {{x0}}, то установите только значения внутри вашего цикла {{x1}}.


AddWithValue()
1
Amit 30 Дек 2015 в 22:01

Вы вызываете command.Parameters.AddWithValue и добавляете новые значения каждый раз, когда он зацикливается. Либо очистите () параметры каждого цикла, либо инициализируйте новый экземпляр Command.

0
Tim 30 Дек 2015 в 23:05