Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Sql Server参数插入多行_C#_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

C# 使用Sql Server参数插入多行

C# 使用Sql Server参数插入多行,c#,sql-server,database,sql-server-2008,C#,Sql Server,Database,Sql Server 2008,我正在尝试找出是否有一种方法可以在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.

我正在尝试找出是否有一种方法可以在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可能总是不同的


我一直在互联网上搜索,但到目前为止运气不好,提前谢谢,您好。

您可以使用表值参数:

首先,在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表中发送多个要添加/更新的行,那么以下是步骤:

使用以下方法将类或类列表转换为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();
    }
}
现在,在向数据库发送数据时,将类对象转换为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.2将xml字符串插入表变量

插入@tableVariableName 选择 Finaldata.R.value'ID/text[1],'INT'作为ID, Finaldata.R.value“Name/text[1]”,名称为“VARCHAR20” 从@MyInputXmlString.nodes'//ArrayMyClass/MyClass'作为最终数据R 3.3最后将此表值插入sql表

插入到MyTable ID、名称中 选择ID、名称 来自@tableVariableName 这将节省您使用for循环反复访问数据库的时间


希望它能帮助您

TVP参数,临时表。您可以使用表值参数:太好了!谢谢你的提示,这就解决了问题。别忘了在循环结束时将新行添加到表中。myTvpTable.Rows.Addrow;虽然这在理论上可以回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。