1
仅仅落后了几年,但我今天发现了存储过程/ UDF的表值参数。他们是我遇到的问题的理想解决方案,但我无法让他们从C#工作。来自C#的SQL表值参数
我有一个UDF:
CREATE FUNCTION GetSurveyScores
@Survey bigint,
@Question nvarchar(max),
@Area StringList READONLY,
@JobCode StringList READONLY
AS BEGIN
SELECT * FROM SurveyResults WHERE RespondentArea IN (Select val from @Area) AND RespondentJobCode IN (select val from @JobCodes)
END
(StringList的是我创建的类型,它只是一个表值类型与称为VAL单个列,定义为为nvarchar(256))从
然后SQL Server管理工作室,我可以这样做:
declare @area StringList;
insert into @area(val) values('NW'),('NE'),('SW');
// Get all survey respondent job codes from the SurveyRespondent table.
declare @jobcodes StringList;
insert into @jobcodes select distinct jobcode from dbo.SurveyRespondent;
select * from dbo.GetSurveyScores(3, 'Q3', @area, @jobcodes)
这工作出色。
从C#,我没有得到任何结果(无例外),使用此代码:(我使用的数据表,因为实际的代码,我打算放到这里采用的数据表的话)
DataTable areas = new DataTable("StringList");
areas.Columns.Add("val");
areas.Rows.Add("NW"); areas .Rows.Add("NE"); areas .Rows.Add("SW");
DataTable jobcodes = new DataTable("StringList");
jobcodes.Columns.Add("val");
jobcodes.Rows.Add("JC1"); jobcodes .Rows.Add("JC2");
SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.GetSurveyScores(3, 'Q3', @area, @jc)", connection);
cmd.Parameters.AddWithValue("@area", areas);
cmd.Parameters["@area"].SqlDbType = SqlDbType.Structured;
cmd.Parameters["@area"].TypeName = "StringList";
cmd.Parameters.AddWithValue("@jc", jobcodes);
cmd.Parameters["@jc"].SqlDbType = SqlDbType.Structured;
cmd.Parameters["@jc"].TypeName = "StringList";
DataTable results = new DataTable();
using (SqlDataAdapter da = new SqlDataAdapter(cmd)) {
da.Fill(results);
}
Console.WriteLine(results.Rows.Count);
最后一行打印0.我相信我一定会错过简单的东西,但经过6个小时的尝试,我想我需要一组新的眼睛来看它。
'WHERE RespondentArea IN(@Area)'应该是'WHERE RespondentArea IN(SELECT val FROM @Area)'? –
是的,错过了那一点。事情就是这样。现在更正。 – Neil
对于职位代码和区域数据表,您将在单引号中添加行值而不是双引号。 – Divi