簡體   English   中英

如何將DataTables與數據庫同步

[英]How to synchronize DataTables with database

我正在創建一個涉及用戶注冊的小型wpf項目。 在此項目中,我正在使用dataAdapter將數據從數據庫加載到數據表。

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)
);

每當我將新用戶插入數據表時,我只提供用戶名,密碼和名稱剩余字段,應自動填寫,但數據表僅保存提供的字段,其余部分留空,當我打電話時

da.update(users);

它會更新數據庫中的數據,其余字段會自動填充,而對接數據表仍將這些字段包含為空列。

沒有用戶ID的圖片

但是我需要用戶ID來更新或刪除用戶。 問題是如何將數據表與數據庫同步以獲取更新的字段,以便可以將其用於進一步的操作。 提前感謝你的幫助。

更新:插入查詢和參數如下所示

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;

在insert命令之后,執行以下操作以獲取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()); 

如果使用存儲過程,請確保將id參數聲明為輸出參數。

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

     --insert goes here

     set @id = scope_identity()
end

我使用以下參數化的插入查詢根據數據庫生成的ID更新dataTable中的ID字段。

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;

存儲過程在此處給出完整的解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM