Неверное значение перечисления и SqlDataAdapter.Update(DataTable)
Я получаю ArgumentOutOfRangeException "Значение перечисления StatementType, 4, недопустимо" при попытке обновить таблицу данных через SqlDataAdapter.Update(DataTable)
, Согласно http://msdn.microsoft.com/en-us/library/system.data.statementtype(v=vs.100).aspx, возможные значения перечисления: Select, Insert, Update, Delete и Batch, и Я предполагаю, что Batch имеет значение 4.
Я не совсем уверен, как это значение устанавливается, так как оно принадлежит объекту SqlRowUpdatedEventArgs, который я получаю в SqlRowUpdatedEventHandler, или почему оно недопустимо.
По сути, я создаю DataTable из XmlNode, возвращаемого из вызова веб-службы, сортирую представление данных, а затем выпускаю обновление партиями по 200.
XmlNode result = null;
using (LeadService.ClientService service = new LeadService.ClientService())
{
const string UserName = "SomeUserName";
const string Password = "SomePassword";
const int ChildReportId = 746;
result = service.GetReportResults(UserName, Password, ChildReportId, null);
}
if (result.InnerXml != "")
{
DataTable leads = new DataTable();
leads.Columns.Add("ID1", typeof(int));
leads.Columns.Add("ID2", typeof(string));
leads.Columns.Add("CREATEDDATE", typeof(DateTime));
foreach (XmlNode n in result.ChildNodes)
{
DataRow row = leads.NewRow();
row["ID1"] = n["Id1"].InnerText;
row["ID2"] = n["Id2"].InnerText;
row["CREATEDDATE"] = n["DateAdded"].InnerText;
leads.Rows.Add(row);
}
leads.DefaultView.Sort = "CREATEDDATE";
DataTable newTable = leads.DefaultView.ToTable();
newTable.AcceptChanges();
foreach (DataRow r in newTable.Rows)
{
r.SetModified();
}
const string Update = "UPDATE SOMETHING SET ID1 = @ID1 WHERE ID2 = @ID2";
using (SqlConnection con = new SqlConnection(Dal.GetConnectionString("CONNECTIONSTRING")))
{
SqlDataAdapter adap = new SqlDataAdapter();
adap.UpdateCommand = new SqlCommand(Update);
adap.UpdateCommand.Parameters.Add("@ID1", SqlDbType.NVarChar, 75, "ID1");
adap.UpdateCommand.Parameters.Add("@ID2", SqlDbType.VarChar, 18, "ID2");
adap.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
adap.UpdateBatchSize = 200;
adap.RowUpdated += new SqlRowUpdatedEventHandler(adap_RowUpdated);
adap.Update(newTable);
}
}
Вот обработчик события:
private static void adap_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
_rowsProcessed += e.RowCount;
_recordsAffected += e.RecordsAffected;
}
2 ответа
Doh! Я не установил соединение в объекте SqlCommand! Не уверен насчет причины странной ошибки, но изменение перегрузки конструктора прояснило ситуацию:
using (SqlConnection con = new SqlConnection(Dal.GetConnectionString("CONNECTIONSTRING")))
{
SqlDataAdapter adap = new SqlDataAdapter();
adap.UpdateCommand = new SqlCommand(Update, con);
// ...
adap.Update(newTable);
}
Возможно, вы думаете, что вы добавляете строки вместо обновления. Попробуй переехать SetModified
к вашей петле:
foreach (XmlNode n in result.ChildNodes)
{
DataRow row = leads.NewRow();
row["ID1"] = n["Id1"].InnerText;
row["ID2"] = n["Id2"].InnerText;
row["CREATEDDATE"] = n["DateAdded"].InnerText;
leads.Rows.Add(row);
row.SetModified();
}