2017-10-23 1 views
2

Ich versuche, eine Zeichenfolge aus C# in SQL Server zu senden, aber ich habe keine Ahnung, wie Sie diese Zeichenfolge in einer anderen Tabelle mithilfe einer gespeicherten Prozedur einfügen.Wie kann ich ein Array als Parameter in eine gespeicherte Prozedur übergeben?

Die Tabelle, in der die Daten eingefügt werden sollen, hat nur 2 Spalten, @IDUser (ein Parameter, den ich auch von C# übergebe und der für alle idproduct identisch ist) und die @IDProduct-Zeichenfolge, die etwas ist wie "1,2,3,4".

Also, was ich will, ist eine gespeicherte Prozedur der @idUser und die Array-Werte individuell wie

IDUSER | IDPRODUCT 
777  1 
777  2 
777  3 
777  4 

ich Server bin mit SQL einfügen 2016.

ich mögliche Antworten für dieses Problem gefunden haben, aber Sie sehen im Vergleich zu meinem SQL-Server-Wissen sehr komplex aus.

dank

+0

Dies soll Ihnen zeigen, wie es zu tun. https://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-intoindividual-rows Wenn Sie immer noch nicht bekommen können lass es mich wissen, ich werde dir eine Antwort geben. – DaniDev

+0

Wenn Sie dies über einen Parameter in sql tun möchten, verwenden Sie 'STRING_SPLIT' während der Verwendung von 2016. – Simon

Antwort

3

Ich denke, man diese beiden Möglichkeiten ausprobieren können:

  1. Ohne gespeicherte Prozedur: Sie mit SqlBulkCopy Klasse versuchen.

C# Code:

static void Main(string[] args) 
    { 
     Console.WriteLine("Inserting ..."); 

     var userId = 777; 
     var productIds = new List<int> { 1, 2, 3, 4 }; 
     var dto = new Dictionary<int, List<int>> 
     { 
      { userId, productIds } 
     }; 

     ExecuteBulkInsert(dto); 
     // ExecuteProcedure(dto); 

     Console.WriteLine("Done! ..."); 
     Console.ReadLine(); 
    } 

    public static void ExecuteBulkInsert(Dictionary<int, List<int>> dto) 
    { 
     string connectionString = GetConnectionString(); 

     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      DataTable newProducts = CreateDataTable(dto); 

      using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) 
      { 
       bulkCopy.DestinationTableName = "dbo.UserProducts"; 
       bulkCopy.WriteToServer(newProducts); 
      } 
     } 
    } 

    private static DataTable CreateDataTable(Dictionary<int, List<int>> dto) 
    { 
     const string IdUserColumnName = "IdUser"; 
     const string IdProductColumnName = "IdProduct"; 

     DataTable table = new DataTable(); 
     table.Columns.Add(new DataColumn(IdUserColumnName, typeof(int))); 
     table.Columns.Add(new DataColumn(IdProductColumnName, typeof(int))); 

     foreach (var product in dto) 
     { 
      foreach (var productId in product.Value) 
       table.Rows.Add(product.Key, productId); 
     } 

     return table; 
    } 
  1. mit einer gespeicherten Prozedur: Versuchen Sie es mit einem table-valued parameter

SQL-Code:

CREATE TABLE dbo.UserProducts 
(
    IdUser INT NOT NULL, 
    IdProduct INT NOT NULL 
); 
GO 

CREATE TYPE dbo.UserProductsType AS TABLE 
(
    IdUser INT NOT NULL, 
    IdUser INT NOT NULL 
); 
GO 

CREATE PROCEDURE dbo.UserProductsInsert 
    @userProductsType dbo.UserProductsType READONLY 
AS 
BEGIN 

    INSERT INTO UserProducts 
    SELECT * FROM @userProductsType 
END 

C# Code:

private static void ExecuteProcedure(Dictionary<int, List<int>> dto) 
    { 
     string connectionString = GetConnectionString(); 

     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = "dbo.UserProductsInsert"; 
       command.CommandType = CommandType.StoredProcedure; 

       SqlParameter parameter = command.Parameters.AddWithValue("@userProductsType", CreateDataTable(dto)); 
       parameter.SqlDbType = SqlDbType.Structured; 
       parameter.TypeName = "dbo.UserProductsType"; 

       command.ExecuteNonQuery(); 
      } 
     } 
    } 
Verwandte Themen