[英]Pass GUID into stored procedure method C#
我对 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 用于我的存储过程?
你需要在 GUID 列表上的 foreach 循环。 试试看:
foreach (var g in tempguid)
{
cmd.Parameters.Add(new SqlParameter("@id", g));
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
Console.WriteLine((string)rdr["value"]);
}
Console.ReadLine();
}
cmd.Parameteres.Clear();
}
您不能将列表传递给 sp。 您需要将您的 guid 转换为 csv 字符串示例:
var param = string.Join(", ", tempguid);
然后
cmd.Parameters.Add(new SqlParameter("@id", param));
然后在 sp 上收到您的参数后传递到String_Split 。 祝你好运!
从 ADO TVPs
将值传递给 TVP 非常简单,与将数据传递给常规参数相比,只需要很少的额外代码。
如上述链接System.Data.SqlClient
支持从DataTable
、 DbDataReader
或IEnumerable<T> \ SqlDataRecord
对象填充表值参数。
如果您的案例tempguid
中已经有来自其他来源的datatable
列表,那么您可以使用数据表将详细信息传递给存储过程。
DataTable tvp = new DataTable();
tvp.Columns.Add(new DataColumn("Id", typeof(Guid)));
// populate DataTable from your List here
foreach (var id in tempguid)
tvp.Rows.Add(id);
并更改 ADO.NET 代码,如下所示 -
conn.Open();
SqlCommand cmd = new SqlCommand("dbo.tvpProcedure", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvpParameter = new SqlParameter();
tvpParameter.ParameterName = "@id";
tvpParameter.SqlDbType = System.Data.SqlDbType.Structured;
tvpParameter.Value = tvp;
tvpParameter.TypeName = "dbo.testTVP";
cmd.Parameters.Add(tvpParameter);
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
Console.WriteLine((string)rdr["value"]);
}
Console.ReadLine();
}
旁注:
看起来您在代码中显示的GUIDs
似乎无效,因为它们包含非十六进制值。
472USFA0-B705-9A73-ABD4-3B1870AF1409 ^^ FA97E6BB-0875-5UB9-967A-87ECC396F9F0 ^
在我使用 dbo.testTVP 的情况下,将类型名称更改为有意义的而不是dbo.Identity
更多信息-
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.