Здравствуйте
Я так понимаю,что,если я использую объект SqlCommandBuilder
для адаптера данных то команды на вставку,изменение и удаление
записей формирует SqlCommandBuilder автоматически,при соблюдении:
для измененного объекта DataAdapter была сформирована команда Select с
выбором в тексте запроса ключа таблички БД
для измененного объекта DataTable был указан Primary Key
т.е. я просто связываю
[c#]
BaseBuilder = new SqlCommandBuilder(BaseAdapter);
[c#/]
Здравствуйте, 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.
Здравствуйте, Lenny, Вы писали:
L>При удалении строки через Delete() появляется ошибка L>что инфориация о строке строке утеряна и обновление гибнет. L>подскажите выход
Покажи, что на "входе". Телепатия устала и больше работать не может
Help will always be given at Hogwarts to those who ask for it.
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();
И используя [пип] метод который я запретил тебе использовать [пип] ты удаляешь из таблицы строки, которые не нужны! Конечно оно здесь ругнётся,: помнишь, ты одну и тужу строку дважды в rowList добавляешь? при повторном удалении исключение и появляется.
Для чего ты делаешь Update? Ведь killCmd.ExecuteNonQuery(); должна была уже удалить все строки из базы данных?
ЗЫ. Несмотря на свой ник, не ленись, создавая, и тем более публикуя, свой код — назвай переменный, делай отступы и вставляй пробелы как рекомендуют бывалые орлы, хотя бы даже и так, как здесь.
Help will always be given at Hogwarts to those who ask for it.
Из BaseTable я удаляю строки,чтобы SqlCommandBuilder сориентировался и
понял,что нужно создать команды на удаление,в этом то и вопрос,что он
не формирует команду на удаление строк.