Література
Павлова, Е.А. Технологии разработки современных информационных систем на платформе .NET – Интернет-университет информационных технологий, [Текст]. – 2009. – 112с.
Пауэлл, Т. Ajax. Настольная книга программиста [Текст] – Эксмо. – 2009. – 720с.
Сандерсон, С. ASP.NET MVC Framework с примерами на C# для профессионалов. [Текст] – Вильямс, 2009. – 608с.
Мак-Дональд, М. Microsoft ASP.NET 3.5 с примерами на C# 2008 и Silverlight 2 для профессионалов, – Вильямс, 2009. – 1408с.
Дэвис С.Р. C# 2005 для "чайников" / Дэвис С.Р., Сфер Ч.; "Вильямс", [Текст] – 2006. – 576 с.
Эндрю Троелсен. Язык программирования C# 2008 и платформа .NET 3.5. – [Текст] "Вильямс" 2009. – 1344 с.
Мот, Д. Microsoft Mobile и .NET Compact Framework. Руководство разработчика [Текст]. – Питер, 2009. – 672с.
Салмре, И. Программирование мобильных устройств на платформе .NET Compact Framework [Текст]. – Вильямс, 2006. – 736с.
Камерон, Р. ASP.NET 3.5, компоненты AJAX и серверные элементы управления для профессионалов [Текст]. – Вильямс, 2009. – 608с.
Шмидт, Б. Основы Windows Workflow Foundation [Текст]. – ДМК Пресс, 2008. – 352с.
Паркер Т. .NET. Сетевое программирование для профессионалов [Текст]. – Лори, 2005. – 400с.
Леве, Д. Создание служб WCF [Текст]. – Питер, 2008. – 592с.
Вульф, Б. Шаблоны интеграции корпоративных приложений [Текст]. – Вильямс, 2007. – 672с.
Шафер, Д.Ф. Управление программными проектами. Достижение оптимального качества при минимуме затрат [Текст]. – Вильямс, 2004. – 1136с.
Ратц, Д LINQ: язык интегрированных запросов в C# 2008 для профессионалов [Текст]. – Вильямс, 2008. – 560с.
Основы проектирования реляционных баз данных: [Электрон. ресурс]. – Режим доступа: http://www.intuit.ru.
Сравнение SQL Server с Oracle Database : [Электрон. ресурс]. – Режим доступа: http://www.microsoft.com/sqlserver/2008.
SQL Server 2008: Безопасность: [Электрон. ресурс]. – Режим доступа: http://sysdba.org.ua.
Википедия, Microsoft SQL Server: [Электрон. ресурс]. – Режим доступа: http://www.ru.wikipedia.org.
Кросс-платформенная разработка – Windows Mobile и Windows: [Электрон. ресурс]. – Режим доступа: http://mobile-developer.ru.
Microsoft Sync Framework: Синхронизация данных: [Электрон. ресурс]. – Режим доступа: http://msdn.microsoft.com.
ДОДАТОК А
Лістинг коду основних компонентів
PollsService.cs
public class PollsService : System.Web.Services.WebService
{
[WebMethod]
public PollsData.PollsDataTable GetPolls(int state)
{
return new PollsAdapter().GetData(state);
}
[WebMethod]
public PollsData.UsersDataTable GetInterviewersByPoll(int pollId)
{
return new UsersAdapter().GetInterviewersByPoll(pollId);
}
[WebMethod]
public PollsData.QuestionsDataTable GetQuestionsByPollId(int pollId)
{
return new QuestionsAdapter().GetQuestionsByPollId(pollId);
}
[WebMethod]
public void AddPoll(string name, int createdById, DateTime activateDate, DateTime? expiredDate)
{
new PollsAdapter().AddPoll(name, createdById, activateDate, expiredDate);
}
[WebMethod]
public void AddQuestion(string question, bool required, bool multiAnswer, int questionTypeId, int pollId)
{
new QuestionsAdapter().AddQuestion(question, required, multiAnswer, questionTypeId, pollId);
}
[WebMethod]
public PollsData.AnswersDataTable GetAnswersByQuestionId(int questionId)
{
return new AnswersAdapter().GetAnswersByQuestionId(questionId);
}
[WebMethod]
public void AddAnswer(string answer, int questionId)
{
new AnswersAdapter().AddAnswer(answer, questionId);
}
}
}
Core.Poll.cs
public class Poll
{
public static void AddPoll(string name, int createdById, DateTime activateDate, DateTime expiredDate)
{
using (PollsService service = new PollsService())
{
service.AddPoll(name, createdById, activateDate, expiredDate);
}
}
public static PollsData.PollsRow GetPoll(int pollId)
{
using (PollsService service = new PollsService())
{
PollsData.PollsDataTable table = service.GetPoll(pollId);
if (table.Rows.Count > 0)
{
return table[0];
}
}
return null;
}
public static PollsData.PollsDataTable GetPolls(int state)
{
using (PollsService service = new PollsService())
{
return service.GetPolls(state);
}
}
public static PollsData.QuestionsDataTable GetQuestionsByPollId(int pollId)
{
using (PollsService service = new PollsService())
{
return service.GetQuestionsByPollId(pollId);
}
}
public static PollsData.AnswersDataTable GetAnswersByQuestionid(int questionId)
{
using (PollsService service = new PollsService())
{
return service.GetAnswersByQuestionId(questionId);
}
}
public static void AddQuestion(string question, bool required, bool multiAnswer, int questionTypeId, int pollId)
{
using (PollsService service = new PollsService())
{
service.AddQuestion(question, required, multiAnswer, questionTypeId, pollId);
}
}
public static void AddAnswer(string answer, int questionId)
{
using (PollsService service = new PollsService())
{
service.AddAnswer(answer, questionId);
}
}
public static PollsData.PollsRow GetPollByQuestionId(int questionId)
{
using (PollsService service = new PollsService())
{
PollsData.PollsDataTable table = service.GetPollByQuestionId(questionId);
if (table.Count > 0)
{
return table[0];
}
}
return null;
}
public static PollsData.PollsRow GetPollByAnswerId(int answerId)
{
using (PollsService service = new PollsService())
{
PollsData.PollsDataTable table = service.GetPollByAnswerId(answerId);
if (table.Count > 0)
{
return table[0];
}
}
return null;
}
}
Core.User.cs
public static PollsData.UsersRow GetUser(int userId)
{
using (PollsService service = new PollsService())
{
PollsData.UsersDataTable table = service.GetUser(userId);
if (table.Count > 0)
{
return table[0];
}
}
return null;
}
public static PollsData.UsersRow GetUserByCredentials(string login, string password)
{
using (PollsService service = new PollsService())
{
PollsData.UsersDataTable table = service.GetUserByCredentials(login, password);
if (table.Count > 0)
{
return table[0];
}
}
return null;
}
public static PollsData.UsersDataTable GetUsersByGroup(int userGroupId)
{
using (PollsService service = new PollsService())
{
return service.GetUsersByGroup(userGroupId);
}
}
public static PollsData.UsersDataTable GetInterviewersByPoll(int pollId)
{
using (PollsService service = new PollsService())
{
return service.GetInterviewersByPoll(pollId);
}
}
public static void SetInterviewerForPoll(int pollId, int interviewerId)
{
using (PollsService service = new PollsService())
{
service.SetInterviewerForPoll(pollId, interviewerId);
}
}
public static void DeleteInterviewerFromPoll(int pollId, int interviewerId)
{
using (PollsService service = new PollsService())
{
service.DeleteInterviewerFromPoll(pollId, interviewerId);
}
}
}
PollDetails.cs
public partial class PollDetails : System.Web.UI.Page
{
public PollsData.PollsRow poll = null;
protected void Page_Load(object sender, EventArgs e)
{
int pollId = 0;
if (!string.IsNullOrEmpty(Request["pollId"]))
{
int.TryParse(Request["pollId"], out pollId);
}
poll = Poll.GetPoll(pollId);
if (poll == null) { return; }
this.PollResultsList1.PollId = poll.Id;
if (!IsPostBack)
{
var ai =
from c in Core.User.GetUsersByGroup(2)
select new { Id = c.Id, FullName = c.FirstName + " " + c.LastName };
InterviewersList.DataSource = ai;
InterviewersList.DataBind();
InterviewersList.SelectedIndexChanged -= new EventHandler(InterviewersList_SelectedIndexChanged);
foreach (var i in Core.User.GetInterviewersByPoll(poll.Id))
{
ListItem item = InterviewersList.Items.FindByValue(i.Id.ToString());
if (item != null)
{
item.Selected = true;
item.Attributes["style"] = "color:Black;";
}
}
InterviewersList.SelectedIndexChanged += new EventHandler(InterviewersList_SelectedIndexChanged);
}
}
protected void InterviewersList_SelectedIndexChanged(object sender, EventArgs e)
{
var ai =
from c in Core.User.GetInterviewersByPoll(poll.Id)
select new { Id = c.Id, FullName = c.FirstName + " " + c.LastName };
foreach(ListItem item in InterviewersList.Items)
{
if (item.Selected && ai.Where(x => x.Id.ToString() == item.Value).Count() == 0)
{
Core.User.SetInterviewerForPoll(poll.Id, int.Parse(item.Value));
}
if (!item.Selected && ai.Where(x => x.Id.ToString() == item.Value).Count() > 0)
{
Core.User.DeleteInterviewerFromPoll(poll.Id, int.Parse(item.Value));
}
}
Response.Redirect(Request.RawUrl);
}
}
PollsCache.SyncContract
public partial class PollsCacheSyncService : object, IPollsCacheSyncContract {
private PollsCacheServerSyncProvider _serverSyncProvider;
public PollsCacheSyncService() {
this._serverSyncProvider = new PollsCacheServerSyncProvider();
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public virtual SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession) {
return this._serverSyncProvider.ApplyChanges(groupMetadata, dataSet, syncSession);
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public virtual SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession) {
return this._serverSyncProvider.GetChanges(groupMetadata, syncSession);
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public virtual SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession) {
return this._serverSyncProvider.GetSchema(tableNames, syncSession);
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public virtual SyncServerInfo GetServerInfo(SyncSession syncSession) {
return this._serverSyncProvider.GetServerInfo(syncSession);
}
}
[ServiceContractAttribute()]
[XmlSerializerFormat()]
public interface IPollsCacheSyncContract {
[OperationContract()]
SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession);
[OperationContract()]
SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession);
[OperationContract()]
SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession);
[OperationContract()]
SyncServerInfo GetServerInfo(SyncSession syncSession);
}
}
PollsCache.Polls.sql
IF @@TRANCOUNT > 0
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
BEGIN TRANSACTION;
IF @@TRANCOUNT > 0
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Polls_Tombstone]'))
BEGIN
CREATE TABLE [dbo].[Polls_Tombstone](
[Id] Int NOT NULL,
[DeletionDate] DateTime NULL
) ON [PRIMARY]
END
GO
IF @@ERROR <> 0
ROLLBACK TRANSACTION;
IF @@TRANCOUNT > 0
ALTER TABLE [dbo].[Polls_Tombstone] ADD CONSTRAINT [PKDEL_Polls_Tombstone_Id]
PRIMARY KEY CLUSTERED
([Id])
ON [PRIMARY]
GO
IF @@ERROR <> 0
ROLLBACK TRANSACTION;
IF @@TRANCOUNT > 0
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Polls_DeletionTrigger]') AND type = 'TR')
DROP TRIGGER [dbo].[Polls_DeletionTrigger]
GO
CREATE TRIGGER [dbo].[Polls_DeletionTrigger]
ON [dbo].[Polls]
AFTER DELETE
AS
SET NOCOUNT ON
UPDATE [dbo].[Polls_Tombstone]
SET [DeletionDate] = GETUTCDATE()
FROM deleted
WHERE deleted.[Id] = [dbo].[Polls_Tombstone].[Id]
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO [dbo].[Polls_Tombstone]
([Id], DeletionDate)
SELECT [Id], GETUTCDATE()
FROM deleted
END
GO
IF @@ERROR <> 0
ROLLBACK TRANSACTION;
COMMIT TRANSACTION;
PollsCache.Users.sql
IF @@TRANCOUNT > 0
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
BEGIN TRANSACTION;
IF @@TRANCOUNT > 0
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Users_Tombstone]'))
BEGIN
CREATE TABLE [dbo].[Users_Tombstone](
[Id] Int NOT NULL,
[DeletionDate] DateTime NULL
) ON [PRIMARY]
END
GO
IF @@ERROR <> 0
ROLLBACK TRANSACTION;
IF @@TRANCOUNT > 0
ALTER TABLE [dbo].[Users_Tombstone] ADD CONSTRAINT [PKDEL_Users_Tombstone_Id]
PRIMARY KEY CLUSTERED
([Id])
ON [PRIMARY]
GO
IF @@ERROR <> 0
ROLLBACK TRANSACTION;
IF @@TRANCOUNT > 0
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Users_DeletionTrigger]') AND type = 'TR')
DROP TRIGGER [dbo].[Users_DeletionTrigger]
GO
CREATE TRIGGER [dbo].[Users_DeletionTrigger]
ON [dbo].[Users]
AFTER DELETE
AS
SET NOCOUNT ON
UPDATE [dbo].[Users_Tombstone]
SET [DeletionDate] = GETUTCDATE()
FROM deleted
WHERE deleted.[Id] = [dbo].[Users_Tombstone].[Id]
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO [dbo].[Users_Tombstone]
([Id], DeletionDate)
SELECT [Id], GETUTCDATE()
FROM deleted
END
GO
IF @@ERROR <> 0
ROLLBACK TRANSACTION;
COMMIT TRANSACTION;