SQL Server存储过程看不到参数

时间:2018-07-03 01:13:14

标签: c# sql-server stored-procedures parameter-passing user-defined-types

我正在使用C#调用存储过程并从数据表填充它,但我做错了事。

我的存储过程:

CREATE PROCEDURE [dbo].[getStationInfo]
    @stationList AS dbo.udtableStationCode READONLY
AS  
BEGIN
    SELECT * 
    FROM stations
    WHERE StationCode IN (SELECT * FROM @stationList) 
END 

此过程使用以下用户定义的表类型:

CREATE TYPE [dbo].[udtableStationCode] 
     AS TABLE (StationCode NVARCHAR(50))

我正在尝试将数据表发送到存储过程,并将结果返回到另一个数据表中。这是我的C#:

    using (SqlConnection con = new SqlConnection(strConn))
    {
        con.Open();

        using (SqlCommand cmd = new SqlCommand("getStationInfo", con))
        {
            using (SqlDataAdapter ada = new SqlDataAdapter(cmd))
            {
                using (DataTable dtStationsReturned = new DataTable())
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Clear();
                    cmd.CommandText = "dbo.getStationInfo";
                    cmd.Parameters.AddWithValue("@stationList", dtStationCodes);
                    ada.Fill(dtStationsReturned);
                }
            }
        }
    }

无论我尝试什么,当我的代码到达“ ada.Fill”行时,都会出现错误:

  

过程“ getStationInfo”没有名为“ @stationList”的参数。

但是存储过程getStationInfo显然具有该参数。谁能告诉我我在做什么错?任何帮助表示赞赏。

编辑:我检查了dtStationCodes的内容,这很好。

编辑:这是我创建dtStationCodes数据表的方式:

DataTable dtStationCodes = new DataTable();
dtStationCodes.Columns.Add("StationCode", typeof(String));

1 个答案:

答案 0 :(得分:2)

尝试一下:

using (SqlConnection con = new SqlConnection(strConn))
{
    con.Open();
    using (SqlCommand cmd = new SqlCommand("dbo.getStationInfo", con))
    {
        using (SqlDataAdapter ada = new SqlDataAdapter(cmd))
        {
            using (DataTable dtStationsReturned = new DataTable())
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Clear();
                cmd.CommandText = "dbo.getStationInfo";
                SqlParameter sp = new SqlParameter("@stationList", dtStationCodes);
                sp.SqlDbType = SqlDbType.Structured;
                sp.TypeName = "dbo.udtableStationCode";
                cmd.Parameters.Add(sp);
                ada.Fill(dtStationsReturned);
            }
        }
    }
}

有关传递用户定义的表类型的另一个示例,请参见this question

有关创建SqlParameters并将TVP传递到存储过程的更多信息,请参见this page