2016-07-22 62 views
2

我試圖找出是否有執行方式的倍數值在SQL服務器中插入而使用的參數,要精確,有這樣的命令:插入帶有參數的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(); 

有沒有辦法執行多值單插入參數考慮到每個值的參數可能不同? (例如:tagID可能總是不同)

我一直在互聯網搜索,但迄今沒有運氣,在此先感謝,問候。

+0

TVP參數,臨時表。 –

+1

你可以使用一個表值參數:http://stackoverflow.com/questions/5595353/how-to-pass-table-value-parameters-to-stored-procedure-from-net-code –

回答

3

您可以使用表值參數:How to pass table value parameters to stored procedure from .net code

首先,創建類型,在SQL Server:

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

和C#代碼中插入數據:

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

太棒了!謝謝你的提示,這解決了這個問題。 – JCO9

0

您可以通過將數據作爲xml字符串發送並將其轉換爲sql中的存儲過程中的表來完成此操作。例如: 假設我派多行到一個SQL表中添加/更新那麼這裏的步驟:

  1. 轉換類或類的列表到一個XML字符串中使用下面的方法:

    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. 現在在發送數據到數據庫轉換您的類對象轉換爲XML字符串 (在這裏我使用實體框架在我的代碼,你可以做到這一點不使用它):

    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. 現在您的SQL代碼:

3.1聲明表變量:

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

3.2插入你的XML字符串轉換成表變量

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最後插入此表中的值到你的sql表中

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

這將節省您一次又一次使用for循環打擊數據庫的工作量。

希望它能幫助你

+0

雖然這可能會在理論上回答這個問題,[這將是更可取的](/ meta.stackoverflow.com/q/8259)在這裏包括答案的基本部分,並提供鏈接供參考。 –