C# .NET4.0 TableAdapter.Update() няма да вмъкне нов запис

Имам малко приложение, което се състои от DAL, BLL и самото приложение, всички в различни проекти в едно решение във Visual Studio 2010.

Моят DAL използва xsd файл за запитване към базата данни и моят BLL има методи за получаване на информация от DAL и да прави неща с него.

В момента се опитвам да вмъкна запис, като използвам кода зад приложението, за да извикам метод в BLL, който след това се опитва да вмъкне записа с помощта на метода Tableadapter.Update(), генериран в xsd файла на DAL.

Вече мога да избирам и актуализирам записи без проблем, но не мога да вмъквам записи.

Доколкото знам, методът TableAdapter.Update() трябва да знае да вмъкне нов запис, ако му предоставя нов ред, но той връща стойност 0 - което означава, че 0 реда са засегнати, така че не работи.

Таблицата, в която се опитвам да вмъкна, се нарича tblRoles.

Има колона „ID“, която е int, първичен ключ и колона за самоличност. Има колона „Име“, която приема nvarchar(50), и има 4 колони „CanAdduser“ и т.н., които приемат тип бит.

Ето моят код:

APP код зад:

protected void CreateRole(object sender, EventArgs e) {
    RolesBL roles = new RolesBL();

    roles.CreateRole(NewRoleName.Text);

    RolesGridView.DataBind();
}

BLL:

private tblRolesTableAdapter adapter = new tblRolesTableAdapter();

public bool CreateRole(string Name) {
    CMSDS.tblRolesDataTable roles = new CMSDS.tblRolesDataTable();
    CMSDS.tblRolesRow row = roles.NewtblRolesRow();

    row.Name = Name;
    row.CanAddUsers = false;
    row.CanEditUsers = false;
    row.CanSuspendUsers = false;
    row.CanChangeUserPasswords = false;

    int result = adapter.Update(row);

    if(result == 1) {
        return true;
    }

    return false;
}

Доколкото разбирам, това трябва да вмъкне нов ред в таблицата, но adapter.Update(row) продължава да връща 0 и не знам защо.

Когато отстранявам грешки, виждам, че на всички колони на реда са присвоени правилните стойности и не се генерират грешки.

Всяка помощ ще бъде оценена!

Редактиране:

Забравих да спомена, че когато конфигурирах заявката по подразбиране Fill,GetData() в xsd файла, се уверих, че автоматично генерира изрази Insert, Update и Delete.


person Lucas    schedule 17.07.2011    source източник


Отговори (1)


Не сте добавили новия Role-Row към DataTable.

CMSDS.tblRolesDataTable roles = new CMSDS.tblRolesDataTable();
CMSDS.tblRolesRow row = roles.NewtblRolesRow();
row.Name = Name;
roles.AddtblRolesRow(row); 
int result = adapter.Update(roles); //the same as `adapter.Update(row)`
person Tim Schmelter    schedule 17.07.2011
comment
+1; това има повече смисъл от моя отговор. Изглежда други примери (единична таблица?) не извикват AcceptChanges. - person Merlyn Morgan-Graham; 18.07.2011
comment
Брилянтно! Спестихте ми много разочарования :) Благодаря ви! Честно казано, не бях много сигурен как работи всичко, така че дори не знаех, че методът Add~Row() изобщо съществува. - person Lucas; 18.07.2011
comment
@Merlyn: adapter.Update косвено ще извика AcceptChanges. msdn.microsoft.com/en-us/ библиотека/ - person Tim Schmelter; 18.07.2011