C#调用SQL Server中的用户定义标量函数,以表类型作为参数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#调用SQL Server中的用户定义标量函数,以表类型作为参数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2620字,纯文字阅读大概需要4分钟。
内容图文
![C#调用SQL Server中的用户定义标量函数,以表类型作为参数](/upload/InfoBanner/zyjiaocheng/907/968f7eb1ba3845a0a5475b369135420d.jpg)
我一直在对着一块石头打我的脑袋.我编写了一个标量函数,它接受我创建的表类型作为参数,它返回一个简单的varchar,这里是sql代码,如果它有帮助
ALTER FUNCTION [dbo].[pe_Get_Manufacturer]
(
-- Add the parameters for the function here
@Row [dbo].[pe_StringList] READONLY
)
RETURNS VARCHAR(103)
AS
BEGIN
DECLARE @OUT VARCHAR(50)
DECLARE @tempTable TABLE
(
Position INT,
ManuName CHAR(100),
ManuCat CHAR(3)
)
INSERT INTO @tempTable
SELECT DISTINCT r.Position, c.ima_mfg, c.ima_cat
FROM dbo.[Admin_ MFR Aliases] as c
INNER JOIN @Row r
ON c.orig_mfg = r.Candidate
OR c.ima_mfg = r.Candidate
OR c.orgmfgstrp = r.Candidate
ORDER BY r.Position
SELECT TOP 1 @OUT = LTRIM(RTRIM(ManuName)) + '^' + COALESCE(ManuCat,'')
FROM @tempTable
ORDER BY Position DESC
-- Return the result of the function
RETURN @OUT
END
在我的C#方面,我有一个函数,它是一个字符串列表,放在一个数据表中,用作函数的参数.我相信我写的这一切都是正确的,当我的项目在SQLCommand上运行ExecuteScalar时抛出
public string getManufacturer(IList<string> list)
{
int counter = 1;
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Position", typeof (int));
dataTable.Columns.Add("Candidate", typeof (string));
foreach (var candidate in list)
{
DataRow dataRow = dataTable.NewRow();
dataRow["Position"] = counter++;
dataRow["Candidate"] = candidate;
dataTable.Rows.Add(dataRow);
}
SqlParameter tableType = new SqlParameter("@Row" , SqlDbType.Structured)
{
TypeName = "dbo.pe_StringList",
Value = dataTable
};
string query = " SELECT * FROM dbo.pe_Get_Manufacturer(@Row)";
SqlCommand sqlCommand = new SqlCommand(query, conn);
sqlCommand.Parameters.AddWithValue("@Row", tableType);
return sqlCommand.ExecuteScalar().ToString();
}
这是我从异常中获得的信息:
“System.Data.dll中发生了’System.ArgumentException’类型的异常,但未在用户代码中处理
Additional information: No mapping exists from object type
System.Data.SqlClient.SqlParameter to a known managed provider native
type.”
编辑 – –
这是我创建的表类型
CREATE TYPE pe_StringList
AS TABLE
(
Position INT,
Candidate VARCHAR(50)
)
我改变了查询
string query = " SELECT * FROM dbo.pe_Get_Manufacturer(@Row)";
至
string query = " SELECT dbo.pe_Get_Manufacturer(@Row)";
解决方法:
只需更改:
sqlCommand.Parameters.AddWithValue("@Row", tableType);
成为:
sqlCommand.Parameters.Add(tableType);
因为它已经是一个SqlParameter类型.您可以使用AddWithValue动态创建SqlParameter(虽然请参阅我底部的说明,不要使用不推荐使用的方法),但您已经创建了SqlParameter并且只需要将它添加到集合中.
是的,从纯粹的T-SQL语法角度来看,从查询中删除* FROM也是必要的.
旁注:最好不要在任何情况下使用AddWithValue ;-):
> Difference between Parameters.Add and Parameters.AddWithValue
> Can we stop using AddWithValue() already?
内容总结
以上是互联网集市为您收集整理的C#调用SQL Server中的用户定义标量函数,以表类型作为参数全部内容,希望文章能够帮你解决C#调用SQL Server中的用户定义标量函数,以表类型作为参数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。