【问题标题】:SqlCommand - Select multiple rows and INSERT them into tableSqlCommand - 选择多行并将它们插入到表中
【发布时间】:2013-09-06 12:28:21
【问题描述】:

您好,我正在尝试从表中选择多行并将它们插入另一个我认为可以按以下方式完成:

这部分应该选择多行:

 string sqcom = "SELECT text,castka,rocnik FROM zajsluz WHERE akce='"+tentoradek+"' and rocnik='"+klientClass.Rocnik()+"'";

                    SqlCommand sc = new SqlCommand(sqcom,spojeni);

                    spojeni.Open();
                    sc.ExecuteNonQuery();
                    spojeni.Close();

这就是我尝试从 SqlCommand sc 中插入选定行的方式:

  string sqlcom2 = "INSERT INTO zajsluz(akce,text,castka,rocnik) values (@akce,@text,@castka,@rocnik)";

                    SqlCommand sc2 = new SqlCommand(sqlcom2, spojeni);
                    sc2.Parameters.AddWithValue("@akce", klientClass.Rocnik());
                    sc2.Parameters.AddWithValue("@text", ); // I dont know how to define this parameter according to what was selected in SqlCommand sc
                    spojeni.Open();
                    sc2.ExecuteNonQuery();
                    spojeni.Close();

现在我想知道如何从 SqlCommand "sc" 中插入 "@text" (sc2) 参数值,请您帮我解决这个问题吗?

提前致谢

编辑:¨

这是我尝试过的:

  DataSet dt2 = new DataSet();
                    SqlDataAdapter SDA2 = new SqlDataAdapter("SELECT text,castka FROM zajsluz WHERE akce='" + tentoradek + "' and rocnik='" + klientClass.Rocnik() + "'", spojeni);
                    SDA2.Fill(dt2);
                    spojeni.Close();
 string sqlcom2 = "INSERT INTO zajsluz(akce,text,castka,rocnik) values (@akce,@text,@castka,@rocnik)";

                    SqlCommand sc2 = new SqlCommand(sqlcom2, spojeni);
                    sc2.Parameters.AddWithValue("@akce", zakce.Text);
                    sc2.Parameters.AddWithValue("@rocnik", klientClass.Rocnik());
                    sc2.Parameters.AddWithValue("@text", dt2.Tables[0].Columns["text"]);
                    sc2.Parameters.AddWithValue("@castka", dt2.Tables[0].Columns["castka"]);
                    spojeni.Open();
                    sc2.ExecuteNonQuery();
                    spojeni.Close();

【问题讨论】:

  • 您需要在 ExecuteReader() 返回的第一个查询上使用 SqlDataReader,然后您需要遍历阅读器。
  • 先执行select语句并将其存储在数据集中。然后使用ds.tables[0].[columnname]传递参数并插入。

标签: c# sql sql-server


【解决方案1】:

可以直接使用insert into & select组合

 string sqcom = "INSERT INTO zajsluz(akce,text,castka,rocnik) SELECT rocnik,text,castka,rocnik FROM zajsluz WHERE akce='"+tentoradek+"' and rocnik='" + klientClass.Rocnik() + "'"

    SqlCommand sc = new SqlCommand(sqcom,spojeni);

                        spojeni.Open();
                        sc.ExecuteNonQuery();
                        spojeni.Close();

【讨论】:

  • 感谢您的回复,我可以定义(在执行 INSERT INTO 时)例如 akce 为以下参数:sc2.Parameters.AddWithValue("@akce", klientClass.Rocnik());因为我需要更改 2 列中的值。
  • 是的,当然你可以做到。在选择部分将其值设置为@columnname,然后使用AddWithValue设置参数值
【解决方案2】:

如果可能的话,我会尝试在单个语句中执行此操作,即您没有对两个语句之间的数据做任何事情。

string sqlcom = "INSERT INTO zajsluz(akce,text,castka,rocnik) SELECT akce,text,castka,rocnik FROM zajsluz WHERE akce='"+tentoradek+"' and rocnik='"+klientClass.Rocnik()+"'";

SqlCommand sc = new SqlCommand(sqcom,spojeni);

                spojeni.Open();
                sc.ExecuteNonQuery();
                spojeni.Close();

【讨论】:

    【解决方案3】:

    另一种选择是使用 SQL DataSet/DataTable,它允许您查询并从 SQL 返回整个表或一组行,然后您可以对其进行更新、删除或插入。在下面的 MS 文章中有描述:http://support.microsoft.com/kb/326009/en

    【讨论】:

    • 感谢您的回答,能否请您看看我的编辑,为什么在这种情况下不存在映射?非常感谢
    【解决方案4】:

    您的问题的摘要答案:

    StringBuilder query = new Stringbuilder();
    query.AppendLine("INSERT INTO zajsluz(akce,text,castka,rocnik) ");
    query.AppendLine("(SELECT @akce, text, castka, @rocnik");
    query.AppendLine("FROM zajsluz WHERE akce=@Tentoradek");
    query.AppendLine("AND rocnik=@rocnik)");
    
    SqlCommand sc2 = new SqlCommand(sqlcom2, spojeni);
    sc2.Parameters.AddWithValue("@Tentoradek", tentoradek);
    sc2.Parameters.AddWithValue("@akce", zakce.Text);
    sc2.Parameters.AddWithValue("@rocnik", klientClass.Rocnik());
    
    spojeni.Open();
    sc2.ExecuteNonQuery();
    spojeni.Close();
    

    【讨论】:

    • 这会消除您在阅读DataSet时出现的问题/错误对象引用... ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多