Проблемы параллелизма в C # .net - SQL-соединение, а затем изменения ADO.net - PullRequest
1 голос
/ 16 сентября 2009

У меня есть программа на c # .net, в которой мне нужно сначала вставить данные в таблицу, используя соединение SQL, а затем настроить тот же набор данных, используя ADO.net. Я не уверен, как убедиться, что вставка через соединение SQL завершена, прежде чем делать изменения ado.net. Я получаю нарушение параллелизма, когда я пробую код ниже. Я предполагаю, что это проблема состояния гонки.

Я получаю ошибку нарушения параллелизма в точке оператора UpdateAll, и мне кажется, что я не могу обойти ее

Спасибо за помощь.

Ниже приведен пример кода с изменениями SQL и ado.net, значительно упрощенными.

  try
  {

   String deleteQuery = "DELETE FROM dbo.TABLENAME";

   String reportQuery = @"

  INSERT INTO TABLENAME 
  (
  COLUMN1, 
  COLUMN2, 
  COLUMN3
  )

  SELECT 
  COLUMN1,
  COLUMN2,
  COLUMN3
  FROM OTHERTABLES

  ";



            SqlConnection ReportConnect = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
            SqlCommand cmd = new SqlCommand();

            cmd.CommandType = CommandType.Text;
            cmd.Connection = ReportConnect;
            cmd.CommandTimeout = Convert.ToInt32(Properties.Settings.Default.ReportTimeout.ToString());


            ReportConnect.Open();

            cmd.CommandText = deleteQuery;

            cmd.ExecuteNonQuery();

            cmd.CommandText = reportQuery;

            cmd.ExecuteNonQuery();

            ReportConnect.Close();

            ReportConnect.Close();

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);

        }



        try
        {
            foreach (DataRow dr in DataSet.TABLENAME)
            {
            dr[0] = whatever;
            dr[0] = 100;
            dr[0] = 42.42;
            }
        }
        catch (Exception ax)
        {
            MessageBox.Show(ax.Message);
        }
        finally
        {
            this.tableAdapterManager.UpdateAll(this.DataSet);
        }

Ответы [ 2 ]

2 голосов
/ 03 декабря 2009

Проблема в том, что «tableAdapterManager» создается и открывается до изменения данных (с помощью команды sql). Если вы создаете SqlDataAdapter с помощью мастера, по умолчанию режим параллелизма является оптимистичным (поэтому оператор update и delete обнаруживает, изменилась ли база данных ...) и завершается с ошибкой, которую вы выставляете.

Вы можете решить эту проблему в окне мастера «Генерировать операторы SQL», нажать «Дополнительные параметры» и снять флажок «Использовать оптимистичный параллелизм».

Также вы можете изменить это из файла form.designes.cs, найти UpdateCommand SqlDataAdapter и убедиться, что при создании SqlParameter для DataRowVersion задано значение «По умолчанию» или использовать другой конструктор.

0 голосов
/ 16 сентября 2009

Теоретически ExecuteNonQuery не завершится, пока не будет запущен SQL, что сделает ваш вопрос спорным. Если бы вы сознательно выполняли асинхронно, это было бы другое дело, но это не так. Конечно, вы все равно должны знать о проблемах, вызванных несколькими одновременными пользователями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...