如何在C#中调用的存储过程正确插入数据而不提供所有可选参数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C#中调用的存储过程正确插入数据而不提供所有可选参数?相关的知识,希望对你有一定的参考价值。
我正在尝试使用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,
在数据库中,我可以看到正确插入了GenusName
和SpeciesName
,但CollectionName
被插入到DeterminedBy
列中。这不是它在SQL脚本中的编写方式。我注意到DeterminedBy
是脚本中的第三个参数,这使我认为参数不是基于我给它们的名称传递的,而是基于它们的位置(传递它们的顺序)。
所以我的问题是:如何在正确的列中插入此参数而不必传递过程中的每个可选参数?
我希望我能为您提供所需的所有信息。谢谢!
答案
在执行上面的存储过程时:
connection.Execute("dbo.AddIndividual @GivenGenusName, @GivenSpeciesName, @GivenCollectionName", individual);
...你正在做的是提供一个值列表,而不是一个参数列表。如果要跳过存储过程中的参数,则需要指定要填充的参数的名称,如下所示(假设:参数名称与变量名称相同):
connection.Execute("dbo.AddIndividual @GivenGenusName = @GivenGenusName, @GivenSpeciesName = @GivenSpeciesName, @GivenCollectionName = @GivenCollectionName", individual);
如果您只提供值,则会从第一个参数开始填写参数。这就是您的查询正在执行的操作。这里混淆的主要问题是你设置的值是作为变量处理的,而不是参数。
以上是关于如何在C#中调用的存储过程正确插入数据而不提供所有可选参数?的主要内容,如果未能解决你的问题,请参考以下文章