Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构化类型必须至少有一个字段c#_C#_Sql Server_Stored Procedures_Table Variable - Fatal编程技术网

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

结构化类型必须至少有一个字段c#,c#,sql-server,stored-procedures,table-variable,C#,Sql Server,Stored Procedures,Table Variable,我实际上想做的是向SQL Server发送一个字符串数组。我正在使用SQLServer2008 这可以标记为重复,但在从stactoverflow实现解决方案时,我面临着另一个问题 链接: 这是我的C#和存储过程代码 C#代码: string[] str = new string[] {"s" , "a" , "k"}; DataTable dt = new DataTable(); dt.Columns.Add("names"); foreach (string item in str)

我实际上想做的是向SQL Server发送一个字符串数组。我正在使用SQLServer2008

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

链接

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

回答:

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

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

你的可日期tvp是空的,没有数据,因此没有属性,用一些东西填充它…@Gusman你是对的:)非常感谢..如果我在你的位置,我会请@Gusman重新写他的评论作为回答,并接受它。@zoharpeld当然,但只有在他这样做的情况下。。在那之前,我认为人们需要知道