2016-07-26 73 views
1

我在C#中有DataTable,我試圖將它傳遞給SQL Server。C#DataTable到SQL Server存儲過程

我所擁有的是:

DataTable asd = new DataTable(); 

for (int i = 0; i < LocationDataList.Count; i++) 
{ 
    asd.Columns.Add(LocationDataList[i], typeof(string)); 
} 

command.Parameters.Add("@PLocationDataList", SqlDbType.NVarChar, -1).Value = asd; 

command.ExecuteNonQuery(); 

下面是該過程的T-SQL;

ALTER PROCEDURE [Sade].[SPLocationInsert] 
    @... INT 
    ,@... VARCHAR(64) 
    ,@... VARCHAR(MAX) 
    ,@... INT 
    ,@... INT 
    ,@... INT 
    ,@... INT 
    ,@... INT 
    ,@PLocationDataList NVARCHAR(MAX) 
AS 

我不知道如何通過DataTable和數據類型,我應該使用。

在此先感謝

回答

2

創建一個用戶定義的表型SQL服務器:

CREATE TYPE LocationTableType AS TABLE 
(LocationName VARCHAR(50)); 
GO 

而且通過這個表值參數的存儲過程:

CREATE PROCEDURE [Sade].[SPLocationInsert] 
@... INT 
,@... VARCHAR(64) 
,@... VARCHAR(MAX) 
,@... INT 
,@... INT 
,@... INT 
,@... INT 
,@... INT 
,@PLocationDataList LocationTableType READONLY 
AS 
    SET NOCOUNT ON 
    -- insert your code here 
GO 

參考文獻:

用戶定義的表類型:https://technet.microsoft.com/en-us/library/bb522526(v=sql.105).aspx

表值參數:https://technet.microsoft.com/en-us/library/bb510489(v=sql.105).aspx

+0

非常感謝。你拯救了我的一天。 – NewPHPer

1

你試圖傳遞一個DataTable這是一種結構類型,所以它必須是類型SqlDbType.Structured

command.Parameters.Add("@PLocationDataList", SqlDbType.Structured, -1).Value = asd; 

此外,你必須創建在SQL Server中的表型變量相同

CREATE TYPE dbo.LocationDataList AS TABLE 
    (col1 nvarchar(50)) 

檢查Table-Valued Parameters

0

,如果你需要多個字符串值連接在一起,你可以,例如,用逗號分隔的字符串, d然後在存儲過程中,就可以,傳遞aaa,bbb,ccc拆分此逗號分隔的字符串來表

例如到您的存儲過程,然後將其劃分到表

+0

謝謝你的回答,但是,我傳遞的價值觀是由逗號的,所以我需要通過他們以不同的方式。 – NewPHPer

0

1.首先轉換數據表成XML像下面

DataSet ds = new DataSet(); 
ds.Tables.Add(dt1); // dataTable 
string dsXml= ds.GetXml(); 

2.然後通過這個XML字符串作爲一個參數到存儲過程。

3.在SQL中,MYSQL XML數據類型是可以定義的。通過使用它你可以執行存儲過程。

更多信息參見本link