Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Автор: MagistrAnatol
Дата сообщения: 29.07.2009 15:46
Omicron_Persey_8
я использовал мастер подключения.
есть задача в которой одно поле бд не редаткируется пользователем напрямую
к примеру я удаляю запись из таблицы не физически а есть поле IS_DELETED которое равно 0/1 ну и соответсвующий селект, вот мне и надо
реализовать не .RemoveCurent а
что-то типа етого
mdDS.Tables["OPERACII"].Rows[(int)oPERACIIBindingSource.Current]["IS_DELTED"]=0;
но выдает ошибку
пока что не разобрался из синтаксисом,мать чет не так написал, а что именно??
Автор: BlackVetal
Дата сообщения: 30.07.2009 05:25
MagistrAnatol
Давно я писал на стандартных компонентах - поэтому точно не скажу. Но наскока я помню создавал отдельный проект - Dataset. В нем уже реализовывал подключение, таблицы и SqlDataAdapter. В форме подключался к DataSet и вызывал в зависемости от ситуации нужную команду (Select, Insert и т.д.). И если не ошибаюс там можно было создавать несколько команд для каждого типа действия с данными. Также там есть возможность в качестве команды использовать хранимые процедуры. Omicron_Persey_8
К сожелению я в свое время тоже не нашел другого решения ... хотя в той ситуации (подключался к 1С v8.0) это было не столь актуально. Но yf будущее хотелось бы узнать - может есть какой-нить еще способ ...
Автор: Omicron_Persey_8
Дата сообщения: 30.07.2009 08:24
MagistrAnatol

Цитата:
mdDS.Tables["OPERACII"].Rows[(int)oPERACIIBindingSource.Current]["IS_DELTED"]=0;

Что за ошибку пишет? На первый взгляд, должно на (int)oPERACIIBindingSource.Current падать, так как там содержится сама запись, а не ее номер.
Автор: MagistrAnatol
Дата сообщения: 30.07.2009 09:51
Omicron_Persey_8
да ругается именно на опредиление позиции в таблице.
Я уже пробывал так
int CurRec = oPERACIIDataGrid.CurrentRowIndex;
mdDS.OPERACII.Rows[CurRec].Field<int>("IS_DELETED")=0;
но пишет шо
Ошибка    1    Левая часть выражения присваивания должна быть переменной, свойством или индексатором

Автор: MagistrAnatol
Дата сообщения: 30.07.2009 14:10
блин,ребята, как я вам сочуствую, писать на шарпе приложение с базой по сравнению
с борландовскими продуктами такое извращение, сикоко ненужных телодвижений надо делать шо ето капец.
По моему вопросу для новой записи наконец-то нашол вроде работающий код
DataRow newRow = mdDS.Tables["OPERACII"].NewRow();
newRow["DATA"] = DateTime.Now;
newRow["IS_DOLG"] = 0;
newRow["OPER_MOD_DATE_TIME"] = DateTime.Now;
newRow["IS_DELETED"] = 0;
newRow["IS_KPK"] = 1;
mdDS.Tables["OPERACII"].Rows.Add(newRow);

// oPERACIIBindingSource.AddNew();
Zemly.frmOper operaciiEditViewDialog = Zemly.frmOper.Instance(this.oPERACIIBindingSource);

if (operaciiEditViewDialog.ShowDialog() == DialogResult.OK)
но ето вариант для новой записи, а теперь как
все ето прикрутить для редактирования -
DataRow newRow = mdDS.Tables["OPERACII"].NewRow(); ???????
Автор: Omicron_Persey_8
Дата сообщения: 30.07.2009 19:46
MagistrAnatol
Сочувствия нам не надо. Борландовские продукты рулят из-за того, что для вас написано большое количество компонентов.

Цитата:
но ето вариант для новой записи, а теперь как
все ето прикрутить для редактирования -

Как почти везде в .NET очень просто:

Код: mdDS.Tables["OPERACII"].Rows[14]["Field"] = "Чего-то там";
Автор: BlackVetal
Дата сообщения: 31.07.2009 05:45
MagistrAnatol
Omicron_Persey_8
Никакого извращения нет - я давно использую библиотеку компонент C1 (ComponentOne) - В ней очень много полезных вещей реализовано иммено для работы с данными. Код сокращается очень сильно (по сравнению при работе с стандартными компонентами). Я хочу сказать - если поискать для себе набор компонент, который будет удовлетворять потребности, то еще не знаю у кого компоненты будут удобнее в Борланде или на C#. А ваабще это философский вопрос - где удобнее или быстрее или практичние.
Автор: Omicron_Persey_8
Дата сообщения: 31.07.2009 07:14
BlackVetal
Ну, подобного добра навалом: и Exeed, и DevExpress, и 10Tec, и Aspose... А, Telerik еще забыл упомянуть. Все вещи красивые, мощные и функциональные. Вот только дороговато, меньше 200$ за лицензию не встретишь.
Автор: MagistrAnatol
Дата сообщения: 31.07.2009 08:27
Немного флуда - но я не говорю о шарпе под винду, а долблюсь с компакт фреймворком
а там даже в стандартных компонентах такое ограничение по функционалу шо жуть как
ваще народ пишет под кпк.
Omicron_Persey_8
mdDS.Tables["OPERACII"].Rows[14]["Field"] = "Чего-то там"; ето ручное указание
номера строки а мне надо определить на какой строке находиться курсор и опять же в том самом борланде мне не надо беспокоиться где курсор чтобы отредактировать ячейку
таблицы - если я двигаюсь по гриду курсор таблицы автоматом идет за движение по гриду.

Цитата:
А ты DataSet мастером создавал?
да


Добавлено:
да и по ходу еще и такой вопрос - я никак не могу въехать в логику.
вот код - я добавляю новую запись а потом сразу же ее редактирую
private void menuItem2_Click(object sender, EventArgs e)
{
DataRow newRow = mdDS.Tables["OPERACII"].NewRow();
newRow["DATA"] = DateTime.Now;
newRow["IS_DOLG"] = 0;
newRow["OPER_MOD_DATE_TIME"] = DateTime.Now;
newRow["IS_DELETED"] = 0;
newRow["IS_KPK"] = 1;
mdDS.Tables["OPERACII"].Rows.Add(newRow);
Zemly.frmOper operaciiEditViewDialog = Zemly.frmOper.Instance(this.oPERACIIBindingSource);
if (operaciiEditViewDialog.ShowDialog() == DialogResult.OK)
{
oPERACIIBindingSource.EndEdit();
oPERACIITableAdapter.Update(mdDS);
this.oPERACII_DETALTableAdapter.Fill(this.mdDS.OPERACII_DETAL);
this.oPERACII_DETALTableAdapter.FillBy(this.mdDS.OPERACII_DETAL);
}
else
{
oPERACIIBindingSource.CancelEdit();
}


}

private void menuItem3_Click(object sender, EventArgs e)
{
mdDS.Tables["OPERACII"].Rows[oPERACIIBindingSource.Position]["IS_DELETED"] = 1;
oPERACIIBindingSource.EndEdit();
oPERACIITableAdapter.Update(mdDS);
this.oPERACII_DETALTableAdapter.Fill(this.mdDS.OPERACII_DETAL);
this.oPERACII_DETALTableAdapter.FillBy(this.mdDS.OPERACII_DETAL);

}

и получаю ошибку
$exception    {"Concurrency violation: the UpdateCommand affected 0 of the expected 1 records."}    System.Exception {System.Data.DBConcurrencyException}
что я не так делаю и почему при добавлении новой строки у меня не обновляются данные в гриде.Точнее обновляются токо те шо выдает метод Fill - селект из одной таблицы с кучей колонок для привязки со справочниками.Неприкольно смотреть на грид
с числами
FillBy - я делал селект из нескольких таблиц, использовать токо его не могу так как не достаточно хорошо знаю шапр шоб самому написать методы инсерт/апдейт/делете таблицы да и еще и постоянно путаюсь с борландом - там апдейт ето редактирование таблицы а не запись Пост в борланде
По борландовской логике если откинуть транзакции я должен сделать
Table1->Append();
.......
Table1->Post(); если правильно написан запрос для селекта и рефреша то ваще больше ничего делать не надо, ну иногда после поста приходиться писать
Table1->Refresh(); or Table1->CloseOpen(false);
ни у редактируй сразу же - никаких орграничений доступа- единственное что приходит в голову - ето то что я тестирую приложение через емулятор а в нем записи не записываются физически в таблицу, не знаю почему, чет мелкософт недомудрил.
метод Fill - ето открытие таблицы?

Автор: Omicron_Persey_8
Дата сообщения: 31.07.2009 10:23
MagistrAnatol
Раз DataSet создвал мастером, значит студия тебе сделала специальный класс и потому к полям можешь обращаться через ((класс объекта mdDS.OPERACIIRow)mdDS.OPERACII.Rows[0]).IS_DELETED = 1; (могу ошибиться в названиях полей)

Метод Fill нужен для того, чтобы при помощи TableAdapter'а заполнить DataSet или DataTable. По умолчанию он просто копирует таблицу источника данных. Кроме этого, можно добавлять свои методы получения данных при помощи написания SQL-запроса. Также, у TableAdapter'a есть свойства: SelectCommand, InsertCommand, UpdateCommand, и DeleteCommand. Там зранятся запросы, которые реально будут вызваны для соответствующего действия (выборки, вставки, обновления и т. д.). Запросы SQL-ные. Переписывать очень рекомендую, так как студия генерит их очень плохо.


Добавлено:
Concurency violation возникает, когда пытаетесь редактировать уже измененную запись, но не сохраненную. Например в базе запись: [Name="John", Age=45]. Fill'ом кидаете эту информацию в DataSet. Меняете ее в DataSet'е на [Name="John", Age=54]. В то же самое время, кто-то в базе меняет эту же запись на [Name="John", Age=90]. При попытке обновления базы из DataSet'а ни фига не обновиться, потому как DataSet помнит, что читал запись, где Age был равен 45. Вывод: переписать UpdateCommmand так, чтобы он искал запись НЕ ПО ВСЕМ ПОЛЯМ, как он делает по умолчанию, а только, например, по первичному ключу.
В общем случае пробуйте помещать обновление таблицы в try-блок, ловить DBConcurrencyException и в его свойствах смотреть, чего ему не хватает
Автор: blaro
Дата сообщения: 01.08.2009 00:02
Люди помогите решить 2 маленьких проблемы.
1) У меня есть функция которая ищет в тексте, заданный текст и выделяет в цвете. Функция работает нормально но когда я ввожу новое значение, прежнее выделение остается. Функция Deselect() не помогает. Чем можно это исправить?
2) У меня есть другая функция которая конвертирует текст в шестнадцатиричное число, и наоборот. Так вот, конвертировать текст в число это не проблема (даже юникод), а вот обратно из шестьнадцаричного числа в юникод это проблема. Прога выдает обычние ASCII символы. Как исправить это?
Вот код функции:

Код:
private void btnth_Click(object sender, EventArgs e)
{
string hex1 = "", hex2 = "";
switch (hexflag)
{
case 0: //Convert chars to hex
foreach (char c1 in rtb1.Text)
{
int tmp = c1;
hex1 += string.Format("{0:x4}", (uint)System.Convert.ToInt32(tmp.ToString())) + " ";
}
foreach (char c2 in rtb2.Text)
{
int tmp = c2;
hex2 += string.Format("{0:x4}", (uint)System.Convert.ToInt32(tmp.ToString())) + " ";
}
rtb1.Text = hex1.ToUpper();
rtb2.Text = hex2.ToUpper();
hexflag = 1;
break;
case 1:
/*Convert hex to chars*/
string temp = rtb1.Text, temp2 = rtb2.Text;
for (int i = 0; i < rtb1.TextLength; i += 5)
{
hex1 += System.Convert.ToChar(System.Convert.ToInt32(temp.Substring(i + 2, 2), 16)).ToString();
}
for (int j = 0; j < rtb2.TextLength; j += 5)
{
hex2 += System.Convert.ToChar(System.Convert.ToInt32(temp2.Substring(j + 2, 2), 16)).ToString();
}
rtb1.Text = hex1;
rtb2.Text = hex2;
hexflag = 0;
break;
default:
MessageBox.Show("Error");
break;
}
}
Автор: Omicron_Persey_8
Дата сообщения: 01.08.2009 07:51
blaro
По первому вопросу сходу не скажу, смотреть надо. А по второму - запросто. Ты когда во входной строке почему-то вместо 4 цифр числа берешь только последние 2. Например, кириллическая 'М' имеет hex код 041c. Твоя прога при преобразовании возьмет только 1с, преобразует в код 28, а это символ разделителя файлов, то есть символ непечатный. Правильно так:

Код: hex1 += System.Convert.ToChar(System.Convert.ToInt32(temp.Substring(i, 4), 16)).ToString();
Автор: Lihonosov
Дата сообщения: 01.08.2009 11:29
blaro

Цитата:
1) У меня есть функция которая ищет в тексте, заданный текст и выделяет в цвете. Функция работает нормально но когда я ввожу новое значение, прежнее выделение остается. Функция Deselect() не помогает. Чем можно это исправить?

Код функции Deselect() покажите.
Автор: gsseriy
Дата сообщения: 01.08.2009 11:42
Помогите знающие люди.
Мне необходимо чтобы моя программа эмулируя мышку нажимала кнопку в другом приложении.
Ниже приведен код функции, он работает нормально. Но стороннее приложение время от времени при эмуляции нажатия проверяет состояние кнопки мыши. Как установить кнопку мыши в состояние нажато?

public static void SetMessage(int xx, int yy,IntPtr ww)
{

mouse_event(MouseFlags.Absolute | MouseFlags.LeftDown, xx, yy, 0, ww);
int xrnd = gen.Next(5);
Thread.Sleep(50 + xrnd);
mouse_event(MouseFlags.Absolute | MouseFlags.LeftUp, xx, yy, 0, ww);
}
Автор: blaro
Дата сообщения: 01.08.2009 11:45
Lihonosov

Цитата:
Код функции Deselect() покажите.

richTextBox1.Deselectall();
Вот и вся функция....
Omicron_Persey_8
Благодарю за помощь

Автор: Lihonosov
Дата сообщения: 01.08.2009 23:22
blaro

Цитата:
richTextBox1.Deselectall();
Вот и вся функция....

TextBoxBase..::.DeselectAll - метод:
Указывает, что значение свойства SelectionLength равно нулю, так что в элементе управления нет выбранных знаков.
Т.е. можно, например так:


Код: private void DeselectButton_Click(object sender, EventArgs e)
{
richTextBox1.SelectAll();
richTextBox1.SelectionBackColor = Color.White;
richTextBox1.DeselectAll();
}
Автор: BlackVetal
Дата сообщения: 03.08.2009 08:13
Omicron_Persey_8
MagistrAnatol
Omicron_Persey_8 прав - лучший вариант использовать команды sqladapter - insertCommand, updateCommand, deleteCommand и Fill (SelectCommand) - имхо при изменении стуктуры бд - достачно будет поменять sqladapter: в случае MagistrAnatol неоходимо будет менять и код программы. Можно еще вместо комманд использовать хранимые процедуры - при изменении бд во многих случаях требуется только изменение этих хранимых процедур.
Автор: TeXpert
Дата сообщения: 03.08.2009 11:05
Вопрос знатокам:
SQL Server 2005, нетипизированный DataSet. Через SqlDataAdapter (CommandBuilder) сбрасываю изменения в базу, и обнаружил странную вещь -- часто изменения записываются после второго нажатия на кнопку (вызова метода, который и записывает). Почему так происходит?
Автор: Omicron_Persey_8
Дата сообщения: 03.08.2009 12:14
BlackVetal
Если изменяется структура БД, то код по-любому надо будет менять. 100%, что где-нибудь в коде к полю по имени обращаешься. Я все-таки предпочитаю типизированный DataSet, обновить его можно за пару минут, к тому же все обращения к несуществующим полям отлавливаются на этапе компиляции. И если поковыряться в классе, который сгенерит студия для типизированного DataSet'а, то прога прибавит в производительности.


Добавлено:
TeXpert
А как вы это определили? Вполне вероятно, что клиентская прога не успела обновленные данные перечитать (как и SQL Server Management Studio). Да и обновление процесс не мгновенный.
Автор: MagistrAnatol
Дата сообщения: 03.08.2009 17:10
вроде с присвоением разобрался,но есть другая проблемка - я реализую
мастер-детал конструкцию(связка через форегин кей) - все создавал мастером - база скл компакт.
записи бодавляются все путем
oper_fkBindingSource.AddNew();
Zemlya.frmDetal operacii_detalEditViewDialog = Zemlya.frmDetal.Instance(this.oper_fkBindingSource);
operacii_detalEditViewDialog.ShowDialog();
this.oPERACII_DETALTableAdapter.Update(this.mdDS.OPERACII_DETAL);
this.oPERACII_DETALTableAdapter.FillBy(this.mdDS.OPERACII_DETAL);

но при попытке обновыть детал таблицу получаю ошибку
return this.Adapter.Update(dataTable);
[ OPERACII_DETAL,PK_OPERACII_DETAL_78EYBARRFNU8Z43KTBL8 ]
Автор: Omicron_Persey_8
Дата сообщения: 03.08.2009 21:11
MagistrAnatol
Ну когда вы научитесь тексты ошибок писать? Дежурного телепата сегодня нет.
Автор: MagistrAnatol
Дата сообщения: 04.08.2009 08:59
Omicron_Persey_8
ошибки такие ругается на
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public virtual int Update(mdDS.OPERACII_DETALDataTable dataTable) {
return this.Adapter.Update(dataTable);
}

SqlCeException не обработано
[ OPERACII_DETAL,PK_OPERACII_DETAL_78EYBARRFNU8Z43KTBL8 ]
+        $exception    {" [ OPERACII_DETAL,PK_OPERACII_DETAL_78EYBARRFNU8Z43KTBL8 ]"}    System.Exception {System.Data.SqlServerCe.SqlCeException}
+        this    {Zemlya.mdDSTableAdapters.OPERACII_DETALTableAdapter}    Zemlya.mdDSTableAdapters.OPERACII_DETALTableAdapter
+        dataTable    {OPERACII_DETAL}    Zemlya.mdDS.OPERACII_DETALDataTable
стек вызовов
>    Zemlya.exe!Zemlya.mdDSTableAdapters.OPERACII_DETALTableAdapter.Update(Zemlya.mdDS.OPERACII_DETALDataTable dataTable = {OPERACII_DETAL}) Строка 2720 + 0x7 байт    C#
    Zemlya.exe!Zemlya.frmMain.toolBar1_ButtonClick(object sender = {System.Windows.Forms.ToolBar}, System.Windows.Forms.ToolBarButtonClickEventArgs e = {System.Windows.Forms.ToolBarButtonClickEventArgs}) Строка 113 + 0x11 байт    C#
Автор: BlackVetal
Дата сообщения: 04.08.2009 09:09
Omicron_Persey_8

Цитата:
Если изменяется структура БД, то код по-любому надо будет менять. 100%,

несовсем точно выразился я - смотря какие изменения: при добавлении/удалении/изменении типа - да код программы меняется. При изменении расположения поля (например перемещение в другую таблицу) или таблица поменяла базу - достаточно изменить хранимую процедуру.
TeXpert
а примерный код можно?
Автор: MagistrAnatol
Дата сообщения: 04.08.2009 11:55
Omicron_Persey_8
если я правильно понял он ругается почемуто на первичный ключ, токо по ошибках не могу разобраться какого черта ему не хватает,что именно нарушено в ключе - уникальность,вроде нет ???

Добавлено:
вроде разобрался в чем проблема - ругается на индексы - но базу составлял вроде как в примере и не могу понять че не так с индексами
Автор: Omicron_Persey_8
Дата сообщения: 04.08.2009 14:10
MagistrAnatol
Да, проблемы с ключами. проверяй в отладчике: уникальность, для Detail таблицы наличие соответствующего PK в master таблице, и свойства DataRelation между ними.
Автор: TeXpert
Дата сообщения: 04.08.2009 20:19
Omicron_Persey_8
Цитата:
А как вы это определили?
Через Management Studio, причём насильно обновляя тамошнее окно
Цитата:
Вполне вероятно, что клиентская прога не успела обновленные данные перечитать (как и SQL Server Management Studio)
Исключено -- база локальная и только одна программа работает с ней

BlackVetal
Цитата:
а примерный код можно?
Чуть позже, обязательно
Автор: TeXpert
Дата сообщения: 05.08.2009 03:24
Вот примерный код:
Код:
public static void DoSmthWithTable(string strSourceName) {
/* Hash-таблица myBindingSources содержит ссылки на BindingSource, ассоциированной с именем соответствующей таблицы */
BindingSource bs = (BindingSource)myBindingSources[strSourceName];
/* Создаем запись и заполняем её поля. Объект BV типа BaseForm.BaseVariables (класс) содержит в качестве свойств поля нашей записи */
DataRow row = ((DataRowView)bs.AddNew()).Row;
foreach (DataColumn col in row.Table.Columns) {
if (typeof(BaseForm.BaseVariables).GetProperty(col.ColumnName) != null) {
if (col.DataType == System.Type.GetType("System.DateTime")) {
row[col.ColumnName] = DateTime.Today;
}
else {
row[col.ColumnName] = typeof(BaseForm.BaseVariables).GetProperty(col.ColumnName).GetValue(BV, null);
}
}
}
/* Hash-таблица mySqlDataAdapters содержит ссылки на SqlDataAdapter, ассоциированной с именем соответствующей таблицы */
SqlDataAdapter da = (SqlDataAdapter)mySqlDataAdapters[strSourceName];
da.SelectCommand.Connection.ConnectionString = CONNECTION_STRING;
SqlCommandBuilder cb = new SqlCommandBuilder(da);
cb.GetInsertCommand(true);
try {
if (da.Update(myDataSet.Tables[strSourceName]) > 0) {
}
}
catch (Exception ex) {
MessageBox.Show(ex.Message, "Произошла ошибка");
}
}
Автор: BlackVetal
Дата сообщения: 05.08.2009 06:39
TeXpert
Пока у меня одно предположение - не открыто "Connection". После присвоения "ConnectionString" - я бы поставил команду "Open".
Автор: Omicron_Persey_8
Дата сообщения: 05.08.2009 07:35
TeXpert
А в SQL-ном профайлере запросы на обновление идут после первой попытки, не пробовали смотреть?
Автор: MagistrAnatol
Дата сообщения: 05.08.2009 08:32
Omicron_Persey_8
Спасибо уже разобрался.
Есть ещо такой вопрос - у меня есть пару текст едитов и одно контекстное меню на всех -
как в рентайме определить на каком контроле я кликнул шоб определить
для клика по менюше к какой контрол шо пихать?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

Предыдущая тема: Как удалить/добавить/отключить/включить устройство?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.