2016-04-13 4 views
0

Я создаю небольшой проект wpf, который включает в себя регистрацию пользователей. В этом проекте я использую dataAdapter для загрузки данных из базы данных в datatables.Как синхронизировать данные с базой данных

con = new SqlConnection(connectionString); 

string query = "select * from Users;"; 
cmd = new SqlCommand(query, con); 
da = new SqlDataAdapter(); 

da.SelectCommand = cmd; 

users = new DataTable(); 
con.Open(); 
da.Fill(users); 

базы данных имеют 6 столбцов Id, который является автоматическое приращение, имя пользователя, пароль, имя и два столбца INT типа со значением по умолчанию к нулю. Вот схема базы данных.

CREATE TABLE [dbo].[Users] (
    [Id]  INT   IDENTITY (1, 1) NOT NULL, 
    [username] NVARCHAR (20) NOT NULL, 
    [password] NVARCHAR (20) NOT NULL, 
    [name]  NVARCHAR (50) NULL, 
    [attempted] INT   DEFAULT ((0)) NULL, 
    [correct] INT   DEFAULT ((0)) NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC), 
    UNIQUE NONCLUSTERED ([username] ASC) 
); 

Всякий раз, когда я ввожу нового пользователя в DataTable я только предоставить имя пользователя, пароль и имя остальные поля должны быть заполнены автоматически, но DataTable только сохранить предоставленные поля и остальные оставлены пустыми, и когда я называю

da.update(users); 

он обновляет данные в базе данных, а оставшиеся поля заполняются автоматически. butt datatable по-прежнему содержит эти поля в виде пустых столбцов.

Image without user Id

Но мне нужен идентификатор пользователя, чтобы обновить или удалить пользователя. Проблема в том, как можно синхронизировать данные с базой данных для обновленных полей, чтобы я мог использовать их для дальнейших операций. Спасибо в Advance за вашу помощь.

Update: Вставка запроса и параметры приведены ниже

query = "insert into Users (username, password, name)values(@u, @p, @n)"; 
SqlCommand insertcmd = new SqlCommand(query, con); 
insertcmd.Parameters.Add(new SqlParameter("u", SqlDbType.NVarChar, 20, "username")); 
insertcmd.Parameters.Add(new SqlParameter("p", SqlDbType.NVarChar, 20, "Password")); 
insertcmd.Parameters.Add(new SqlParameter("n", SqlDbType.NVarChar, 50, "name")); 

da.InsertCommand = insertcmd; 
+2

Предупреждение. Вы сохраняете пароли в текстовом виде в своей базе данных. Это * не * хорошая практика. Пароли должны быть одним из способов хэширования и соления. Важно соблюдать хорошие методы обеспечения безопасности. – mason

+0

Спасибо за ваше предложение. Но этот проект - просто домашнее задание для практики. Поэтому на данный момент никаких проблем с безопасностью. –

+0

Ничего в этом вопросе не связано с WPF. Удален нерелевантный тег. –

ответ

0

Я использовал следующий параметризованный запрос вставки для обновления поля Id в dataTable на основе идентификатора, сгенерированного базой данных.

query = "insert into Users (username, password, name)values(@u, @p, @n); set @Id = SCOPE_IDENTITY()"; 
insertcmd = new SqlCommand(query, con); 
insertcmd.Parameters.Add(new SqlParameter("u", SqlDbType.NVarChar, 20, "username")); 
insertcmd.Parameters.Add(new SqlParameter("p", SqlDbType.NVarChar, 20, "Password")); 
insertcmd.Parameters.Add(new SqlParameter("n", SqlDbType.NVarChar, 50, "name")); 

SqlParameter Id = new SqlParameter("Id", SqlDbType.Int, 0, "Id"); 
Id.Direction = ParameterDirection.Output; 

insertcmd.Parameters.Add(Id); 

da.InsertCommand = insertcmd; 

Полное описание предоставлено here с хранимой процедурой.

+1

Вы нашли лучшее решение. Хороший код. –

1

После команды вставки сделать Thes, чтобы получить ID:

select SCOPE_IDENTITY() 
int newId = Convert.ToInt32(cmd.ExecuteScalar()); 

Затем добавить NewID в нужное место

Это пример:

SqlCommand cmd = new SqlCommand("Insert into Products (ProductName, UnitPrice) VALUES (@ProductName, @Price); select SCOPE_IDENTITY()", conn); 
int newId = Convert.ToInt32(cmd.ExecuteScalar()); 
+1

Извините, что я новичок в C#. Я использую dataAdapter для обновления базы данных, вы можете объяснить, где я должен поместить этот мир кода, чтобы получить Id. –

+0

после команды вставки –

+0

Вставить Среднее значение команды после da.Обновить(); –

1

Если вы используете хранимая процедура, обязательно объявите параметр id в качестве выходного параметра.

create procedure dbo.SaveUser 
(
    @id int = null out, 
    ... 
) 
as 
begin 

    --insert goes here 

    set @id = scope_identity() 
end 
+0

Я новичок в C#, вы можете объяснить хранимую процедуру? –

+0

После большого мозгового штурма, мне как-то удалось понять хранимую процедуру, а затем изменить ее в соответствии с моими требованиями. –

+0

Это потому, что вы уже приняли другой ответ. –

Смежные вопросы