C# 存储过程需要一个我已经传入的参数
我正在尝试使用以下声明执行存储过程:C# 存储过程需要一个我已经传入的参数,c#,sql-server,tsql,stored-procedures,ado.net,C#,Sql Server,Tsql,Stored Procedures,Ado.net,我正在尝试使用以下声明执行存储过程: ALTER PROCEDURE [dbo].[getByName] @firstName varchar, @lastName varchar AS ... 我打电话给C#如下: public List<Person> GetPersonByName(string first, string last) { var people = new List<Person>(); var connString
ALTER PROCEDURE [dbo].[getByName]
@firstName varchar,
@lastName varchar
AS
...
我打电话给C#如下:
public List<Person> GetPersonByName(string first, string last)
{
var people = new List<Person>();
var connString = ConfigurationManager.ConnectionStrings["MyDbConnString"].ConnectionString;
using (var conn = new SqlConnection(connString))
{
using (var cmd = new SqlCommand("dbo.getByName",conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@firstName", SqlDbType.VarChar, 50)).Value = first;
cmd.Parameters.Add(new SqlParameter("@lastName", SqlDbType.VarChar, 50)).Value = last;
conn.Open();
using (var reader = cmd.ExecuteReader())
{
people = ReadPeopleData(reader);
}
conn.Close();
}
}
return people;
}
并声明:
cmd.Parameters.Add(new SqlParameter("@firstName", SqlDbType.VarChar, 50)).Value
对于这两个参数,它都会继续抛出异常。我看到这个问题在两种常见场景中多次出现:
if (first == null) {
first = "";
}
if (last == null) {
last = "";
}
试试这个,它会起作用的:
SqlParameter[] sqlParams = new SqlParameter[] {
new SqlParameter("@UserName",(object)userName ?? DBNull.Value),
new SqlParameter("@Password",(object)password ?? DBNull.Value)
};
如果参数为NULL,则使用??操作员请将CommandaType添加到SQLCommand
e、 g:scmd.CommandType=CommandType.StoredProcess
@lastName
有效吗?顺便说一句:如果您将参数定义为varchar
,那么您将得到一个长度正好为一个字符的字符串。可能不是你想要的-对吧?始终定义长度!使用varchar(50)
或任何有意义的方法……存储过程的那些参数没有正确定义。。无长度的VARCHAR是长度为1@marc_s抱歉,我的意思是我没有在构建之后明确设置它。cmd=new-SqlCommand(“dbo.getByName”,connection)正在使用请显示完整的代码以进行复制。问题可能出在您遗漏的内容中。或者在Value=
部分使用null coalesce。像第一个??“
和最后一次??“”
谢谢!当我模拟对这个API方法的GET请求时,我使用的是空字符串,但是输入字段的默认val()是null而不是“”。
SqlParameter[] sqlParams = new SqlParameter[] {
new SqlParameter("@UserName",(object)userName ?? DBNull.Value),
new SqlParameter("@Password",(object)password ?? DBNull.Value)
};