Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LINQ to SQL: добавление новой строки в БД 
:(
    Опции темы
RWander
Дата 28.12.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 4.5.2006
Где: Russia.Udm.Izhevs k

Репутация: нет
Всего: 6



начал изучать LINQ.
Создал таблицу:
Код

CREATE TABLE Student
{
ID int primary key,
Name nvarchar(100),
Year int
}


Создаю класс, который будет хранить одну строку таблицы Student:
Код

using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;

[Table(Name = "Students")]
public class Student
{
       [Column(Name = "ID", IsPrimaryKey = true)]
       public int ID;
       [Column]
       public string Name;
       [Column]
       public int Year;
}


теперь пытаюсь добавить новую строку в таблицу:
Код

// DataContext takes a connection string. 
 DataContext db = new DataContext("Database1.sdf");
// Get a typed table to run queries.
Table<Student> students = db.GetTable<Student>();
students.InsertOnSubmit(new Student {  Name = "Роман",  Year = 20 }); //поле ID не указываю, так как оно автоинкрементное
try
{
    db.SubmitChanges();
}
catch(Exception e)
{
     Console.WriteLine(e.Message);
}


выдает ошибку:
Цитата

The column cannot be modified. [ Column name = ID]


не могу понять, где ошибка

Это сообщение отредактировал(а) RWander - 29.12.2007, 09:40


--------------------
Microsoft Certified Technology Specialist - ASP.NET Applications
PM MAIL   Вверх
Idsa
Дата 29.12.2007, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(RWander @  28.12.2007,  20:44 Найти цитируемый пост)
//поле ID не указываю, так как оно автоинкрементное

Автоинкрементное оно у тебя в СУБД.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
RWander
Дата 29.12.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 4.5.2006
Где: Russia.Udm.Izhevs k

Репутация: нет
Всего: 6



если я пишу 
Код

students.InsertOnSubmit(new Student {  ID=34 , Name = "Роман",  Year = 20 });

то выдается та же ошибка


--------------------
Microsoft Certified Technology Specialist - ASP.NET Applications
PM MAIL   Вверх
mr.DUDA
Дата 29.12.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Попробовать -1 или 0.


--------------------
user posted image
PM MAIL WWW   Вверх
RWander
Дата 29.12.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 4.5.2006
Где: Russia.Udm.Izhevs k

Репутация: нет
Всего: 6



Цитата(mr.DUDA @  29.12.2007,  13:44 Найти цитируемый пост)
Попробовать -1 или 0.

Если вы имеете ввиду присвоить ID = -1, то все равно та же ошибка


--------------------
Microsoft Certified Technology Specialist - ASP.NET Applications
PM MAIL   Вверх
JimCary
Дата 28.1.2008, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



А не существует ли возможности при создании класса Student задать, что поле ID автоинкрементное, может тогда все заработает.
PM MAIL   Вверх
bullterier
Дата 15.2.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



попробуй в атрибуте [Column(....)] добавить : IsDbGenerated = true
PM MAIL   Вверх
xni
Дата 24.7.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.10.2006
Где: Обнинск

Репутация: нет
Всего: нет



Аналогичная ошибка. Вы разобрались?

Вот что интересно -- просматриваю лог свего DataContext и вот что вижу:

Код

INSERT INTO [Таблица2]([Status_name])
VALUES (@p0)

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
-- @p0: Input String (Size = 9; Prec = 0; Scale = 0) [NewStatus]


В таблице всего 2 поля: ID (счётчик) и Statis_name (текст).
Может быть дело в том, что я работаю с базой данных Access? Может с SQL Server будет иначе?

Это сообщение отредактировал(а) xni - 24.7.2008, 16:04
PM MAIL ICQ   Вверх
Idsa
Дата 24.7.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(RWander @  29.12.2007,  00:44 Найти цитируемый пост)
The column cannot be modified. [ Column name = ID]

Судя по всему, в базе Id объявлен как Identity. Тогда при объявлении Id не хватает атрибута IsDbGenerated (обратите внимание на примечание и пример).

А в этом же примере происходит следующее:
1. При создании объекта сущности в Id хранится 0 (значение по умолчанию для int)
2. При добавлении сущности составляется запрос на вставку значений во все поля, кроме тех, которые помечены атрибутом IsDbGenerated. Т. к. Id не помечен этим атрибутом, получится примерно следующий запрос:
Код

INSERT INTO MyTable (Id, Name, Year) VALUES (0, someValue, someValue);

3. Естественно, на попытку вставить значение в Identity поле Sql Server среагирует Exception'ом.

xni, Вы тоже ручками генерировали модель? Генерируйте дизайнером, не усложняйте себе жизнь.
Если Вы только начинаете проект или изучаете для себя, взгляните лучше на Entity Framework. Гораздо более мощная и перспективная ORM.



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
xni
Дата 24.7.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.10.2006
Где: Обнинск

Репутация: нет
Всего: нет



Благодарю!

А со своей проблемой, я кажется, разобрался -- не знаю верно ли я понял или нет, но в Access 2007 поле типа "счётчик" всё равно трбует заполнения. Когда было выставлено IsDbGenerated = true оно не передавало значение счётчика, из-за чего возникала ошибка.

Теперь ввожу ID вручную. Это неудобно, но работает...
PM MAIL ICQ   Вверх
PashaPash
Дата 24.7.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



xni, Linq to SQL вроде не поддерживает access вообще. Странно что хоть как-то работает.


--------------------
PM MAIL WWW   Вверх
Idsa
Дата 25.7.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(xni @  24.7.2008,  22:34 Найти цитируемый пост)
А со своей проблемой, я кажется, разобрался -- не знаю верно ли я понял или нет, но в Access 2007 поле типа "счётчик" всё равно трбует заполнения. Когда было выставлено IsDbGenerated = true оно не передавало значение счётчика, из-за чего возникала ошибка.

Если Вы используете Access, то Вам прямая дорога к Entity Framework или nHibernate.

Цитата(PashaPash @  25.7.2008,  00:48 Найти цитируемый пост)
xni, Linq to SQL вроде не поддерживает access вообще. Странно что хоть как-то работает. 

Поддерживает. Правда с рядом ограничений. Вот здесь есть обсуждение: http://forums.microsoft.com/MSDN/ShowPost....79&SiteID=1
Фишка в том, чтобы передать конструктору DataContext'а OleDbConnection. Правда, т. к. это нечто вроде workaround'а, стабильная работа не гарантируется: в частности, не поддерживаются некоторые типы.

Это сообщение отредактировал(а) Idsa - 25.7.2008, 15:56


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
PashaPash
Дата 25.7.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



Цитата(Idsa @  25.7.2008,  15:55 Найти цитируемый пост)
Поддерживает. Правда с рядом ограничений.

Можно заставить заработать - еще не значит что он поддерживает. По ссылке же прямо так и написано. Т.е. что-то работать будет, но в живом проекте лучше не использовать.


--------------------
PM MAIL WWW   Вверх
Idsa
Дата 25.7.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



PashaPash, я же так и написал: есть ряд ограничений. Естественно, в реальных проектах использовать Linq To Sql с Access не имеет смысла.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0846 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.