:: Не фоксом единым
c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
на C# пишу метод, которая по BindingSource обновляет таблицу или запись с конкретным ID в ней
Обновление таблицы идет через TableAdapter.
Сейчас работает нижеследующий код.
Как его можно оптимизировать, чтобы в else if не прописывать код для каждой таблицы?

public virtual void Fill(BindingSource bs, int? ID = null)
{
dsPort dsPort = (dsPort)bs.DataSource; //dsPort - dataset кокретного проекта
string cTable = bs.DataMember.ToLower();
if (cTable == "vi_ship")
{
Port.dsPortTableAdapters.vi_ShipTableAdapter ta = new dsPortTableAdapters.vi_ShipTableAdapter();
if (ID == null)
ta.Fill(dsPort.vi_Ship);
else
{
ta.ClearBeforeFill = false;
ta.FillByID(dsPort.vi_Ship, ID ?? 0);
ta.ClearBeforeFill = true;
}
}
else if (cTable == "v_agent")
{
Port.dsPortTableAdapters.v_AgentTableAdapter ta = new dsPortTableAdapters.v_AgentTableAdapter();
if (ID == null)
ta.Fill(dsPort.v_Agent);
else
{
ta.ClearBeforeFill = false;
ta.FillByID(dsPort.v_Agent, ID ?? 0);
ta.ClearBeforeFill = true;
}
}



Исправлено 2 раз(а). Последнее : AlexSSS, 06.08.18 23:36
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Если отказаться от TableAdapter...
Создать свой какой то класс доступа.
Создав в нем методы
FillAll()
и
FillRecord()
public virtual void Fill(int? ID = null)
{
if (ID == null)
FillAll();
else
FillRecord(id);
}

Полагаю совет не очень) Много в проекте пересматривать.
Но париться не придется при масштабировании


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
уже думал об этом
посмотрел код стандартного адаптера - пока передумал ;)

я только начинаю писать на C# и начинать с переписывания штатных средств кажется слишком самоуверенным ;)
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
AlexSSS
слишком самоуверенным
Нормально!)
Так ты что то готовое правишь, или просто разбираешься, свое ваяешь?
Если второе...
Я в самом начале, разбирался с SqlDataReader. Там твоя задача, легко решается.
Конечно, писанины поболе, но как то можно там все нагенерить) Не помню.
Если с 1...5 таблицами работа, то быстро все описывается. (основные моменты)
Все же, когда имя метода, связано с конкретным полем таблицы (а кажется так, у таблеадаптера. filBbySomeField() ), как то перегиб)


Как то уяснил, что в самом низу происходит, попробовав всякие промежутки, в конце концов, перешел на EF.
Все же много усилий экономит.


------------------




Исправлено 1 раз(а). Последнее : Аспид, 07.08.18 15:05
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Аспид
Так ты что то готовое правишь, или просто разбираешься, свое ваяешь?
свое. Это первый относительно большой проект на c#, где я пробую все нормально сделать, а не чтобы "просто работало" ;)
Хотя, есть опасения, что скоро на winforms станет тесно и придется переходить на WPF. И там, в какой-то степени, все придется снова начинать почти с нуля

Аспид
Я в самом начале, разбирался с SqlDataReader. Там твоя задача, легко решается.
Конечно, писанины поболе, но как то можно там все нагенерить) Не помню.
Если с 1...5 таблицами работа, то быстро все описывается. (основные моменты)
посмотрю. Insert, Update, Delete я уже реализовал через SqlCommand.
Осталось разобраться, как обновлять таблицы в датасете с сервера

Аспид
в конце концов, перешел на EF. Все же много усилий экономит.
пасиб на наводку, потом буду посмотреть.
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
AlexSSS
Insert, Update, Delete я уже реализовал через SqlCommand.
Осталось разобраться, как обновлять таблицы в датасете с сервера
Так это ж самое простое)
просто select * from table - упрощенно.
Конкретную запись получить, тоже просто.
Ну и подменить ее в дататабле.
Вот и весь твой функционал реализован)


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
AlexSSS
Хотя, есть опасения, что скоро на winforms станет тесно и придется переходить на WPF.
Тут я бы посоветовал сразу на веб смотреть.
Тот же asp.net mvc


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Аспид
Ну и подменить ее в дататабле.
как?вот это я пока как-то совсем слабо представляю.
если сканировать все записи и менять каждое поле, то это выйдет жутко тормознуто



Исправлено 1 раз(а). Последнее : AlexSSS, 07.08.18 16:30
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Ну не уверен.
datatable dt = new DataTable(nameDt);
dt.cleare();
SqlCommand cmd = new SqlCommand(твой_запрос, Connection);
cmd.CommandType = CommandType.Text;
Connection.Open();
SqlDataReader dataReader = cmd.ExecuteReader();
dt.Load(dataReader);
dataReader.Close();
Как то так


------------------




Исправлено 1 раз(а). Последнее : Аспид, 07.08.18 16:25
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
если это все примерно так, то это будет гораздо проще, чем победить стандартный tableadapter
пасиб, буду копать в этом направлении
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AlexSSS
я только начинаю писать на C# и начинать с переписывания штатных средств кажется слишком самоуверенным ;)

Тогда советую сразу забить на датасеты - это позавчерашний день.
EntityFramework, или какой Dapper для "лёгких" применений.

WinForms тоже совсем не в почёте нынче. Веб кругом, микросервисы и фронтэнд на JavaScript.

P.S. Насколько я помню это старьё, там просто предполагается сами DataTable использовать в качестве источника данных (да, можно через BindingSource - у него для того есть всё что надо), а изменения вносимые в них уже более-менее инфраструктура датасетная умеет запихивать обратно на сервер. Перегонять DataTable в нечто другое, а потом обратно для отправки на сервер - думаю не взлетит даже если и напишешь всю эту гору кода (добавишь ручное отслеживание всех изменений в свой объектный источник данных, либо же "сравнение" намалюешь строк DataTable с объектами в BindingSource).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
AlexSSS
Это первый относительно большой проект на c#, где я пробую все нормально сделать, а не чтобы "просто работало"
Да. Тут трудно не согласиться с Игорем.
Разобраться с EntityFramework будет быстрее, чем лепить что то свое.
Code First формирует, ясную структуру в проекте, сразу понятную (если ты и автор БД)
В результате, все общение с БД, как то... тебя не будет волновать.
Можно сосредоточиться на логике.

И еще, с чем не все согласны.
если сразу разделишь решение, на проекты Работы с данными, БЛ, и дизайн, потом можно взяв 2 первых, легко перенести решение, на веб.

Igor Korolyov
Перегонять DataTable в нечто другое, а потом обратно для отправки на сервер - думаю не взлетит
Почему? как то кажется и не очень сложно, в простых случаях.
Чтение любое. insert, update по 1й записи. Чего в большинстве случаев достаточно.
Не знаю, дружат ли DataTable c Linq.
Но по любому, EF далеко впереди. Да и изучать проще, меньше. Имеется ввиду, самое основное)
(А может это сейчас кажется)


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Igor Korolyov
Тогда советую сразу забить на датасеты - это позавчерашний день.
EntityFramework, или какой Dapper для "лёгких" применений.

WinForms тоже совсем не в почёте нынче. Веб кругом, микросервисы и фронтэнд на JavaScript.
Игорь, привет, рад тебя снова увидеть! ;)

И чего я сразу на этот форум не зашел, когда начал писать на c#?!
Съэкономил бы кучу времени и не пришлось бы разбираться с какими-то вещами. которые в будущем все равно уже не будут нужны

Dataset - в этом проекте я его буду использовать просто в качесте локального кэша базы. Insert, Update, Delete напрямую в базу у меня уже написаны через SqlCommand.
Аспид дал наводку как засунуть данные в датасет из базы, проверил, работает.
Основной интерфейс проекта уже сдавать через пару недель, так что пока сделаю уже понятным способом через датасет.
Потом засяду за изучение EntityFramework.

WinForms- пока для того, чтобы начать бегло писать на C#, пойдет ;)
Потом еще поизучаю, на что дальше переходить.



Исправлено 1 раз(а). Последнее : AlexSSS, 07.08.18 22:10
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Аспид
Как то так

Огромное спасибо, ты меня сейчас просто спас!
Проверил - работает. Потрачу несколько часов на написание своего класса, который будет обновлять датасет с сервера. Зато получу предсказуемое и прозрачное решение и не надо будет извращаться с этим кривым TableAdapter
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Адаптер не для того предназначен... Точнее далеко не только для того. Он занимается перекачкой данных из DataTable в подключенную СУБД. Генерируя, либо храня в своих свойствах нужные INSERT/UPDATE/DELETE команды.

Аспид
Не знаю, дружат ли DataTable c Linq
Linq работает с любой коллекцией или массивом. Другое дело что вынуть 100500 записей а потом локально LINQ запросом обрабатывать - по сути просто обёртка над тупыми for() циклами - весьма неэффективно. А вот НЕ вынимая ничего из БД, построить на основе linq запрос к БД (по сути трансформировать дерево linq а в SQL запрос) и уже его исполнить - для датасетов так не выйдет...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Igor Korolyov
Адаптер не для того предназначен...
Мне кажется, все нормально. Посмотри 1й вопрос. Алекс решает задачу, на новом языке, понятным ему способом.
И этот способ, устаревший, но не запрещенный.)))
Более того, сразу взяться за EF, и в дальнейшем не знать о DataTable,DataSet, BindingSource... то же не очень, наверное.
А просто "почитать", не то же самое , что "пощупать")))
Все ИМХО. По себе сужу. А у каждого свой склад мозга)
Какое то время, не доверял EF.
Первые эксперименты, показали его тормознутость)))
Но когда разобрался, все ему простил)
AlexSSS
Закончится срочность, возьми этот же проект за основу (дизайн то есть)
И всю работу с данными, переделай на EF.
Разберешься, и сделаешь все по новому, лаконичнее, и с большими возможностями модернизации.


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
оформил в виде класса получение данных из базы в датасет. На общем классе заморачиваться не стал, этот заточен под конкретный проект.
insert, update, delete уже реализованы в другом месте.
Сейчас вычищаю все упоминания о стандартном tableAdapter из проекта ;)
Пока все отлично работает, допиливать класс буду по ходу работы, как минимум, надо будет добавить обновление данных с учетом timestamp и очистку таблицы перез обновлением


namespace Port.ClassLibrary
{
class alxTableAdapter
{
private Dictionary<String, String> dTables = new Dictionary<String, String>();
public DataSet DataSet = new dsPort();
public alxTableAdapter()
{
foreach (DataTable table in DataSet.Tables)
{
dTables.Add(table.TableName, "");
}
}
public void Fill(string cTable, int? ID = null)
{
DataTable dataTable = this.DataSet.Tables[cTable];
if (dTables[cTable] == "")
{
String cCommand0 = "SELECT 1=1";
foreach (DataColumn col in dataTable.Columns)
{
string cField = col.ColumnName.ToString().ToUpper();
cCommand0 += ", "+col.ColumnName;
}
cCommand0 = cCommand0.Replace("1=1,", "");
cCommand0 += " FROM " + cTable;
dTables[cTable] = cCommand0;
}
using (SqlConnection cConnection = new SqlConnection(global::Port.Properties.Settings.Default.csPortKLPD))
{
cConnection.Open();
SqlCommand cCommand = cConnection.CreateCommand();
cCommand.CommandText = dTables[cTable];
if (ID != null)
{
cCommand.CommandText += " WHERE ID = " + ID.ToString();
}
SqlDataReader dataReader = cCommand.ExecuteReader();
dataTable.Load(dataReader);
cConnection.Dispose();
dataReader.Close();
}
}
}
}



Исправлено 1 раз(а). Последнее : AlexSSS, 08.08.18 09:39
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Аспид
Закончится срочность, возьми этот же проект за основу (дизайн то есть)
И всю работу с данными, переделай на EF.
Разберешься, и сделаешь все по новому, лаконичнее, и с большими возможностями модернизации.
Начну изучать EF. Реализовать его на этом и следующем несложном (чтобы можно было безболезненно поэксперементировать) проекте - решу по ходу.



Исправлено 1 раз(а). Последнее : AlexSSS, 08.08.18 10:32
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Глянул код... и охватил ужас)))
Тем более это живой проект.
AlexSSS
у меня до конца года завал с загрузкой
Обычная проблема.
Все же совет, прислушаться к Игорю)
вот как вся эта суета, выглядит с EF.

*Контекст
using System.Data.Entity;
namespace Domain.Entities
{
public class AbzContext : DbContext
{
public AbzContext()
: base("name=AbzConnection")
{
}
public DbSet<Person> Persons { get; set; }
... аналогично все объекты БД
}
*Класс Invoice
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Domain.Entities
{
[Table("Person")]
public class Person
{
[Key]
[HiddenInput(DisplayValue = false)]
public int PersonId { get; set; }
[HiddenInput(DisplayValue = false)]
public int CustId { get; set; }
[Display(Name = "Контакт")]
public string Name { get; set; }
[Display(Name = "Телефон")]
public string Tel { get; set; }
public string Email { get; set; }
}
}
Комменты мои, и боюсь сильно грешат с терминологией
Но думаю, сам код, предельно ясен.
А теперь получение данных
List < Person > persons= db.Persons.Where(p => p.CustId == custId).ToList();
Все! Очевидно, что можно выстроить любое разумное получение данных
Person person= db.Persons.Where(p=>PersonId==id);
Изменение данных.
Person person= db.Persons.Find(id);
person.Name= name;
...
db.Entry(person).State = EntityState.Modified;
db.SaveChanges();
Собственно можешь внутри ПО Person крутить как хошь. class Person - суть тот же дататабле, только через EF, увязанный с БД.

Думаю за время написания приведенного тобой класса, разберешься и с EF.
Он сам генерит контекст, и класс Person.
Конечно, можно зайти и подправить (при новой генерации, все исправления пропадут, сохраняй где то, потом разберешься))) )

В общем стоит потратить немного времени, движение вперед, будет ОЧЕНЬ большим.
ИМХО)


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
-



Исправлено 2 раз(а). Последнее : AlexSSS, 08.08.18 13:25
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика