C# 将多个对象插入MySQL
有没有其他方法可以将多个对象插入MySQL数据库,而不是此处所示的方法。这是可行的,但执行起来需要时间C# 将多个对象插入MySQL,c#,mysql,C#,Mysql,有没有其他方法可以将多个对象插入MySQL数据库,而不是此处所示的方法。这是可行的,但执行起来需要时间 using (MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connStr)) { //Goes thrue the List<object> foreach(List<obje
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();
}
开始
在Subject\u中插入项目值(Subject\u Id
,Projects\u Id
,Used
)(参数SubjectId,参数ProjectId,参数Used);
结束您考虑过用一个事务处理这些调用吗?您考虑过用一个事务处理这些调用吗?您可以尝试一下。在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();
}
Int64 Id=0;
使用(MySql.Data.MySqlClient.MySqlConnection conn=new MySql.Data.MySqlClient.MySqlConnection(connStr))
{
//浏览清单
conn.Open();
foreach(listSubject中的列表子对象)
{
MySql.Data.MySqlClient.MySqlCommand cmd=new MySql.Data.MySqlClient.MySqlCommand();
cmd.Connection=conn;
cmd.CommandText=“调用stp_InsertSubject(@param_SubjectId、@param_ProjectId、@param_Used);”;
cmd.Parameters.AddWithValue(“@param_subject”,转换为32(sub[0]);
cmd.Parameters.AddWithValue(“@param_ProjectId”,Convert.ToInt32(sub[1]);
cmd.Parameters.AddWithValue(“@param_Used”,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();
}
Int64 Id=0;
使用(MySql.Data.MySqlClient.MySqlConnection conn=new MySql.Data.MySqlClient.MySqlConnection(connStr))
{
//浏览清单
conn.Open();
foreach(listSubject中的列表子对象)
{
MySql.Data.MySqlClient.MySqlCommand cmd=new MySql.Data.MySqlClient.MySqlCommand();
cmd.Connection=conn;
cmd.CommandText=“调用stp_InsertSubject(@param_SubjectId、@param_ProjectId、@param_Used);”;
cmd.Parameters.AddWithValue(“@param_subject”,转换为32(sub[0]);
cmd.Parameters.AddWithValue(“@param_ProjectId”,Convert.ToInt32(sub[1]);
cmd.Parameters.AddWithValue(“@param_Used”,Convert.ToBoolean(sub[2]);
Id=(Int64)cmd.ExecuteScalar();
}
康涅狄格州关闭();
}
需要改进的地方有:
- 在环路外只打开一次连接(无需关闭
(使用时)
- 创建命令,在循环之前只分配一次连接
- 使用虚拟值在循环之前创建所有参数
- 仅在循环内赋值并调用ExecuteScalar()
使用(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=“调用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(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();
}
}
需要改进的地方很少:
- 在环路外只打开一次连接(无需关闭
(使用时)
- 创建命令,在循环之前只分配一次连接
- 使用虚拟值在循环之前创建所有参数
- 仅在循环内赋值并调用ExecuteScalar()
使用(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=“调用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(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();
}
}
您需要向我们展示stp_InsertSubject
做了什么来准确回答这个问题……您的Id=(Int64)cmd.ExecuteScalar()代码>每次在循环中都获得覆盖。您需要向我们展示stp_InsertSubject
的具体操作,以回答这个问题…您的Id=(Int64)cmd.ExecuteScalar()代码>每次在循环中都得到覆盖。诅咒我的慢手指!这可能是在不改变插入方法的情况下解决问题的最佳方法。诅咒我的慢手指!这可能是在不改变插入方法的情况下解决问题的最佳方法。为什么要使用伪值。为什么不直接用显式类型创建参数?@ConradFrix我试图给出一个示例,但无法正确格式化代码为什么要使用伪值。为什么不直接用显式类型创建参数?@ConradFrix我试图给出一个示例,但无法正确格式化代码
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();
}
}