【问题标题】:Executereader and execute non-query in a single connection in ado.net在 ado.net 中的单个连接中执行阅读器并执行非查询
【发布时间】:2011-10-12 05:18:53
【问题描述】:

下面的 sn-p 在同一个连接字符串中使用多个查询。首先,我从数据库中选择一些数据,然后在关闭 datareader(dr) 之前,我想做一些验证,所以如果满足我会在 dr 的 while 循环中将这些值插入到数据库中的表中。那里我收到错误,因为已经有一个打开的数据读取器,所以在关闭它之前我不能使用另一个查询。所以我暂时使用了另一个指向同一个数据库的连接字符串,我使用该连接对象(conn1)执行插入 qry。但是 wat 是不使用另一个连接字符串的另一种方法。 任何帮助将不胜感激。谢谢。

public XmlDocument LBS_Offer_Scheduler(string dev_token, float lat, float llong)
    {
        XmlDocument xml_doc = null;
        bool result = false;
        int row_affect = 0;
        int x = (int)Math.Truncate(lat);
        int y = (int)Math.Truncate(llong);

        string qry = "select Store_id,Store_Latitude,Store_Longitude from tbl_FB_Store_Details where Store_Latitude like '"
            + x + "%' and Store_Longitude like '" + y + "%'";
        conn.Open();
        cmd = new SqlCommand(qry, conn);
        dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            Store_Id = dr[0].ToString();
            str_dlat = dr[1].ToString();
            str_dlon = dr[2].ToString();
            double dlat = Convert.ToDouble(str_dlat);
            double dlon = Convert.ToDouble(str_dlon);
            dist_in_sqmts = obj_distance.distance(lat, llong, dlat, dlon);
            id = Convert.ToInt32(Store_Id);
            if (dist_in_sqmts < 200.00)
            {
                string insert_qry = "insert into tbl_FB_Offer_PushNote values('" + dev_token + "', "+ id + ",'" + DateTime.Now + "','N')";
                conn1.Open();
                cmd = new SqlCommand(insert_qry, conn1);
                row_affect = cmd.ExecuteNonQuery();
                conn1.Close();
            }
        }
        conn.Close();
        if (row_affect > 0)
            result = true;
        xml_doc = x_doc.result(result);
        return xml_doc;
    }

【问题讨论】:

    标签: c# sql-server-2008 ado.net connection-string sqldatareader


    【解决方案1】:

    您需要在连接字符串中设置 MultipleActiveResultSets=True。 见MSDN

    【讨论】:

    • 谢谢史蒂文。 MultipleActiveResultSets 让我的工作轻松多了。但它会减慢这个过程吗?我猜!
    • 在 CLR 过程中使用“context connection=true”时无法使用 MARS:social.msdn.microsoft.com/Forums/en-US/…
    【解决方案2】:

    您必须使用 DataSet 类 - SqlDataAdapterDataTable 从数据库中检索结果。

    string qry = "select Store_id,Store_Latitude,Store_Longitude
          from tbl_FB_Store_Details where Store_Latitude 
                like @x and Store_Longitude like @y";
    SqlCommand cmd=new SqlCommand(qry,conn);
    cmd.Parameters.AddWithValue("@x", x + "%");
    cmd.Parameters.AddWithValue("@y", y + "%");
    
    SqlDataAdapter adp=new SqlDataAdapter(cmd);
    DataTable dt=new DataTable();
    adp.Fill(dt);
    
    foreach(DataRow dr in dt.Rows)
     {
         Store_Id = dr[0].ToString();
         str_dlat = dr[1].ToString();
         str_dlon = dr[2].ToString();
         double dlat = Convert.ToDouble(str_dlat);
         double dlon = Convert.ToDouble(str_dlon);
         dist_in_sqmts = obj_distance.distance(lat, llong, dlat, dlon);
         id = Convert.ToInt32(Store_Id);
         if (dist_in_sqmts < 200.00)
          {
               .....
           }
     }
    

    【讨论】:

    • 很好的洞察力。这不能在数据阅读器中完成吗? cos 使用 datatable 和 dataset 使得编码不那么有说服力 na
    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多