结构化类型必须至少有一个字段c#

时间:2016-02-29 13:00:45

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

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

这可以标记为重复,但在从stactoverflow实施解决方案时我遇到了另一个问题

LINK 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();

1 个答案:

答案 0 :(得分:3)

<强>解答:

我很愚蠢地问这个问题,但至少现在我知道导致这个异常的原因

感谢@Gusman

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

ng-repeat