插入多个带有参数Sql Server的行

本文关键字:Sql Server 的行 参数 插入 | 更新日期: 2023-09-27 17:58:21

我正试图弄清楚是否有一种方法可以在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();

考虑到每个值的参数可能不同,是否有一种方法可以使用参数执行多值单次插入?(例如:标签ID可能总是不同)

我一直在网上搜索,但到目前为止没有运气,提前谢谢,问候。

插入多个带有参数Sql Server的行

您可以使用表值参数:如何将表值参数从.net代码传递到存储过程

首先,在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;
    }
}

您可以通过将数据作为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. 现在,在向数据库发送数据时,将类对象转换为xmlstring(这里我在代码中使用实体框架,你也可以不用它来完成):

    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循环一次又一次地访问数据库的工作量。

希望它能帮助你