如何在C#/ ADO.NET中将多行插入数据库?

时间:2011-11-12 19:01:00

标签: c# asp.net sql sql-server ado.net

我有一个DataTable,它有很多记录。

我尝试了以下代码来迭代DataTable并插入数据库,但是我收到一条错误消息,说明参数尚未声明:

       using (SqlCommand command = new SqlCommand(("My insert statement"), connection))
                    {

                        SqlParameter param1 = new SqlParameter();
                        SqlParameter param2 = new SqlParameter();

                        param1.ParameterName = "@ProductID";
                        param2.ParameterName = "@ID";

                        foreach (DataRow row in table.Rows)
                        {
                            param1.Value = row[0].ToString();
                            param2.Value = row[1].ToString();

                            command.ExecuteNonQuery();
                        }

                    }

有什么想法吗?请不要建议存储过程 - 我想通过这种方法或类似方法来做到这一点。

3 个答案:

答案 0 :(得分:1)

您需要将参数添加到命令中。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx

谨慎

如果你把你的代码放在你的第一次执行的foreach中的方式将会有效,然后下一个将失败,并显示一条错误消息,指出你已经有一个名为@ProductID / @ID的变量。

每次都需要清除参数。

See this for an example.

答案 1 :(得分:1)

查看SqlBulkCopy,它将允许您将Datatable直接传递到数据库。 Link

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
    bulkCopy.DestinationTableName = "dbo.TableYouWantToInsertTheRowsTo";

    try
    {
         // Write from the source to the destination.
         bulkCopy.WriteToServer(newProductsDataTable);
    }
    catch (Exception ex)
    {
         Console.WriteLine(ex.Message);
    }
}

答案 2 :(得分:0)

如果您使用的是SQL2008,那么整个List / object / datatable可以作为参数传递给存储过程。在这种情况下,您还需要在sql中声明相同的类。