【问题标题】:Parameters.Add in sql project c#参数.在sql项目c#中添加
【发布时间】:2014-10-09 17:19:24
【问题描述】:

我正在制作登录和注册表单,当我尝试注册时,它会将用户和密码放入 sql 数据库中,但它正在这样做:

我的项目看起来像这样:

        static public void Insert(string _userName)
    {
        try
        {
            connection.Open();
            SqlCeCommand commandInsert = new SqlCeCommand("INSERT INTO [Table](username) VALUES(@userName)", connection); 
            commandInsert.Parameters.Add("@userName", _userName);
            commandInsert.ExecuteNonQuery();
        }
        catch (SqlCeException expection)
        {
            MessageBox.Show(expection.ToString());
        }
        finally
        {
            connection.Close();
        }
    }



    static public void Insertt(string _password)
    {
        try
        {
            connection.Open();
            SqlCeCommand commandInsert = new SqlCeCommand("INSERT INTO [Table](password) VALUES(@Password)", connection); ;



            commandInsert.Parameters.Add("@password", _password);

            commandInsert.ExecuteNonQuery();
        }
        catch (SqlCeException expection)
        {
            MessageBox.Show(expection.ToString());
        }
        finally
        {
            connection.Close();
        }
    }

注册按钮如下所示:

      private void button1_Click(object sender, EventArgs e)
            {
                if (insertBox.Text != "" || deleteBox.Text != "")
                {
                    SQLFunctions.Insert(insertBox.Text);
                    SQLFunctions.Insertt(deleteBox.Text);
                    SQLFunctions.Refresh(this.dataGridView1);

                }
                else
                {
                    MessageBox.Show("login failed");
                }
            }

感谢您的帮助

【问题讨论】:

  • 请描述问题,不要只是给我们一个程序并期望我们为您调试/修复它
  • 为什么要在不同的记录中插入用户名和密码?为什么有两个功能呢? InserttInsert 有何不同?另外,请不要以纯文本形式存储用户密码。如果用户信任您的密码,请正确散列这些密码,使其无法被读取。

标签: c# sql winforms


【解决方案1】:

您正在插入 两个 记录:

SQLFunctions.Insert(insertBox.Text);
SQLFunctions.Insertt(deleteBox.Text);

这些函数中的每一个都在表中插入一条记录。所以你最终得到两条记录一点也不奇怪。我想只插入 一个 记录会更有意义:

SQLFunctions.Insert(insertBox.Text, deleteBox.Text);

并在函数中:

static public void Insert(string _userName, string _password)
{
    // ...
    SqlCeCommand commandInsert = new SqlCeCommand("INSERT INTO [Table](username, password) VALUES(@userName, @password)", connection); 
    commandInsert.Parameters.Add("@userName", _userName);
    commandInsert.Parameters.Add("@password", _password);
    // ...
}

每个值不需要单独的数据库查询,整个记录可以在单个查询中插入/更新。


其他一些注意事项...

  • 感谢您使用参数化查询。你会惊讶于有多少人不这样做:)
  • 您正在以纯文本形式存储用户密码。请永远不要这样做。用户密码应经过散列处理,并且在存储后不应可读。 (理想情况下,它们应该在您的代码收到时立即进行哈希处理,并且您应该只将哈希值用于任何事情,这样它们也不会意外地出现在日志转储中。)李>
  • 您可能希望为变量/函数/等考虑更有意义/正确的名称。它将极大地帮助您的调试工作,尤其是在您创建更复杂的东西时。例如,InsertInsertt 并没有真正告诉你他们在做什么,或者他们有什么不同。另外,为什么insertBox 有用户名而deleteBox 有密码?那只是误导。不要低估良好命名的重要性。

【讨论】:

    【解决方案2】:

    我可以在这里看到两个可能导致您的问题的错误。

    首先 - 在您的 button1_Click 事件中,您有:

    if (insertBox.Text != "" || deleteBox.Text != "")

    这会导致第一个问题 - 数据库中有空列。而是像这样检查:

    if (insertBox.Text != "" && deleteBox.Text != "")

    事实上,最好使用string.IsNullOrEmpty 来检查这个:

    if (!string.IsNullOrEmpty(insertBox.Text) && !string.IsNullOrEmpty(deleteBox.Text))

    其次,您不需要也不能使用两个查询来插入它。所以让它成为一个带有两个参数的查询:

    SqlCeCommand commandInsert = new SqlCeCommand("INSERT INTO [Table](username, password) VALUES(@username, @password)", connection);
    
    commandInsert.Parameters.Add("@username", _username);
    commandInsert.Parameters.Add("@password", _password);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 2015-10-21
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多