繁体   English   中英

将 GUID 传递到存储过程方法 C#

[英]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 非常简单,与将数据传递给常规参数相比,只需要很少的额外代码。

  • 对于您指定 SqlDbType.Structured 的数据类型。
  • 在参数的 TypeName 属性中指定表类型的名称。
  • 您将参数的 Value 属性设置为合适的值。

如上述链接System.Data.SqlClient支持从DataTableDbDataReaderIEnumerable<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

更多信息-

http://www.sommarskog.se/arrays-in-sql-2008.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM