2016-07-22 8 views
2

Ich versuche es, herauszufinden, ob ein Weg ist, ein mehrere Werte einfügen in SQL Server auszuführen, während Parameter verwenden, um genau zu sein, wie dies ein Befehl mit:Legen Sie mehrere Zeilen mit Parametern SQL Server

com = new SqlCommand("insert into myTable values (@recID,@tagID)", con); 
com.Parameters.Add("@recID", SqlDbType.Int).Value = recID; 
com.Parameters.Add("@tagID", SqlDbType.Int).Value = tagID; 
com.ExecuteNonQuery(); 

Gibt es eine Möglichkeit, eine Mehrfacheinfügung mit Parametern durchzuführen, die berücksichtigt, dass die Parameter für jeden Wert unterschiedlich sein können? (Beispiel: tagID kann immer anders sein)

Ich habe im Internet gesucht, aber bisher kein Glück, danke im Voraus, Grüße.

+0

TVP-Parameter, Temp-Tabelle. –

+1

Sie können eine Tabellenwertparameter verwenden: http://stackoverflow.com/questions/5595353/how-to-pass-table-value-parameters-to-stored-procedure-from-net-code –

Antwort

3

können Sie eine Tabelle bewertet Parameter verwenden: How to pass table value parameters to stored procedure from .net code

Zuerst die Art, in SQL Server erstellen:

CREATE TYPE [dbo].[myTvpType] AS TABLE 
(
    [RecordID] int, 
    [TagID] int 
) 

Und den C# -Code Ihre Daten einzufügen:

internal void InsertData(SqlConnection connection, Dictionary<int, int> valuesToInsert) 
{ 
    using (DataTable myTvpTable = CreateDataTable(valuesToInsert)) 
    using (SqlCommand cmd = connection.CreateCommand()) 
    { 
     cmd.CommandText = "INSERT INTO myTable SELECT RecordID, TagID FROM @myValues"; 
     cmd.CommandType = CommandType.Text; 

     SqlParameter parameter = cmd.Parameters.AddWithValue("@myValues", myTvpTable); 
     parameter.SqlDbType = SqlDbType.Structured; 

     cmd.ExecuteNonQuery(); 
    } 
} 

private DataTable CreateDataTable(Dictionary<int, int> valuesToInsert) 
{ 
    // Initialize the DataTable 
    DataTable myTvpTable = new DataTable(); 
    myTvpTable.Columns.Add("RecordID", typeof(int)); 
    myTvpTable.Columns.Add("TagID", typeof(int)); 

    // Populate DataTable with data 
    foreach(key in valuesToInsert.Key) 
    { 
     DataRow row = myTvpTable.NewRow(); 
     row["RecordID"] = valuesToInsert[key]; 
     row["TagID"] = key; 
    } 
} 
+0

Großartig! Danke für den Tipp, das löst das Problem. – JCO9

0

Sie können dies tun, indem Sie Ihre Daten als XML-Zeichenfolge senden und in einer gespeicherten Prozedur in SQL in eine Tabelle konvertieren. Zum Beispiel: ich mehrere Zeilen sandte annehmen/update in einer SQL-Tabelle hinzuzufügen, dann sind hier die Schritte:

  1. Konvertieren Sie Ihre Klasse oder eine Liste der Klasse in eine XML-Zeichenfolge mit folgenden Methode:

    public static string SerializeObjectToXmlString(object value) 
    
          { 
          var emptyNamepsaces = new XmlSerializerNamespaces(new[] { 
                XmlQualifiedName.Empty }); 
    
        var serializer = new XmlSerializer(value.GetType()); 
        var settings = new XmlWriterSettings(); 
        settings.Indent = true; 
        settings.OmitXmlDeclaration = true; 
    
        using (var stream = new StringWriter()) 
        using (var writer = XmlWriter.Create(stream, settings)) 
        { 
         serializer.Serialize(writer, value, emptyNamepsaces); 
         return stream.ToString(); 
        } 
    } 
    
  2. nun Daten in die Datenbank konvertieren Sie Ihre Klassenobjekt in xml Zeichenfolge beim Senden (Hier bin ich mit Entity Framework in meinem Code, können Sie dies tun, ohne es auch zu verwenden):

    bool AddUpdateData(List<MyClass> data) 
    { 
        bool returnResult = false; 
        string datatXml = Helper.SerializeObjectToXmlString(data); 
        var sqlparam = new List<SqlParameter>() 
           { 
        new SqlParameter() { ParameterName = "dataXml", Value = datatXml} 
    
           }; 
        var result = this.myEntity.Repository<SQL_StoredProc_ComplexType>().ExecuteStoredProc("SQL_StoredProc", sqlparam); 
        if (result != null && result.Count() > 0) 
        { 
         returnResult = result[0].Status == 1 ? true : false; 
        } 
        return returnResult; 
    } 
    
  3. Jetzt ist Ihre SQL-Code:

3,1 eine Tabelle Variable deklarieren:

DECLARE @tableVariableName TABLE 
(
    ID INT, Name VARCHAR(20) 
) 

3,2 Legen Sie Ihre XML-String in Tabelle Variable

INSERT INTO @tableVariableName 
SELECT 
    Finaldata.R.value ('(ID/text())[1]', 'INT') AS ID, 
    Finaldata.R.value ('(Name/text())[1]', 'VARCHAR(20)') AS Name 
FROM @MyInputXmlString.nodes ('//ArrayMyClass/MyClass') AS Finaldata (R) 

3,3 Schließlich diesen Tabellenwert einfügen in Ihre Tabelle

INSERT INTO MyTable (ID, Name)     
SELECT ID, Name   
FROM @tableVariableName 

Dies wird Ihren Aufwand, die Datenbank immer wieder zu drücken, mit einer for-Schleife speichern.

Ich hoffe, es wird Ihnen helfen

+0

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. –