Executereader и выполнить не-запрос в одном соединении в ado.net - PullRequest
3 голосов
/ 12 октября 2011

В приведенном ниже фрагменте используются несколько запросов внутри одной строки подключения. сначала я выбираю некоторые данные из БД, затем перед закрытием устройства чтения данных (dr) я хотел бы сделать некоторые проверки, поэтому, если они будут выполнены, я вставлю эти значения в таблицу в БД в цикле while из dr. Там я получаю сообщение об ошибке, так как уже есть открытый накопитель данных, поэтому я не могу использовать другой запрос перед его закрытием. поэтому я временно использовал другую строку подключения, указывающую на ту же базу данных, и я выполняю вставку qry, используя этот объект подключения (conn1). но wat - это другой способ сделать это без использования другой строки подключения. Любая помощь будет принята с благодарностью. Thx.

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;
    }

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Вам необходимо установить MultipleActiveResultSets = True в строке подключения.См MSDN

0 голосов
/ 12 октября 2011

Вы должны использовать DataSet class - SqlDataAdapter и DataTable для получения результата из базы данных.

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)
      {
           .....
       }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...