2016-02-29 93 views
2

我真正想要做的是我想发送一个字符串数组到SQL Server。我使用SQL Server 2008的结构化类型必须至少有一个字段c#

这可以被标记为重复的,但我现在面临执行时从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(); 
+2

你DatTable TVP是空的,没有数据,因此没有财产,有一些填充... – Gusman

+0

@Gusman你是对的:)多谢.. – ShearzAhmed

回答

2

答:

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

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

我会问@gusman到重新写他的评论作为答案,并接受它,如果我在你的位置。 –

+0

@Zohar保证,但只有当他这样做..直到那时我认为人们需要知道 – ShearzAhmed

+2

不要担心,这个答案是好的,所以对我来说没有问题;) – Gusman

相关问题