存储过程参数名是否必须与从C#传递的参数匹配?
我有如下的存储过程存储过程参数名是否必须与从C#传递的参数匹配?,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我有如下的存储过程 CREATE PROCEDURE SP_Test() @Name VARCHAR(10), @Dept VARCHAR(10) AS BEGIN ... END 我从C#调用存储过程如下: SqlCommand scCommand = new SqlCommand("SP_Test", MysqlCon); scCommand.CommandType = CommandType.StoredProcedure; scCommand.Paramete
CREATE PROCEDURE SP_Test()
@Name VARCHAR(10),
@Dept VARCHAR(10)
AS
BEGIN
...
END
我从C#调用存储过程如下:
SqlCommand scCommand = new SqlCommand("SP_Test", MysqlCon);
scCommand.CommandType = CommandType.StoredProcedure;
scCommand.Parameters.Add("@UserName", SqlDbType.VarChar, 10).Value = "SomeVal";
scCommand.Parameters.Add("@Department", SqlDbType.VarChar, 10).Value = "SomeVal";
...
...
这里我给出的名称与过程参数名称不同,因此会导致任何错误吗?是的,必须与存储过程参数中的名称相同,因为编译器基于名称映射参数,因此如果您给出不同的名称,它将无法映射值 所以你的C代码应该是这样的
scCommand.Parameters.Add("@Name", SqlDbType.VarChar, 10).Value = "SomeVal";
scCommand.Parameters.Add("@Dept", SqlDbType.VarChar, 10).Value = "SomeVal";
为什么不运行代码并亲自查看呢?如果参数和值之间没有关系,您希望框架如何映射它们?ADO.NET会按名称而不是位置将参数传递给SQL Server。是的,这将导致错误——您不能传递不属于定义的正式部分的参数,并且必须传递没有默认值的参数。@丹麦语,参数和类型的编号是相同的,因此我没有收到任何错误。顺便说一句,您应该在命名自己的过程时这样做。它是为微软的程序保留的。@Damien_,不相信我的人,我认为它代表[荷马之声]愚蠢的程序。就应用程序维护或调试而言,我创造了奇迹。如果SP中只有两个参数,而Im只传递C#中的两个参数值,会怎么样。所以它不会按顺序匹配?在本例中,您不必匹配顺序,但需要确保参数名称拼写正确correctly@MagendranV:如果您的问题是“我是否可以通过位置传递参数”,您可能应该问这个问题,而不是问“它是否会导致任何错误”。但是没有什么好的理由不知道存储过程参数的名称——依赖参数顺序有很大的问题,特别是当与T-SQL的巴洛克式隐式转换规则结合使用时。