Или каков рекомендуемый способ чтения и записи одновременно? Наличие двух открытых соединений - единственный способ? Это обычное приложение Windows Forms C # (.NET 3.5)
using (SqlConnection conn = new SqlConnection(connStr)) {
SqlCommand cmdRead = new SqlCommand("select stools from foo", conn);
SqlDataReader rdr = cmdRead.ExecuteReader();
SqlCommand cmdWrite = new SqlCommand("insert into bar values (@beer)", conn);
SqlParameter beer = new SqlParameter("@beer", SqlDbType.Int);
cmdWrite.Parameters.Add(beer);
while(rdr.Read()) {
int stools = rdr.GetInt32(0);
cmdWrite.Parameters["@beer"].value = stools;
//Next line fails for an open data reader associated to the "command"
cmdWrite.ExecuteNonQuery();
}
rdr.Close()
}
Это, OTOH, работает, но мне некрасиво (кроме открытия дополнительного соединения)
using (SqlConnection connR = new SqlConnection(connStr)) {
using (SqlConnection connW = new SqlConnection(connStr)) {
SqlCommand cmdRead = new SqlCommand("select stools from foo", connR);
SqlDataReader rdr = cmdRead.ExecuteReader();
SqlCommand cmdWrite = new
SqlCommand("insert into bar values (@beer)", connW);
SqlParameter beer = new SqlParameter("@beer", SqlDbType.Int);
cmdWrite.Parameters.Add(beer);
while(rdr.Read()) {
int stools = rdr.GetInt32(0);
cmdWrite.Parameters["@beer"].value = stools;
cmdWrite.ExecuteNonQuery();
}
rdr.Close()
}
}
В этом простом случае прочитайте все табуреты, сохраните их в списке, закройте читатель, а затем запишите, что они будут работать (если в базе данных не так много табуретов), но в более сложных случаях он начинается быть громоздким и требовательным к памяти, так что это тоже не желательно.