【问题标题】:WPF insert to database executes but no data addedWPF 插入数据库执行但未添加数据
【发布时间】:2023-01-11 02:11:11
【问题描述】:

我有一个小表 (tbl_user_favs),用于存储用户收藏夹。第一列是用户ID,之后的每一列是一个slot,用于存储选定的喜爱的PC,记为Slot1、Slot2。

                using (SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\UserFavorites.mdf;Initial Catalog=tbl_user_favs;Integrated Security=True;Connect Timeout=30"))
                {
                    string cmdString = ("SELECT * FROM tbl_user_favs WHERE UserID = '" + Globals.emailUID + "'");
                    SqlCommand cmd = new SqlCommand(cmdString, con);

                    cmd.Parameters.Add("@Slot1", SqlDbType.VarChar).Value = PCnum;
                    

                    DataSet loginCredentials = new DataSet();
                    SqlDataAdapter dataAdapter;

                    con.Open();

                    //dataAdapter = new SqlDataAdapter(cmdString, con);
                    dataAdapter = new SqlDataAdapter(cmd);
                    dataAdapter.Fill(loginCredentials);
                    //cmd.ExecuteNonQuery();

                    con.Close();
                }

代码执行,但它不会将 PCnum 添加到 UserID 旁边的数据库中。它应该遍历行,找到与登录用户 Globals.emailUId 匹配的 UserID,并将 PCnum 添加到一个空槽中。不用担心如何动态增加插槽,为什么这个插入不将 PCnum 添加到插槽 1?我看过一些教程使用 ExecuteNonQuery,一些使用 dataAdapter,但两者的结果相同。我怀疑我的 SQL 有问题?谢谢

【问题讨论】:

  • 首先,您的SELECT 语句是一个查询,而不是一个非查询。它也很容易出现SQL injection attacks。并且参数@Slot1 不是查询的一部分。最后,您的代码与 WPF 无关。

标签: c# sql wpf


【解决方案1】:

这里发生了几件事。

首先是您错误地使用了“参数”。它应该将数据添加到您的查询中,而不是在进行查询后将数据添加到数据库/行/列中。

sql parameterized query in C# with string

其次,您正在执行 select 查询,因此您只是从数据库中获取数据,而不是将数据放入其中。

要做你想做的事,你需要这样做:(我没有很好的方法来测试这个,所以它可能需要调整,但它应该很接近。)

using (SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)MSSQLLocalDB;AttachDbFilename=C:UsersUserFavorites.mdf;Initial Catalog=tbl_user_favs;Integrated Security=True;Connect Timeout=30"))
{
  string cmdString = ("UPDATE tbl_user_favs SET Slot1 = @Slot1 WHERE UserID = @EmailUID");
  SqlCommand cmd = new SqlCommand(cmdString, con);

  cmd.Parameters.AddWithValue("@Slot1", PCnum);
  cmd.Parameters.AddWithValue("@EmailUID", Globals.emailUID);
  con.Open();
  cmd.ExecuteNonQuery();
  con.Close();
}

您不再需要 DataSet 或 SqlDataAdapter。

由于您似乎对什么是参数化以及为什么要使用它感到困惑,因此也请查看this question。

这里只是关于一般主题的更多阅读。我将这些文章用作此答案的资源:
https://visualstudiomagazine.com/articles/2017/07/01/parameterized-queries.aspx

https://www.c-sharpcorner.com/UploadFile/a20beb/why-should-always-use-the-parameterized-query-to-avoid-sql-i/

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2017-01-29
    • 2011-01-21
    • 2019-01-28
    • 2018-07-04
    • 2018-09-15
    相关资源
    最近更新 更多