2016-02-29 144 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

相關問題