gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:52:41 25 4
gpt4 key购买 nike

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

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

我希望我已经为您提供了您需要的所有信息。谢谢!

最佳答案

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

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

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

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

如果您只提供值,它们会从第一个参数开始填充参数。这就是您的查询正在做的事情。这里的主要混淆点是您设置的值是作为变量处理的,不是参数。

关于c# - 在 C# 中调用的存储过程如何在不提供所有可选参数的情况下正确插入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54026359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com