2012-04-12 2 views
0

Я использую Visual C# Studio 2010 Express и пытаюсь обновить мою таблицу. Каждый раз, когда я пытаюсь обновить 1 запись, я получаю «Нарушение параллелизма: UpdateCommand затронул 0 ожидаемых 1 записей». Я задал этот вопрос во сне в коде, но в некоторых ответах на некоторые честные вопросы я немного разочаровался. Link to my question at D.I.CКак обновить DatabaseDataSet с помощью TableAdapter?

Я принял последние предложения и изменил свой код, чтобы повлиять на набор данных .. или поэтому думаю, но я все еще сталкиваюсь с одновременной проблемой. Вот мой обновленный код.

 private void SendNewPotentialsToZoho() 
    { 
     Console.WriteLine("Trying to send potentials to Zoho"); 

     var newZoho = potentialDatabaseDataSet.Potential.DefaultView; 
     var poster = new ZohoPoster(ZohoPoster.Fields.Potentials, ZohoPoster.Calls.insertRecords); 
     var count = 0; 

     //newZoho.RowFilter = "IsNull(ZohoID,'zoho') = 'zoho'"; 
     newZoho.RowFilter = "Soid = 1234"; 
     poster.Debugging = !UseZoho; 
     for (int i = 0; i < 1; i++)//newZoho.Count; i++) 
     { 
      var xmlString = Potential.GetPotentialXML(newZoho[i][1], newZoho[i][2], newZoho[i][4], newZoho[i][3], newZoho[i][5], newZoho[i][7], newZoho[i][0]); 
      Console.WriteLine("Sending New Records to Zoho: {0}", xmlString); 
      poster.PostItem.Set("xmlData", xmlString); 
      var result = poster.Post(3); 
      Console.WriteLine(result); 
      if (!string.IsNullOrEmpty(result)) 
      { 
       try 
       { 
        var rowLength = newZoho[i].Row.ItemArray.Length; 
        var rowOffset = Math.Abs((int)newZoho[i][rowLength - 1])-1; 

        potentialDatabaseDataSet.Potential.Rows[rowOffset]["ZohoID"] = ReadResult(result); 
        potentialTableAdapter.Update(potentialDatabaseDataSet.Potential.Rows[rowOffset]); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("Failed to update: {0}", ex.Message); 
       } 
      } 
     } 
    } 

Битовая переменная, называемая плакат, отлично работает. он возвращает результат, похожий на xml, который имеет мой zohoID, который я разбираю и пытаюсь сохранить. В целях тестирования я пытаюсь обновить только одну запись. Я получаю сообщение об ошибке с помощью потенциального файла TableAdapter.Update (потенциалDatabaseDataSet). Для меня странно, что я использую очень похожий код, чтобы сделать новый рекорд, и он отлично работает. Infact это то, как я сделал строку с Soid = 1234. Я единственный, у кого есть доступ к этой программе, и насколько я знаю, она не многопоточная, поэтому я просто не понимаю, почему у нее проблемы с параллелизмом. Пожалуйста, помогите :)

EDIT

Хорошо, так что я играл с ним некоторые и обнаружили, что если добавить EndEdit к нему я не получаю одновременный выпуск. С другой стороны, хотя мой связанный datagridview показывает обновленные данные, данные фактически не обновляются. Так что это не значит, что я вернусь к квадрату. Думаю, я на самом деле довольно близко. Я буду из памяти на этом маленьком кусочке кода, так что не ненавижу, если это не right..it это в основном за идею о том, что я говорю о

 for (int i = 0; i < 5; i++) //emailRecord.Count; i++) 
     { 
      if (ZohoEmail.EmailExpectedShipping(emailRecord[i], "12/10/2012")) 
      {//true means that the email went through just fine 
       try 
       { 
        var rowLengh = emailRecord[i].Row.ItemArray.Length; 
        var rowOffset = Math.Abs((int)emailRecord[i][rowLengh - 1]) - 1; 

        potentialDatabaseDataSet.Potential.Rows[rowOffset][17] = true; //17 is Expected Email 
        potentialDatabaseDataSet.Potential.Rows[rowOffset].AcceptChanges(); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("Failed to update: {0}", ex.Message); 
       } 
      } 
      potentialTableAdapter.Update(potentialDatabaseDataSet.Potential); 
     } 

    } 

ответ

0

Ну, я думаю, я понял это. Большое спасибо Марчину за то, что он очень помог мне в этой проблеме. Вы были правы, когда проблема была в моем сгенерированном адаптере таблицы. Я закончил тем, что сделал свой собственный, основанный на том, что был автогенерированный код. Вот мой код, просто у кого-то еще есть проблема с Autogenerated code.

using System; 
using System.Data.SqlServerCe; 
using System.Data.Common; 
using System.Data; 

namespace Zoho 
{ 
    public partial class PotentialTableAdapter 
    { 
     SqlCeDataAdapter _adapter; 
     SqlCeConnection _connection; 
     SqlCeTransaction _transaction; 
     SqlCeCommand[] _commandCollection; 
     DataTable _table; 

     public PotentialTableAdapter() 
     { 
      ClearBeforeFill = true; 
      InitConnection(); 
      InitAdapter(); 
      InitCommandCollection(); 
      FillTable(); 
     } 

     public bool ClearBeforeFill {get; set;} 
     public SqlCeDataAdapter Adapter 
     { 
      get 
      { 
       if ((this._adapter == null)) 
       { 
        this.InitAdapter(); 
       } 
       return this._adapter; 
      } 
     } 
     public SqlCeConnection Connection 
     { 
      get 
      { 
       if (_connection == null) 
        InitConnection(); 
       return _connection; 
      } 
     } 
     public SqlCeTransaction Transaction 
     { 
      get 
      { 
       return _transaction; 
      } 
      set 
      { 
       _transaction = value; 
       for (int i = 0; (i < CommandCollection.Length); i = (i + 1)) 
       { 
        CommandCollection[i].Transaction = value; 
       } 
       Adapter.DeleteCommand.Transaction = value; 
       Adapter.InsertCommand.Transaction = value; 
       Adapter.UpdateCommand.Transaction = value; 
      } 
     } 
     public SqlCeCommand[] CommandCollection 
     { 
      get 
      { 
       if ((this._commandCollection == null)) 
       { 
        InitCommandCollection(); 
       } 
       return this._commandCollection; 
      } 
     } 
     public DataTable Table 
     { 
      get 
      { 
       if (_table == null) 
        FillTable(); 
       return _table; 
      } 
     } 

    } 
} 
using System.Data.Common; 
using System.Data.SqlServerCe; 
using System.Data; 

namespace Zoho 
{ 

    partial class PotentialTableAdapter 
    { 
            private void InitAdapter() 
    { 
     this._adapter = new SqlCeDataAdapter(); 
     this._adapter.TableMappings.Add(GetTableMapping()); 
     this._adapter.SelectCommand = new SqlCeCommand("SELECT * FROM Potential", Connection); 
     this._adapter.InsertCommand = GetCommand(@"INSERT INTO [Potential] ([Soid], [SalesRep], [Account], [ClosingDate], [Amount], [Stage], [SourceId], [Product], [FirstName], [Email], [CustomerPO], [ZohoID], [WorkOrder], [ExpectedShip], [TrackingNumber], [DependencyID], [ProcessEmail], [ExpectedEmail], [ShippedEmail]) VALUES (@p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16, @p17, @p18, @p19)"); 
     this._adapter.UpdateCommand = GetCommand(@"UPDATE [Potential] SET [Soid] = @p1, [SalesRep] = @p2, [Account] = @p3, [ClosingDate] = @p4, [Amount] = @p5, [Stage] = @p6, [SourceId] = @p7, [Product] = @p8, [FirstName] = @p9, [Email] = @p10, [CustomerPO] = @p11, [ZohoID] = @p12, [WorkOrder] = @p13, [ExpectedShip] = @p14, [TrackingNumber] = @p15, [DependencyID] = @p16, [ProcessEmail] = @p17, [ExpectedEmail] = @p18, [ShippedEmail] = @p19 WHERE (([NCPotentialKey] = @p20))"); 
    } 
        private void InitConnection() 
    { 
     this._connection = new SqlCeConnection(Zoho.Properties.Settings.Default.PotentialDatabaseConnectionString); 
    } 
         private void InitCommandCollection() 
    { 
     _commandCollection = new SqlCeCommand[1]; 
     _commandCollection[0] = new SqlCeCommand("SELECT * FROM Potential", Connection); 

    } 
         private void FillTable() 
    { 
     _table = new DataTable(); 
     Adapter.Fill(_table); 
    } 

                               private DataTableMapping GetTableMapping() 
    { 
     var tableMapping = new DataTableMapping(); 

     tableMapping.SourceTable = "Table"; 
     tableMapping.DataSetTable = "Potential"; 
     tableMapping.ColumnMappings.Add("Soid", "Soid"); 
     tableMapping.ColumnMappings.Add("SalesRep", "SalesRep"); 
     tableMapping.ColumnMappings.Add("Account", "Account"); 
     tableMapping.ColumnMappings.Add("ClosingDate", "ClosingDate"); 
     tableMapping.ColumnMappings.Add("Amount", "Amount"); 
     tableMapping.ColumnMappings.Add("Stage", "Stage"); 
     tableMapping.ColumnMappings.Add("SourceId", "SourceId"); 
     tableMapping.ColumnMappings.Add("Product", "Product"); 
     tableMapping.ColumnMappings.Add("FirstName", "FirstName"); 
     tableMapping.ColumnMappings.Add("Email", "Email"); 
     tableMapping.ColumnMappings.Add("CustomerPO", "CustomerPO"); 
     tableMapping.ColumnMappings.Add("ZohoID", "ZohoID"); 
     tableMapping.ColumnMappings.Add("WorkOrder", "WorkOrder"); 
     tableMapping.ColumnMappings.Add("ExpectedShip", "ExpectedShip"); 
     tableMapping.ColumnMappings.Add("TrackingNumber", "TrackingNumber"); 
     tableMapping.ColumnMappings.Add("DependencyID", "DependencyID"); 
     tableMapping.ColumnMappings.Add("ProcessEmail", "ProcessEmail"); 
     tableMapping.ColumnMappings.Add("ExpectedEmail", "ExpectedEmail"); 
     tableMapping.ColumnMappings.Add("ShippedEmail", "ShippedEmail"); 
     tableMapping.ColumnMappings.Add("NCPotentialKey", "NCPotentialKey1"); 

     return tableMapping; 

    } 
              private SqlCeCommand GetDeleteCommand() 
    { 
     var deleteCommand = new SqlCeCommand(); 
     deleteCommand.Connection = this.Connection; 
     deleteCommand.CommandText = "DELETE FROM [Potential] WHERE (([NCPotentialKey] = @p1))"; 
     deleteCommand.CommandType = CommandType.Text; 
     var parameter = new SqlCeParameter("@p1", SqlDbType.Int, 0, ParameterDirection.Input, false, 0, 0, "NCPotentialKey", DataRowVersion.Original, null); 
     deleteCommand.Parameters.Add(parameter); 

     return deleteCommand; 
    } 
     private SqlCeCommand GetCommand(string text) 
     { 
      var command = new SqlCeCommand(text); 
      command.Connection = this.Connection; 
      command.Parameters.Add(new SqlCeParameter("@p1", SqlDbType.Int, 0,  ParameterDirection.Input, true, 0, 0, "Soid",   DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p2", SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "SalesRep",  DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p3", SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "Account",  DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p4", SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "ClosingDate", DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p5", SqlDbType.Money, 0, ParameterDirection.Input, true, 0, 0, "Amount",  DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p6", SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "Stage",   DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p7", SqlDbType.Int, 0,  ParameterDirection.Input, true, 0, 0, "SourceId",  DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p8", SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "Product",  DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p9", SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "FirstName",  DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p10",SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "Email",   DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p11",SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "CustomerPO", DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p12",SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "ZohoID",  DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p13",SqlDbType.Int, 0,  ParameterDirection.Input, true, 0, 0, "WorkOrder",  DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p14",SqlDbType.DateTime, 0, ParameterDirection.Input, true, 0, 0, "ExpectedShip", DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p15",SqlDbType.NVarChar, 0, ParameterDirection.Input, true, 0, 0, "TrackingNumber",DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p16",SqlDbType.Int, 0,  ParameterDirection.Input, true, 0, 0, "DependencyID", DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p17",SqlDbType.Bit, 0,  ParameterDirection.Input, true, 0, 0, "ProcessEmail", DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p18",SqlDbType.Bit, 0,  ParameterDirection.Input, true, 0, 0, "ExpectedEmail", DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p19",SqlDbType.Bit, 0,  ParameterDirection.Input, true, 0, 0, "ShippedEmail", DataRowVersion.Current, null)); 
      command.Parameters.Add(new SqlCeParameter("@p20",SqlDbType.Int, 0,  ParameterDirection.Input, true, 0, 0, "NCPotentialKey",DataRowVersion.Original, null)); 

      return command; 
     } 
    } 
} 

сейчас для моей обертки класс. Я считаю, что это очень полезно для этого. с использованием системы; с использованием System.Data.SqlServerCe; с использованием System.Data;

namespace Zoho 
{ 
    public class DatabaseConnection 
    { 
     PotentialTableAdapter table; 
     public DatabaseConnection() 
     { 
      table = new PotentialTableAdapter(); 
     } 
     public DataTable Table 
     { 
      get 
      { 
       return table.Table; 
      } 
     } 

     public void Update() 
     { 
      try 
      { 
       Console.Write("Attemping to update database: "); 
       table.Adapter.Update(Table); 
       Console.WriteLine("Success"); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Fail: {0}", ex.Message); 
      } 
     } 

    } 
} 

и, наконец, фрагмент кода, который действительно имеет значение. Тот, который Марцин помог мне разобраться. На самом деле это очень просто.

 DatabaseConnection AllPotentials = new DatabaseConnection(); 
     var newZoho = AllPotentials.Table.DefaultView; 
     var poster = new ZohoPoster(ZohoPoster.Fields.Potentials, zohoPoster.Calls.insertRecords); 

     newZoho.RowFilter = "IsNull(ZohoID,'zoho') = 'zoho'"; 
     poster.Debugging = !UseZoho; //UseZoho= false which turns debugging on 

     for (int i = 0; i < 1; i++)//newZoho.Count; i++) 
     { 
      var xmlString = Potential.GetPotentialXML(newZoho[i]); 
      Console.WriteLine("Sending New Records to Zoho: {0}", xmlString); 
      poster.PostItem.Set("xmlData", xmlString); 
      var result = poster.Post(3); 
      Console.WriteLine(result); 
      if (!string.IsNullOrEmpty(result)) 
      { 
       try 
       { 
        newZoho[i].Row["ZohoID"] = ReadResult(result); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("Failed to update: {0}", ex.Message); 
       } 
      } 
     } 
     try 
     { 
      Console.Write("Trying to update the database after getting zoho: "); 
      AllPotentials.Update(); 
      Console.WriteLine("Success"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Failed: {0}", ex.Message); 
     } 

Я попробовал его, и он сказал, что успех, так что я открыл базу данных в другой программе и низкий, и вот моя подделка данных имеет Zoho идентификатор в нем :) я так рада. Теперь я могу запустить эту программу. Единственная проблема, с которой я столкнулся сейчас, - это то, что в моем datagridview оно отображается только как 4 или 5 записей вместо 201 записи (и я просто подумал об этом, ставлю, что фильтр имеет soemthign делать с этим!). Итак, хорошо, чтобы закончить мою программу сейчас, когда она работает! :) Еще раз спасибо Марчину за то, что вы терпеливы и помогаете мне. Поскольку вы сказали мне, что проблема была в моем столеAdapter, я собираюсь отметить вопрос, как вам ответил.

0

Вы не можете обновить только одну строку , Адаптер данных позволяет обновлять таблицы, а не строки. Таким образом, вместо

potentialTableAdapter.Update(potentialDatabaseDataSet.Potential.Rows[rowOffset]); 

использования

potentialTableAdapter.Update(potentialDatabaseDataSet.Potential); 

EDIT

Я не совсем уверен, что вы пытаетесь достичь здесь:

var rowLength = newZoho[i].Row.ItemArray.Length; 
var rowOffset = Math.Abs((int)newZoho[i][rowLength - 1])-1; 

Это выглядит, как вы сначала получают количество столбцов, что лучше:

var rowLength = potentialDatabaseDataSet.Potential.Columns.Count; 

затем вы подсчитываете номер строки на основе значения в последнем столбце и получаете строку 1 перед значением. Это то, чего я не понимаю, почему? Также вы подсчитываете смещение строки на основе представления.

Почему вы просто не использовать:

newZoho[i].Row["ZohoID"] = ReadResult(result); 
potentialTableAdapter.Update(potentialDatabaseDataSet.Potential); 

вместо подсчета какой строки вы должны обновить?

Я считаю ZohoID является иностранным ключом, который существует в базе данных до обновления?

EDIT 2

Я думаю, что проблема с автоматическим адаптером таблицы. Сначала попробуйте tử ряд обновлений в том, что при сильном типа так:

((PotentialRow)newZoho[i].Row).ZohoID = ReadResult(result); 

И попробуйте изменить запрос обновления для адаптера набора данных. Автоматические адаптеры данных генерируют очень уродливые запросы. Изменить предложение where в запросе обновления только для рядов только первичный ключ (ID) теперь все значения.

+0

Ну, я попробовал его в и из цикла for, и я все еще получаю проблему параллелизма. Я должен сказать, что я считаю, что можно обновить 1 строку, поскольку мой адаптер таблицы дает мне возможность для обновления (строка DataRow), а также (строки DataRow []). –

+0

См. Мой отредактированный ответ – Marcin

+0

Причина, по которой я делала подсчет строк и т. Д., Заключалась в том, что последняя переменная в ItemArray была смещением строки, которое эта конкретная строка исходила из всей таблицы. В этом случае значение было равно -21. Очевидно, что -21 не является допустимой строкой в ​​моей базе данных. Таким образом, я подсчитал с первой записи, и было 21 запись, чтобы добраться до нового Zoho [i]. это означает, что в массиве, основанном на 0, я должен был бы сделать это 20. Я не знал о бит столбца. И это на самом деле выглядит так, как будто это сработает, потому что оно вернет 11, а смещение строки будет в столбце 11 (на нулевом массиве), поэтому спасибо –

Смежные вопросы