我正在使用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));
答案 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。