Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储过程需要一个我已经传入的参数_C#_Sql Server_Tsql_Stored Procedures_Ado.net - Fatal编程技术网

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

对于这两个参数,它都会继续抛出异常。

我看到这个问题在两种常见场景中多次出现:

  • 分配给参数的值为null(或在VB.Net中为空)。这是.Net null,而不是DB null(DBNull.Value),这种情况最常见于字符串

  • 正在创建的参数与错误的命令对象关联。当同一类中有多个具有相似名称的命令对象时,通常会发生这种情况

  • 请仔细检查代码,以确保字符串变量未设置为null,并且参数已添加到正确的命令中

    更新

    根据发布的完整更新代码,可能的问题是上面1

    要在代码中避免此问题,请在方法顶部添加以下内容:

    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)
    };