2016-07-22 38 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)在这里包括答案的基本部分,并提供链接供参考。 –