2016-07-26 10 views
1

Ich habe eine DataTable in C#, und ich versuche, es an SQL Server übergeben.C# DataTable in SQL Server gespeicherte Prozedur

Was ich habe, ist:

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

Hier ist das Verfahren T-SQL;

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

Ich habe keine Ahnung, wie die DataTable und Art, die Daten zu übergeben ich verwenden soll.

Vielen Dank im Voraus

Antwort

2

Erstellen einer benutzerdefinierten Tabellentyp in SQL Server:

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

und geben diese Tabelle Wertparameter an die gespeicherte Prozedur:

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 

Referenzen:

Benutzerdefinierte Tabellentypen: https://technet.microsoft.com/en-us/library/bb522526(v=sql.105).aspx

Tabelle Wertparameter: https://technet.microsoft.com/en-us/library/bb510489(v=sql.105).aspx

+0

Vielen Dank. Du hast meinen Tag gerettet. – NewPHPer

0

Wenn Sie den Typ einer Spalte überprüfen Sie diese Seite festlegen möchten: https://msdn.microsoft.com/en-us/library/hfx3s9wd(v=vs.110).aspx

Vielleicht möchten Sie einen Blick auf SqlBulkCopy (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx). Es akzeptiert standardmäßig Databases.


Es gibt eine Erweiterung zur Verfügung, wenn Sie mit Objekten arbeiten, die es kann leicht umgewandelt werden, dass https://www.nuget.org/packages/FastMember/ sehen.

+0

Dank für Ihre Antwort danken – NewPHPer

1

Sie versuchen, eine Datentabelle zu übergeben, die ein strukturierter Typ ist und so hat es vom Typ SqlDbType.Structured

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

auch sein, werden Sie einen Tabellentyp Variable in SQL Server für die gleiche

erstellen müssen
CREATE TYPE dbo.LocationDataList AS TABLE 
    (col1 nvarchar(50)) 

prüft Table-Valued Parameters

0

, wenn Sie zusammen mehr String-Werte benötigen, können Sie zum Beispiel verwenden, um eine durch Kommata getrennte Zeichenfolge, ein d dann in Ihrer gespeicherten Prozedur, können Sie diese durch Komma aufgeteilt in eine Tabelle getrennte Zeichenfolge

Sie zum Beispiel aaa,bbb,ccc passieren Ihnen gespeicherte Prozedur, und teilen Sie es dann an einen Tisch

+0

Vielen Dank für Ihre Antwort, aber die Werte, die ich vorbei bin, ist von Kommas bestehen, also muss ich sie auf eine andere Weise zu übergeben. – NewPHPer

0

1.First konvertieren Datentabelle in XMl wie unten

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

2.Then diese XML-Zeichenfolge als ein Parameter übergeben Gespeicherte Prozedur.

3.In SQL, MYSQL XML-Datentyp ist zu definieren. Mit diesem können Sie gespeicherte Prozeduren ausführen.

als Referenz sehen diese link