将guid传递到存储过程方法c中#

hxzsmxv2  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(289)

我对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作为存储过程?

bnl4lu3b

bnl4lu3b1#

在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();
}
gopyfrb3

gopyfrb32#

无法将列表传递给sp。您需要将GUID转换为csv字符串示例:

var param = string.Join(", ", tempguid);

然后

cmd.Parameters.Add(new SqlParameter("@id", param));

然后在sp上接收到您的参数后,传递到string\u split。祝你好运!

p1iqtdky

p1iqtdky3#

将值传递给 TVPs 与向常规参数传递数据相比,ado.net非常简单,只需要很少的额外代码。
为数据类型指定sqldbtype.structured。
在参数的typename属性中指定表类型的名称。
将参数的value属性设置为合适的值。
如上链接所述 System.Data.SqlClient 支持从中填充表值参数 DataTable , DbDataReader 或者 IEnumerable<T> \ SqlDataRecord 物体。
如果您的案例中已经有来自其他来源的guid列表 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.Identity 在我的例子中,我使用了dbo.testtvp
更多信息-
http://www.sommarskog.se/arrays-in-sql-2008.html

相关问题