C# 如何将数据表与数据库同步
我正在创建一个涉及用户注册的小wpf项目。在这个项目中,我使用dataAdapter将数据从数据库加载到datatablesC# 如何将数据表与数据库同步,c#,.net,datatable,C#,.net,Datatable,我正在创建一个涉及用户注册的小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 DataT
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);
它会更新数据库中的数据,并自动填充其余字段,但datatable仍将这些字段作为空列包含
但我需要用户Id来更新或删除用户。问题是如何将datatable与更新字段的数据库同步,以便将它们用于进一步的操作。提前感谢您的帮助
更新:
插入查询和参数如下所示
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());
执行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参数声明为输出参数
create procedure dbo.SaveUser
(
@id int = null out,
...
)
as
begin
--insert goes here
set @id = scope_identity()
end
我使用以下参数化的insert查询根据数据库生成的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;
使用存储过程完成解释。我使用以下参数化插入查询,根据数据库生成的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;
使用存储过程完成说明。警告-您正在数据库中以明文形式存储密码。这不是一个好的做法。密码应该是单向散列的。遵循良好的安全实践非常重要。感谢您的建议。但这个项目只是一个家庭作业的实践。因此,目前没有安全问题。问题中没有任何内容与WPF相关。删除了不相关的标记。警告-您正在数据库中以明文形式存储密码。这不是一个好的做法。密码应该是单向散列的。遵循良好的安全实践非常重要。感谢您的建议。但这个项目只是一个家庭作业的实践。因此,目前没有安全问题。问题中没有任何内容与WPF相关。删除了不相关的标记。很抱歉,我不熟悉C#我正在使用dataAdapter更新数据库。您能解释一下我必须在何处放置这段代码才能获取Id吗。这是一个示例:SqlCommand cmd=new SqlCommand(“插入到产品(ProductName,UnitPrice)值(@ProductName,@Price);选择SCOPE_IDENTITY()”,conn);我没有单独调用SqlCommand,我只是调用da.update();哪一个调用insert SqlCommand,即使我将显式调用它,那么我如何确定返回的id属于哪一行?+1在insert命令中提供了同时执行多个查询的想法,非常感谢您的帮助抱歉,我是C的新手,我正在使用dataAdapter更新数据库。您能解释一下我必须在哪里放置这种和平的方法吗获取Id的代码。这是一个示例:SqlCommand cmd=new SqlCommand(“插入产品(ProductName,UnitPrice)值(@ProductName,@Price);选择SCOPE\u IDENTITY()”,conn);我没有单独调用SqlCommand,我只是调用da.update();哪一个调用insert SqlCommand,即使我将显式调用它,那么我如何确定返回的id属于哪一行?+1在insert命令中给出了同时执行多个查询的想法,非常感谢您的帮助我是c新手#您能解释存储过程吗?在进行了大量头脑风暴之后,不知何故,我设法理解了存储过程,然后根据我的要求对其进行了更改。我是c#的新手,您能解释一下存储过程吗?在进行了大量头脑风暴之后,不知何故,我设法理解了存储过程,然后根据我的要求对其进行了更改。