我对c#基本上是新手,所以我在这里寻找一些指导。我正在测试一个方法,我需要将guid列表传递给它,并运行一个存储过程,该过程基于我传递给它的guid返回值,然后我可以打印到控制台。当我只传递一个guid时,我可以让这个方法工作,但是当我传递一个guid列表时,它似乎不工作。
我觉得我对如何传递guid列表并返回它缺乏一些理解。尝试返回列表时出现转换错误。
这里是我有多远,但我觉得我现在卡住了,不能再从任何信息,我发现网上的进展。
class Program
{
static void Main(string[] args)
{
List<Guid> tempguid = new List<Guid>();
tempguid.Add(Guid.Parse("472USFA0-B705-9A73-ABD4-3B1870AF1409"));
tempguid.Add(Guid.Parse("FA97E6BB-0875-5UB9-967A-87ECC396F9F0"));
GetValue(tempguid);
Console.WriteLine(GetValue);
}
public void GetValue(List<Guid> tempguid)
{
using (SqlConnection conn = new SqlConnection("connection string here"))
{
conn.Open();
SqlCommand cmd = new SqlCommand("stored procedure here", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@id", tempguid));
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
Console.WriteLine((string)rdr["value"]);
}
Console.ReadLine();
}
}
}
}
我应该像这样传递getvalue(list tempguid)列表吗?
编辑
如果我用tvp。
比如:
CREATE TYPE [dbo].[Identity] AS TABLE(
[Id] [uniqueidentifier] NOT NULL
)
GO
然后我的程序将沿着以下思路:
CREATE OR ALTER PROCEDURE [dbo].[procedure_name]
@id dbo.Identity READONLY
as
SELECT t.[id]
,t.[value]
FROM [dbo].[table1] t
Inner Join @id i on i.Id = t.id
如何在c中使用tvp作为存储过程?
3条答案
按热度按时间bnl4lu3b1#
在guid列表上需要foreach循环。试试看:
gopyfrb32#
无法将列表传递给sp。您需要将GUID转换为csv字符串示例:
然后
然后在sp上接收到您的参数后,传递到string\u split。祝你好运!
p1iqtdky3#
将值传递给
TVPs
与向常规参数传递数据相比,ado.net非常简单,只需要很少的额外代码。为数据类型指定sqldbtype.structured。
在参数的typename属性中指定表类型的名称。
将参数的value属性设置为合适的值。
如上链接所述
System.Data.SqlClient
支持从中填充表值参数DataTable
,DbDataReader
或者IEnumerable<T> \ SqlDataRecord
物体。如果您的案例中已经有来自其他来源的guid列表
tempguid
那你就需要一个datatable
将详细信息传递给存储过程。并更改如下ado.net代码-
旁注:
看起来像是
GUIDs
您在代码中显示的值似乎无效,因为它们包含非十六进制值。将类型名称更改为有意义的名称,而不是
dbo.Identity
在我的例子中,我使用了dbo.testtvp更多信息-
http://www.sommarskog.se/arrays-in-sql-2008.html