【问题标题】:How to synchronize DataTables with database如何将 DataTables 与数据库同步
【发布时间】:2016-08-05 00:15:20
【问题描述】:

我正在创建一个涉及用户注册的小型 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 来更新或删除用户。问题是如何将数据表与数据库同步以获取更新的字段,以便我可以将它们用于进一步的操作。提前感谢您的帮助。

更新: 下面给出了插入查询和参数

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;

【问题讨论】:

  • 警告 - 您在数据库中以明文形式存储密码。这不是一个好习惯。密码应该是一种散列和加盐的方式。遵循良好的安全实践非常重要。
  • 感谢您的建议。但这个项目只是练习的家庭作业。所以目前没有安全问题。
  • 问题中没有任何内容与 WPF 相关。删除了不相关的标签。

标签: c# .net datatable


【解决方案1】:

如果您使用的是存储过程,请确保将 id 参数声明为输出参数。

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

     --insert goes here

     set @id = scope_identity()
end

【讨论】:

  • 我是 C# 新手,你能解释一下存储过程吗?
  • 在进行了很多头脑风暴之后,我设法理解了存储过程,然后根据我的要求进行了更改。
【解决方案2】:

在插入命令之后执行这些操作以获取 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()); 

【讨论】:

  • 对不起,我是 C# 新手,我正在使用 dataAdapter 来更新数据库,你能解释一下我必须在哪里放置这段代码来获取 Id。
  • 这是一个例子:SqlCommand cmd = new SqlCommand("Insert into Products (ProductName, UnitPrice) VALUES (@ProductName, @Price); select SCOPE_IDENTITY()", conn);
  • 去试试吧
  • 有新问题我没有单独调用 SqlCommand 我只是调用 da.update();哪些调用插入 SqlCommand,即使我会显式调用它,我如何确定返回的 id 属于哪一行?
  • +1 提供了在插入命令中一次执行多个查询的想法,非常感谢您的帮助
【解决方案3】:

我使用以下参数化插入查询根据数据库生成的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 和存储过程。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多