Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数据表与数据库同步_C#_.net_Datatable - Fatal编程技术网

C# 如何将数据表与数据库同步

C# 如何将数据表与数据库同步,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

我正在创建一个涉及用户注册的小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);
它会更新数据库中的数据,并自动填充其余字段,但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#的新手,您能解释一下存储过程吗?在进行了大量头脑风暴之后,不知何故,我设法理解了存储过程,然后根据我的要求对其进行了更改。