加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

了解C#中的嵌套SQL

发布时间:2020-12-16 00:09:14 所属栏目:百科 来源:网络整理
导读:using (var connection = new SqlConnection(...)){ string sql = "SELECT * FROM tableA"; using (var command = new SqlCommand(sql,connection)) { using (var reader = command.ExecuteReader(...)) { //***************Sample Start string sql2 = "INS
using (var connection = new SqlConnection(...))
{
    string sql = "SELECT * FROM tableA";
    using (var command = new SqlCommand(sql,connection))
    {
        using (var reader = command.ExecuteReader(...))
        {
            //***************Sample Start
            string sql2 = "INSERT into tableB(column1) VALUES('"+reader["column1"]+"')";
            using (var command2 = new SqlCommand(sql2,connection))
            {
                ...
            } 
            //***************Sample End
        }
    }
}

通过使用上面的代码片段,我相信它是在C#中处理SQL的最佳实践.现在,我从tableA中检索记录列表后,对于我要插入tableB的每一行.

但是,这是一个例外

There is already an open DataReader associated with this Command which must be closed first

我知道这个问题可以通过创建另一个方法并从那里插入表中来解决,我想知道是否还有其他方法.感谢您的任何意见.

解决方法

您需要为插入使用不同的sql连接而不是选择…

……但我们可以做得更好.您可以将其重写为一个sql语句,如下所示:

INSERT into tableB(column1)
    SELECT column1 FROM tableA

然后像这样一次运行它:

string sql = "INSERT into tableB(column1,column2) SELECT column1,@othervalue As column2 FROM tableA;";
using (var connection = new SqlConnection(...))
using (var command = new SqlCommand(sql,connection))
{
    command.Paramters.Add("@othervalue",SqlDbType.NVarChar,50).Value = "something";

    connection.Open();
    command.ExecuteNonQuery();
}

单个sql语句通常要快得多,最终你也会得到更少的代码.我知道这可能是您真实查询的简化示例,但我向您保证:您可以将其全部重写为一个语句.

此外,有时您仍希望在插入或更新后进行一些客户端处理或显示新记录.在这种情况下,您仍然只需要向数据库发送一个调用,但在该单个调用中将有两个单独的sql语句.最终的代码看起来更像是这样的:

string sql = "INSERT into tableB(column1,@othervalue As column2 FROM tableA;"
sql += "SELECT columnn1,@othervalue As column2 FROM tableA;";

using (var connection = new SqlConnection(...))
using (var command = new SqlCommand(sql,50).Value = "something";

    connection.Open();
    using (var reader = command.ExecuteReader() )
    {
        while (reader.Read() )
        {
           //...
        }
    }
}

而且因为其他人提出了MARS(多个活动结果集),我会补充一点,虽然这可以工作,但我使用它进行插入/更新的结果好坏参半.当共享连接的所有内容只执行读取时,它似乎最有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读