Направление, которое я выбрал, было близко к тому, на что я надеялся, но возможно, но этого достаточно, чтобы я посчитал предложение SuperSaiyen использовать AMF / ORM лучшим решением для новых / новых проектов.
Для примера / обсуждения, скажем, я работаю с таблицей Person
в базе данных, и у меня есть типизированный набор данных с именем PeopleDataSet
, который имеет PersonTableAdapter
и PersonDataTable
.
READ будет выглядеть следующим образом в веб-сервисе .NET:
[WebMethod]
public PeopleDataSet.PersonDataTable GetAllPeople() {
var adapter = new PersonTableAdapter();
return adapter.GetData();
}
... который в Flex даст вам result
объект, который вы можете использоватькак это:
// FLEX (AS3)
something.dataProvider = result.Tables.Person.Rows;
Проверьте ссылку, которую я вставил в вопрос, чтобы узнать больше о том, как Flex справляется с этим.
CREATE / UPDATE - Это частьЯ должен был выяснить, и почему я задал этот вопрос.Сначала Flex на этот раз:
// FLEX (AS3)
var person:Object = {
PersonID: -1, // -1 for CREATE, actual ID for UPDATE
FirstName: "John",
LastName: "Smith",
BirthDate: "07/19/1983",
CreationDate: "1997-07-16T19:20+01:00" // need W3C DTF for Date WITH Time
};
_pplWebSvcInstance.SavePerson(person); // do the web method call
(Об обработке этих дат W3C см. Как проанализировать дату в формате ISO во Flex (AS3)? )
Вкл.Что касается веб-службы .NET, то хитрость заключалась в том, чтобы выяснить правильный тип параметра веб-метода.Если вы просто наберете Object
, а затем войдете в вызов с помощью отладчика, вы увидите, что .NET считает, что это XmlNode[]
.Вот то, что я рассчитывал сделать:
[WebMethod]
public int SavePerson(PeopleDataSet p) {
// Now 'p' will be a PeopleDataSet with a Table called 'p' that has our data
// row(s) (just row, in this case) as string columns in random order.
// It WILL NOT WORK to use PeopleDataSet.PersonDataTable as the type for the
// parameter, that will always result in an empty table. That is why the
// LoadFlexDataTable utility method below is necessary.
var adapter = new PersonTableAdapter();
var tbl = new PeopleDataSet.PersonDataTable();
tbl.LoadFlexDataTable(p.Tables[0]); // see below
// the rest of this might be familiar territory for working with DataSets
PeopleDataSet.PersonRow row = tbl.FirstOrDefault();
if (row != null) {
if (row.PersonID > 0) { // doing UPDATE
row.AcceptChanges();
row.SetModified();
}
else { // doing CREATE
row.CreationDate = DateTime.UtcNow; // set defaults here
row.IsDeleted = false;
}
adapter.Update(row); // database call
return row.PersonID;
}
return -1;
}
Теперь, утилита Kluge, которую вы видели выше, называется.Я сделал это как метод расширения, который является необязательным:
// for getting the Un-Typed datatable Flex gives us into our Typed DataTable
public static void LoadFlexDataTable(this DataTable tbl, DataTable flexDataTable)
{
tbl.BeginLoadData();
tbl.Load(flexDataTable.CreateDataReader(), LoadOption.OverwriteChanges);
tbl.EndLoadData();
// Probably a bug, but all of the ampersand (&) in string columns will be
// unecessarily escaped (&) - kluge to fix it.
foreach (DataRow row in tbl.Rows)
{
row.SetAdded(); // default to "Added" state for each row
foreach (DataColumn col in tbl.Columns) // fix & to & on string columns
{
if (col.DataType == typeof(String) && !row.IsNull(col))
row[col] = (row[col] as string).Replace("&", "&");
}
}
}