在 MySQL 中插入多个对象
本文关键字:对象 插入 MySQL | 更新日期: 2023-09-27 18:33:52
除了此处显示的方式之外,是否有其他方法可以将多个对象插入MySQL数据库。这有效,但需要时间来执行。
using (MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connStr))
{
//Goes thrue the List<object>
foreach(List<object> sub in listSubject)
{
MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = "CALL stp_InsertSubject(@param_SubjectId, @param_ProjectId, @param_Used);";
cmd.Parameters.AddWithValue("@param_SubjectId",Convert.ToInt32(sub[0]) );
cmd.Parameters.AddWithValue("@param_ProjectId", Convert.ToInt32(sub[1]));
cmd.Parameters.AddWithValue("@param_Used", Convert.ToBoolean(sub[2]) );
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
我的存储过程:
CREATE DEFINER=`mortenstarck`@`%` PROCEDURE `stp_InsertSubject`(param_SubjectId int(45), param_ProjectId int(45), param_Used tinyint(1))
开始插入Subject_has_Projects
(Subject_Id
、Projects_Id
、Used
)值(param_SubjectId、param_ProjectId、param_Used);END
需要改进的几点:
- 只需在环路外打开一次连接(无需关闭使用)
- 创建命令,在循环前仅分配一次连接
- 使用虚拟值在循环之前创建所有参数
- 只分配循环中的值并调用 ExecuteScalar()
using(MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connStr))
{
conn.Open();
MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = "CALL stp_InsertSubject(@param_SubjectId, @param_ProjectId, @param_Used);";
cmd.Parameters.AddWithValue("@param_SubjectId",0 );
cmd.Parameters.AddWithValue("@param_ProjectId", 0);
cmd.Parameters.AddWithValue("@param_Used", false );
foreach(List<object> sub in listSubject)
{
cmd.Parameters["@param_SubjectId"].Value = Convert.ToInt32(sub[0]) ;
cmd.Parameters["@param_ProjectId"].Value = Convert.ToInt32(sub[1]);
cmd.Parameters["@param_Used"].Value = Convert.ToBoolean(sub[2]);
Id = (Int64)cmd.ExecuteScalar();
}
}
你可以试试。在循环foreach
打开连接。这将节省每次循环中打开和关闭连接的时间。这将提高性能。
Int64 Id = 0;
using (MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connStr))
{
//Goes through the List<object>
conn.Open();
foreach(List<object> sub in listSubject)
{
MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = "CALL stp_InsertSubject(@param_SubjectId, @param_ProjectId, @param_Used);";
cmd.Parameters.AddWithValue("@param_SubjectId",Convert.ToInt32(sub[0]) );
cmd.Parameters.AddWithValue("@param_ProjectId", Convert.ToInt32(sub[1]));
cmd.Parameters.AddWithValue("@param_Used", Convert.ToBoolean(sub[2]) );
Id = (Int64)cmd.ExecuteScalar();
}
conn.Close();
}
多次打开和关闭 SQL 连接有多糟糕?确切的效果是什么?
您是否考虑过用单个事务来包围这些调用?