C#,将多行插入 SQL 数据库

Posted

技术标签:

【中文标题】C#,将多行插入 SQL 数据库【英文标题】:C#, Inserting Multiple Rows Into An SQL Database 【发布时间】:2021-08-24 19:18:32 【问题描述】:

我有一个 Access 数据库。我正在使用 C# 和 Visual Studio 我试图在事务中插入几行。但是,我没有插入每一行,而是将第一个元素插入了多次。

我可以一次将数据插入“发票”表中的一行,因此该表处于正常工作状态。我包括下面的代码。这些行确实有不同的数据。调试器显示。

private void insertInvoiceItemsIntoDatabase(int tableNumber)

    string category, food;
    double price
    string connectionString = _databaseConnectionString; 
    
    using (OleDbConnection connection =
               new OleDbConnection(connectionString))
    
        OleDbCommand command = new OleDbCommand();
        OleDbTransaction transaction = null;

        // Set the Connection to the new OleDbConnection.
        command.Connection = connection;

        // Open the connection and execute the transaction.
        try
        
            connection.Open();

            // Start a local transaction with ReadCommitted isolation level.
            transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);

            command.Connection = connection;
            command.Transaction = transaction;

            command.CommandText = "Insert into Invoices (TableNumber, Category, Food, Price) VALUES (?,?,?,?)";

            command.CommandType = CommandType.Text;

            Order order;
            order = tables[tableNumber - 1].getOrder();
            List<MenuItem> items = order.deepCopyMenuItems();
            for (int i = 0; i < items.Count(); i++)
            
                FoodType ft =  items[i].getFoodType();
                category = "Main Course";
                if(ft == FoodType.maincourse)
                
                    category = "Main Course";
                else if(ft == FoodType.drink)
                
                    category = "Drink";
                else if(ft == FoodType.dessert)
                
                    category = "Dessert";
                

                food = items[i].getItemName();
                price = items[i].getItemPrice();

                command.Parameters.AddWithValue("TableNumber", tableNumber);
                command.Parameters.AddWithValue("Category", category);
                command.Parameters.AddWithValue("Food", food);
                command.Parameters.AddWithValue("Price", price);
                command.ExecuteNonQuery();
            
           
            transaction.Commit();
        
        catch (Exception ex)
        
            Console.WriteLine(ex.Message);
            try
            
                // Attempt to roll back the transaction.
                transaction.Rollback();
            
            catch
            
                // Do nothing here; transaction is not active.
            
        
    

【问题讨论】:

您正在使用单个命令并反复向其添加相同的参数。只需在for 循环的每次迭代中创建一个新的OleDbCommand 停止使用 AddWithValue() dbdelta.com/addwithvalue-is-evil SqlCommand Parameters Add vs. AddWithValue @OlivierRogier 在这种情况下不是。 Alejandro 的解决方案奏效了。 @Alejandro -- 谢谢!这为我解决了问题。 【参考方案1】:

在循环之前创建具有适当类型的参数。在循环中设置值。

        ...
        command.CommandText = "Insert into Invoices (TableNumber, Category, Food, Price) VALUES (?,?,?,?)";

        command.CommandType = CommandType.Text;
        command.Parameters.Add("TableNumber", /*param type*/);
        command.Parameters.Add("Category", /*param type*/);
        command.Parameters.Add("Food", /*param type*/);
        command.Parameters.Add("Price", /*param type*/);

        Order order;
        order = tables[tableNumber - 1].getOrder();
        List<MenuItem> items = order.deepCopyMenuItems();
        for (int i = 0; i < items.Count(); i++)
        
            FoodType ft =  items[i].getFoodType();
            category = "Main Course";
            if(ft == FoodType.maincourse)
            
                category = "Main Course";
            else if(ft == FoodType.drink)
            
                category = "Drink";
            else if(ft == FoodType.dessert)
            
                category = "Dessert";
            

            food = items[i].getItemName();
            price = items[i].getItemPrice();

            command.Parameters["TableNumber"].Value = tableNumber;
            command.Parameters["Category"].Value =  category;
            command.Parameters["Food"].Value =  food;
            command.Parameters["Price"].Value =  price;
            command.ExecuteNonQuery();
        
        ...

【讨论】:

由于 Alejandro 的解决方案对我有用,所以我现在正在使用它,但我将介绍这些“Add()”。感谢您的洞察力。

以上是关于C#,将多行插入 SQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 对象列表中的多行数据插入 Oracle 12 数据库中的表中

如何在 SQL Server CE 数据库中插入多行? [关闭]

如何使用 SQL 或 PLSQL 将多行数据插入 Oracle 中的表中?

SQL插入多行,foreach

Sql-Server用insert插入多行数据-语法和例子

使用jquery sql插入多行并且php不起作用