【问题标题】:Structured types must have at least one field c#结构化类型必须至少有一个字段 c#
【发布时间】:2016-06-12 12:47:27
【问题描述】:

我真正想做的是将一个字符串数组发送到 SQL Server。我正在使用 SQL Server 2008。

这可以被标记为重复,但在从 stactoverflow 实施解决方案时我面临着另一个问题

链接How to pass an array into a SQL Server stored procedure

这是我的 C# 和存储过程代码

C#代码:

string[] str = new string[] {"s" , "a" , "k"};

DataTable dt = new DataTable();
dt.Columns.Add("names");

foreach (string item in str)
{
    dt.Rows.Add(item);
}

foreach (DataRow r in dt.Rows)
{
    Console.WriteLine(r["names"].ToString());
}

DataTable tvp = new DataTable();

SqlConnection conn = new SqlConnection("Data Source=SHZAK;Initial Catalog=synchroniztionTesing;Integrated Security=True");
conn.Open();

using (conn)
{
    SqlCommand cmd = new SqlCommand("strpdPassAnStringArray", conn);
    cmd.CommandType = CommandType.StoredProcedure;

    SqlParameter tvparam = cmd.Parameters.AddWithValue("@List", tvp);
    tvparam.SqlDbType = SqlDbType.Structured;

    cmd.ExecuteScalar();
}

在制作存储过程之前,我创建了一个自定义类型:

CREATE TYPE dbo.arrayOfNames
AS TABLE
(
  name  nvarchar(max)
);

存储过程代码:

CREATE PROCEDURE [dbo].[strpdPassAnStringArray]
      @List AS dbo.arrayOfNames READONLY
AS
BEGIN
    SET NOCOUNT ON;

    SELECT name FROM @List; 
END

但是在应用程序代码中它引发了这个异常:

结构化类型中的字段不足。结构化类型必须至少有一个字段。

上线

cmd.ExecuteScalar();

【问题讨论】:

  • 你的 DatTable tvp 是空的,没有数据,因此没有属性,用一些东西填充它......
  • @Gusman 你是对的 :) 非常感谢..

标签: c# sql-server stored-procedures table-variable


【解决方案1】:

回答:

问这个问题我太笨了,但至少现在我知道是什么导致了这个异常

感谢@Gusman

如果您的 DataTable 是空的,就像我的情况一样,则可以引发此异常

        string[] str = new string[] {"sheraz" , "ahmed" , "khan"};
        DataTable tvp = new DataTable();


        tvp.Columns.Add("names");
        foreach (string item in str)
        {
            tvp.Rows.Add(item);
        }

        foreach (DataRow r in tvp.Rows)
        {
            Console.WriteLine(r["names"].ToString());
        }

        SqlConnection conn = new SqlConnection("Data Source=SHZAK;Initial Catalog=synchroniztionTesing;Integrated Security=True");
        conn.Open();

        using (conn)
        {
            SqlCommand cmd = new SqlCommand("strpdPassAnStringArray", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter tvparam = cmd.Parameters.AddWithValue("@List", tvp);
            tvparam.SqlDbType = SqlDbType.Structured;
            cmd.ExecuteScalar();
        }

【讨论】:

  • 如果我在你的位置,我会要求 @gusman 重新写他的评论作为答案并接受它。
  • @ZoharPeled 当然,但前提是他这样做.. 在那之前我认为人们需要知道
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2014-01-07
相关资源
最近更新 更多