Как может хранимая процедура, которая вызывается в C #, правильно вставлять данные, не задавая все необязательные параметры? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь вставить данные с хранимой процедурой в базу данных SQL Server из программы на C # с помощью Dapper.Когда я пытаюсь это сделать, я не получаю никакой ошибки, но, к сожалению, некоторые данные вставляются в неправильный столбец.

База данных состоит из множества таблиц и столбцов, поэтому используется хранимая процедура длявставьте данные правильно.Я тщательно протестировал хранимую процедуру в самом SQL Server и точно знаю, что данные размещаются правильно при непосредственном выполнении кода SQL на сервере.

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

public void AddIndividual(string genus, string species, string collection)
{
    using (IDbConnection connection = new SqlConnection(connectionString: Helper.CnnVal("Rapento.Properties.Settings.Database1ConnectionString")))
    {
        List<Individual> individual = new List<Individual>();
        individual.Add(new Individual { GivenGenusName = genus, GivenSpeciesName = species, GivenCollectionName = collection });
        connection.Execute("dbo.AddIndividual @GivenGenusName, @GivenSpeciesName, @GivenCollectionName", individual);
    }
}


CREATE PROCEDURE AddIndividual
    @GivenGenusName varchar(255) = null,
    @GivenSpeciesName varchar(255) = null,
    @GivenDeterminedBy varchar(255) = null,
    @GivenDeterminationDate varchar(255) = null,
    ....
    @GivenCollectionName varchar(255) = null,

В базе данных видно, что GenusName и SpeciesName вставлены правильно, но CollectionName вставлено в столбец DeterminedBy.Это не так, как написано в сценарии SQL.Обращает на себя внимание, что DeterminedBy является третьим параметром в скрипте, что заставляет меня думать, что параметры передаются не на основе имен, которые я им даю, а на основе их положения (порядок, в котором я их передаю).

Итак, мой вопрос: как я могу вставить этот параметр в правильный столбец, не пропуская каждый необязательный параметр в процедуре?

Я надеюсь, что дал вам всю необходимую информацию,Спасибо!

1 Ответ

0 голосов
/ 03 января 2019

При выполнении хранимой процедуры, как указано выше:

connection.Execute("dbo.AddIndividual @GivenGenusName, @GivenSpeciesName, @GivenCollectionName", individual);

... вы предоставляете список значений , а не список параметров . Если вы пропускаете параметры в хранимой процедуре, вам нужно указать имена параметров, которые вы заполняете, например так ( Предположение: имена параметров совпадают с именами переменных ):

connection.Execute("dbo.AddIndividual @GivenGenusName = @GivenGenusName, @GivenSpeciesName = @GivenSpeciesName, @GivenCollectionName = @GivenCollectionName", individual);

Если вы просто указываете значения, они заполняют параметры, начиная с первого параметра. Это то, что делает ваш запрос. Основное недоразумение заключается в том, что заданные вами значения обрабатываются как переменные, , а не параметры.

...