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

本文关键字:有一个 字段 类型 结构化 | 更新日期: 2023-09-27 18:36:53

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

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

链接:如何将数组传递到 SQL Server 存储过程中

这是我的 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();

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

答案:

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

感谢@Gusman

如果你的数据表是空的,就像我的情况一样,可以引发这个异常

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