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

问题描述 投票:3回答:1

我正在尝试使用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是脚本中的第三个参数,这使我认为参数不是基于我给它们的名称传递的,而是基于它们的位置(传递它们的顺序)。

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

我希望我能为您提供所需的所有信息。谢谢!

c# sql sql-server stored-procedures dapper
1个回答
3
投票

在执行上面的存储过程时:

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

...你正在做的是提供一个值列表,而不是一个参数列表。如果要跳过存储过程中的参数,则需要指定要填充的参数的名称,如下所示(假设:参数名称与变量名称相同):

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

如果您只提供值,则会从第一个参数开始填写参数。这就是您的查询正在执行的操作。这里混淆的主要问题是你设置的值是作为变量处理的,而不是参数。

© www.soinside.com 2019 - 2024. All rights reserved.