Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2010, 15:05   #1
hk47
Пользователь
 
Регистрация: 11.04.2010
Сообщений: 23
По умолчанию Добавление данных в базу через LINQ to SQL

Всем привет.
Я пишу приложение на C#, в котором для операций с базой данных использую технологию LINQ to SQL (в качестве СУБД использую MS SQL Server Compact Edition которая встроена в Visual Studio 2008). С запросами я разобрался все работает превосходно. Однако при добавлении данных в базу возникает проблема. Консолька отражает что строка добавлена, но в самой базе новая строка не появляется.
Приведу код, которым я оперирую в попытке разобраться.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //создаем экземпляр DataContext оперируемой базы данных
            DataClasses1DataContext db = new DataClasses1DataContext();
            t newrec = new t//создание новой записи
            {
                    name ="name_Inserted"
            };
            db.ts.InsertOnSubmit(newrec);//вставляем данные в таблицу ts
            db.SubmitChanges();//фиксируем изменения в базе
            //пишем текст запроса на выборку всех данных из таблицы 
            var queryAfterInserting = from table in db.ts
                     select table;
            //выводим на экран
            foreach (var table_t in queryAfterInserting)
            {
                Console.WriteLine("{0} -- {1}", table_t.ID, table_t.name);
            }
        }
    }
}
В чем может быть проблема?
hk47 вне форума Ответить с цитированием
Старый 15.11.2010, 15:39   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

http://msdn.microsoft.com/en-us/library/bb763516.aspx читаем очень внимательно, если лень, то именно вот это
Цитата:
The added entity will not appear in query results from this table until after SubmitChanges has been called.
UPD:
Прошу прощения, мой фейл, не заметил.

UPD:
Вы не переопределяли SubmitChanges? Это весь код что у вас есть?

Я вот не уверен, DataClasses1DataContext с чем связан то? Ну с самой базой хоть связан? Я просто не вижу конструктора без параметров здесь http://msdn.microsoft.com/en-us/libr...tacontext.aspx

Последний раз редактировалось BOBAH13; 15.11.2010 в 15:45.
BOBAH13 вне форума Ответить с цитированием
Старый 15.11.2010, 15:43   #3
hk47
Пользователь
 
Регистрация: 11.04.2010
Сообщений: 23
По умолчанию

BOBAH13
У меня эта строчка есть.
Код:
db.SubmitChanges();//фиксируем изменения в базе
В том то и дело, что эта строчка есть, и изменения отображаются только на момент вывода на экран. Складывается такое впечатление что изменения происходят только в экземляре БД, а не в самой БД.

могу привести код где формируются сущностные классы

Код:
#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.3053
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace ConsoleApplication1
{
	using System.Data.Linq;
	using System.Data.Linq.Mapping;
	using System.Data;
	using System.Collections.Generic;
	using System.Reflection;
	using System.Linq;
	using System.Linq.Expressions;
	using System.ComponentModel;
	using System;
	
	
	[System.Data.Linq.Mapping.DatabaseAttribute(Name="ddb")]
	public partial class DataClasses1DataContext : System.Data.Linq.DataContext
	{
		
		private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
		
    #region Extensibility Method Definitions
    partial void OnCreated();
    partial void Insertt(t instance);
    partial void Updatet(t instance);
    partial void Deletet(t instance);
    #endregion
		
		public DataClasses1DataContext() : 
				base(global::ConsoleApplication1.Properties.Settings.Default.ddbConnectionString, mappingSource)
		{
			OnCreated();
		}
		
		public DataClasses1DataContext(string connection) : 
				base(connection, mappingSource)
		{
			OnCreated();
		}
		
		public DataClasses1DataContext(System.Data.IDbConnection connection) : 
				base(connection, mappingSource)
		{
			OnCreated();
		}
		
		public DataClasses1DataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
				base(connection, mappingSource)
		{
			OnCreated();
		}
		
		public DataClasses1DataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
				base(connection, mappingSource)
		{
			OnCreated();
		}
		
		public System.Data.Linq.Table<t> ts
		{
			get
			{
				return this.GetTable<t>();
			}
		}
	}
	
	[Table(Name="dbo.t")]
	public partial class t : INotifyPropertyChanging, INotifyPropertyChanged
	{
		
		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
		
		private int _ID;
		
		private string _name;
		
    #region Extensibility Method Definitions
    partial void OnLoaded();
    partial void OnValidate(System.Data.Linq.ChangeAction action);
    partial void OnCreated();
    partial void OnIDChanging(int value);
    partial void OnIDChanged();
    partial void OnnameChanging(string value);
    partial void OnnameChanged();
    #endregion
		
		public t()
		{
			OnCreated();
		}
		
		[Column(Storage="_ID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
		public int ID
		{
			get
			{
				return this._ID;
			}
			set
			{
				if ((this._ID != value))
				{
					this.OnIDChanging(value);
					this.SendPropertyChanging();
					this._ID = value;
					this.SendPropertyChanged("ID");
					this.OnIDChanged();
				}
			}
		}
		
		[Column(Storage="_name", DbType="VarChar(50)")]
		public string name
		{
			get
			{
				return this._name;
			}
			set
			{
				if ((this._name != value))
				{
					this.OnnameChanging(value);
					this.SendPropertyChanging();
					this._name = value;
					this.SendPropertyChanged("name");
					this.OnnameChanged();
				}
			}
		}
		
		public event PropertyChangingEventHandler PropertyChanging;
		
		public event PropertyChangedEventHandler PropertyChanged;
		
		protected virtual void SendPropertyChanging()
		{
			if ((this.PropertyChanging != null))
			{
				this.PropertyChanging(this, emptyChangingEventArgs);
			}
		}
		
		protected virtual void SendPropertyChanged(String propertyName)
		{
			if ((this.PropertyChanged != null))
			{
				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
			}
		}
	}
}
#pragma warning restore 1591

Последний раз редактировалось Stilet; 15.11.2010 в 17:08.
hk47 вне форума Ответить с цитированием
Старый 15.11.2010, 16:05   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Зачем все то, бог ты мой... А это покажите? global::ConsoleApplication1.Propert ies.Settings.Default.ddbConnectionS tring, ведь именно с помощью этой строки LINQ коннектится к базе, к файлу.
BOBAH13 вне форума Ответить с цитированием
Старый 15.11.2010, 16:27   #5
hk47
Пользователь
 
Регистрация: 11.04.2010
Сообщений: 23
По умолчанию

BOBAH13
Вы спрашивали про код, который у меня есть. Я вам привел этот код. Вы видите там всевозможные перегруженные методы DataClasses1DataContext включая метод без параметров, который я и использую.
что касается ConnectionString то она выглядит так:

Код:
Data Source=.\SQLEXPRESS;AttachDbFilename="C:\Documents and Settings\User\Мои документы\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\ddb.mdf";Integrated Security=True;Connect Timeout=30;User Instance=True
hk47 вне форума Ответить с цитированием
Старый 15.11.2010, 17:44   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Вы видите там всевозможные перегруженные методы DataClasses1DataContext включая...
"Спасибо" за разъяснение. Ну вот и вопрос, вы с этой самой базой (указанный файл "C:\Documents and Settings\User\Мои док...ddb.mdf" работаете, т.е. смотрите в ХХХ приложении на присутствие нужной записи? Т.к. по коду все верно, и тут явно человеческий фактор присутствует. Еще интересует вопрос по ID для новой записи, в вашей таблицы установлено автоматическое инкрементирование для primary key (id) ? Возможно из-за этой проблемы база игнорирует ваш запрос.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление записей через SQL: не добавляются числовые поля NikkMih БД в Delphi 4 01.06.2010 18:28
Добавление строки в базу данных из visual studio Жендопыр Помощь студентам 0 24.07.2009 02:32
Передача данных в SQL базу. Ag3r0n Помощь студентам 2 08.03.2009 19:18
базу аксесс пропустить через SQL Ane4ka Microsoft Office Access 5 27.05.2008 10:38
Добавление Удаление Редактирование через SQL beginner БД в Delphi 4 29.05.2007 17:52