我正在创建一个涉及用户注册的小型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类型列,默认值为Zero。这是数据库架构。
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来更新或删除用户。问题是如何将数据表与数据库同步以获取更新的字段,以便我可以将它们用于进一步的操作。在此先感谢您的帮助。
更新 插入查询和参数如下所示
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;
答案 0 :(得分:1)
在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());
答案 1 :(得分:1)
如果您使用的是存储过程,请确保将id参数声明为输出参数。
create procedure dbo.SaveUser
(
@id int = null out,
...
)
as
begin
--insert goes here
set @id = scope_identity()
end
答案 2 :(得分:0)
我使用以下参数化插入查询来根据数据库生成的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;
使用存储过程给出here的完整解释。