在C#中调用的存储过程如何在不提供所有可选参数的情况下正确插入数据?

时间:2019-01-03 16:38:58

标签: c# sql sql-server stored-procedures dapper

我正在尝试使用Dapper将带有存储过程的数据从C#程序插入SQL Server数据库中。尝试执行此操作时,没有出现任何错误,但是很遗憾,某些数据被插入错误的列中。

数据库由许多表和列组成,因此使用存储过程来正确插入数据。我已经在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,

在数据库中,我看到正确插入了GenusNameSpeciesName,但是CollectionName插入了列DeterminedBy。这不是在SQL脚本中编写的方式。引起我注意的是,DeterminedBy是脚本中的第三个参数,这使我认为这些参数不是基于我给它们提供的名称而是基于它们的位置(传递的顺序I)传递的他们)。

所以我的问题是:如何在不必传递过程中每个可选参数的情况下将该参数插入正确的列?

希望我能给您所有您需要的信息。谢谢!

1 个答案:

答案 0 :(得分:3)

如上所述执行存储过程时:

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

...您正在做的是提供列表,而不是参数列表。如果要在存储过程中跳过参数,则需要指定要填充的参数的名称,例如( Assumption:参数名称与变量名称相同):

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

如果仅提供值,则它们将从第一个参数开始填充参数。这就是您的查询正在执行的操作。此处的主要困惑是,您已将设置的值作为变量而不是不是参数来处理。