Вопрос по ADO.NET
От: Lenny  
Дата: 20.07.06 07:38
Оценка:
Почему если я обновляю табличку БД при помощи SqlCommandBuilder

int count=BaseAdapter.Update(myDataSet,"MainTable");


вставка и изменение записей происходит,а вот удаление нет,
хотя в табличке DataTable "MainTable" происходило удаление строк.

Подскажите,пожалуйста.
Re: Вопрос по ADO.NET
От: _FRED_ Черногория
Дата: 20.07.06 08:29
Оценка:
Здравствуйте, Lenny, Вы писали:

L>Почему если я обновляю табличку БД при помощи SqlCommandBuilder

L>int count=BaseAdapter.Update(myDataSet,"MainTable");

L>вставка и изменение записей происходит,а вот удаление нет,
L>хотя в табличке DataTable "MainTable" происходило удаление строк.

По этой строке ничего сказать нельзя. Что именно находится в DeleteCommand адаптера?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Вопрос по ADO.NET
От: Lenny  
Дата: 20.07.06 08:39
Оценка:
Здравствуйте
Я так понимаю,что,если я использую объект SqlCommandBuilder
для адаптера данных то команды на вставку,изменение и удаление
записей формирует SqlCommandBuilder автоматически,при соблюдении:

для измененного объекта DataAdapter была сформирована команда Select с
выбором в тексте запроса ключа таблички БД
для измененного объекта DataTable был указан Primary Key

т.е. я просто связываю
[c#]
BaseBuilder = new SqlCommandBuilder(BaseAdapter);
[c#/]

Подскажите
Re[3]: Вопрос по ADO.NET
От: _FRED_ Черногория
Дата: 20.07.06 08:48
Оценка: :))
Здравствуйте, Lenny, Вы писали:

L>Я так понимаю,что,если я использую объект SqlCommandBuilder

L>для адаптера данных то команды на вставку,изменение и удаление
L>записей формирует SqlCommandBuilder автоматически,при соблюдении:



L>для измененного объекта DataAdapter была сформирована команда Select с

L>выбором в тексте запроса ключа таблички БД
L>для измененного объекта DataTable был указан Primary Key

L>т.е. я просто связываю

L>BaseBuilder   = new SqlCommandBuilder(BaseAdapter);


Ну раз так, то [внимание!] включаю телепатию! Строки из таблицы удаляются через myDataSet["MainTable"].Rows.Remove(dataRow) или myDataSet["MainTable"].Rows.RemoveAt(index). Это не правильно! Читай хелп к этим функциям.

Теперь даю установку: для удаления строк используй dataRow.Delete() ну или myDataSet["MainTable"].Rows[index].Delete(). А потом уже применяй к этому делу адаптер.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Вопрос по ADO.NET
От: Lenny  
Дата: 20.07.06 09:29
Оценка:
При удалении строки через Delete() появляется ошибка
что инфориация о строке строке утеряна и обновление гибнет.
подскажите выход
Re[5]: Вопрос по ADO.NET
От: _FRED_ Черногория
Дата: 20.07.06 09:32
Оценка:
Здравствуйте, Lenny, Вы писали:

L>При удалении строки через Delete() появляется ошибка

L>что инфориация о строке строке утеряна и обновление гибнет.
L>подскажите выход

Покажи, что на "входе". Телепатия устала и больше работать не может
Help will always be given at Hogwarts to those who ask for it.
Re[6]: Вопрос по ADO.NET
От: Lenny  
Дата: 20.07.06 11:29
Оценка:
    

cn=new SqlConnection("server=UST2C\\UST2CSQL;uid=terrasoft1;pwd=gjcnyjt;database=TerraSoftCRM_T");

myFilter="Select ID,YearName,MonthName,Seriya,Model,Machta,KolvoMiddle,KolvoEnd,Main from sgz_PlanPogrKomatsu"+" Where YearName like \'"+currentyear.ToString()+"\' and MonthName like \'"+currentmonth.ToString()+"\'"+" and Main='1'";

BaseAdapter=new SqlDataAdapter();
SelectCommand=new System.Data.SqlClient.SqlCommand();
BaseAdapter.SelectCommand=SelectCommand;
SelectCommand.CommandText=myFilter;
SelectCommand.Connection=cn;
BaseBuilder   = new SqlCommandBuilder(BaseAdapter);
myDS=new DataSet("Base");
BaseAdapter.Fill(myDS,"sgz_PlanPogrKomatsu");
BaseTable=myDS.Tables["sgz_PlanPogrKomatsu"];
BaseTable.TableName="sgz_PlanPogrKomatsu";
DataColumn[] way=new DataColumn[1];
way[0]=BaseTable.Columns["ID"];
BaseTable.PrimaryKey=way;
BaseTable.Columns["ID"].AutoIncrement=true;
,,,,,,,,,,
далее удаление строк,сравниваются строки двух таблиц,если в другой таблице я не нахожу нужной строки,то удаляю строку из своей таблицы
cn.Open();
                
rowList=new ArrayList();
string myCommand="";
SqlCommand killCmd = new SqlCommand();
for(int row=0;row<BaseTable.Rows.Count;row++)
{
DataRow ro=BaseTable.Rows[row];
string Filter="Seriya = '"+ro[3]+"'"+" and  Machta = '"+ro[5]+"'"+" and Model = '"+ro[4]+"'";
DataRow[] find=myTable.Select(Filter);
if (find.Length==0)
{
rowList.Add(row);
myCommand=myCommand+" DELETE FROM sgz_PlanPogrKomatsu where "+"Seriya= '"+ro[3]+"'"+" and  Machta = '"+ro[5]+"'"+" and"+" Model = '"+ro[4]+"'"+"and MonthName = '"+currentmonth+"'"+" and YearName = '"+currentyear+"' and Main='1';";
rowList.Add(row);
}
                
if (rowList.Count>0)
{
                        
int dlina=myCommand.Length-1;
myCommand=myCommand.Substring(0,dlina);
killCmd.CommandText=myCommand;
killCmd.Connection=cn;
killCmd.ExecuteNonQuery();
}
rowList.Sort();
for (int arrow=(rowList.Count-1);arrow>0;arrow--)
{
BaseTable.Rows.RemoveAt((int)rowList[arrow]);
}

,,далее делаю апдэйт

MyDataGrid.Refresh();
int count=BaseAdapter.Update(myDS,"sgz_PlanPogrKomatsu");
cn.Close();
Re[7]: Вопрос по ADO.NET
От: _FRED_ Черногория
Дата: 20.07.06 12:02
Оценка:
Здравствуйте, Lenny, Вы писали:

Вы издеваетесь? Да? Очень смешно? Уууууу ! Поотрывал бы Ладно, проехали , далее по-существу :о)

L>if (find.Length==0)
L>{
L>..rowList.Add(row);
L>..myCommand=myCommand+" DELETE FROM sgz_PlanPogrKomatsu where " + …;
L>..rowList.Add(row);
L>}

Зачем два раза строку в список добовляешь?

    
L>if (rowList.Count>0)
L>{
L>..int dlina = myCommand.Length-1;
L>..myCommand = myCommand.Substring(0, dlina);
L>..killCmd.CommandText = myCommand;
L>..killCmd.Connection = cn;
L>..killCmd.ExecuteNonQuery();
L>}

Если я правильно понял, то тут ты как раз и удаляешь из базы данных записи, попавшие в rowList.

L>rowList.Sort();

Для чего-то сортируешь

L>for(int arrow = (rowList.Count-1); arrow>0; arrow--)
L>{
L>..BaseTable.Rows.RemoveAt((int)rowList[arrow]);
L>}


И используя [пип] метод который я запретил тебе использовать [пип] ты удаляешь из таблицы строки, которые не нужны! Конечно оно здесь ругнётся,: помнишь, ты одну и тужу строку дважды в rowList добавляешь? при повторном удалении исключение и появляется.

L>//далее делаю апдэйт
L>MyDataGrid.Refresh();
L>int count=BaseAdapter.Update(myDS,"sgz_PlanPogrKomatsu");


Для чего ты делаешь Update? Ведь killCmd.ExecuteNonQuery(); должна была уже удалить все строки из базы данных?

ЗЫ. Несмотря на свой ник, не ленись, создавая, и тем более публикуя, свой код — назвай переменный, делай отступы и вставляй пробелы как рекомендуют бывалые орлы, хотя бы даже и так, как здесь.
Help will always be given at Hogwarts to those who ask for it.
Re[8]: Вопрос по ADO.NET
От: Lenny  
Дата: 20.07.06 12:30
Оценка:
Да нет, два раза я вставил в сообщение
rowList.Add(row);

по ошибке т.к. кода у меня много и я решил вставить одну из веток if {}
а подчищаю я строки в DataTable при помощи
BaseTable.Rows.RemoveAt((int)rowList[arrow]);

потому что если делать Delete(),а затем
BaseAdapter.Update(myDS,"sgz_PlanPogrKomatsu");

вываливается ошибка,что нет информации о строке
если делать
BaseTable.Rows.RemoveAt((int)rowList[arrow])
        BaseAdapter.Update(myDS,"sgz_PlanPogrKomatsu");

тогда записи из БД не удаляются,
поэтому и приходится удалять самому

killCmd.ExecuteNonQuery();
Re[9]: Вопрос по ADO.NET
От: kirill_dot_net Россия  
Дата: 20.07.06 13:31
Оценка:
Здравствуйте, Lenny, Вы писали:

L>Да нет, два раза я вставил в сообщение

L>
rowList.Add(row);

L>по ошибке т.к. кода у меня много и я решил вставить одну из веток if {}
L>а подчищаю я строки в DataTable при помощи
L>
BaseTable.Rows.RemoveAt((int)rowList[arrow]);

L>потому что если делать Delete(),а затем
L>
BaseAdapter.Update(myDS,"sgz_PlanPogrKomatsu");

L>вываливается ошибка,что нет информации о строке
L>если делать
L>
BaseTable.Rows.RemoveAt((int)rowList[arrow])
L>        BaseAdapter.Update(myDS,"sgz_PlanPogrKomatsu");

L>тогда записи из БД не удаляются,
L>поэтому и приходится удалять самому

L>
killCmd.ExecuteNonQuery();


так зачем вообще ты выполняешь
BaseTable.Rows.RemoveAt((int)rowList[arrow])
L>        BaseAdapter.Update(myDS,"sgz_PlanPogrKomatsu");

если у тебя при этом из бпзы не удаляется?
и действительно, зачем сортировку-то делать?
Re[10]: Вопрос по ADO.NET
От: Lenny  
Дата: 20.07.06 13:42
Оценка:
Здравствуйте, kirill_dot_net

Из BaseTable я удаляю строки,чтобы SqlCommandBuilder сориентировался и
понял,что нужно создать команды на удаление,в этом то и вопрос,что он
не формирует команду на удаление строк.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.