2014-10-09 47 views
-3

我正在做一个登录和注册表格,当我尝试注册它把用户名和密码在SQL数据库中,但它这样做:
enter image description here
我的项目看起来是这样的:Parameters.Add在SQL项目C#

 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"); 
       } 
      } 

感谢您的帮助

+4

请说明问题,不只是把我们的程序,并且希望我们的调试/修复它为您 – Steve 2014-10-09 17:20:46

+1

你为什么将在单独的记录的用户名和密码?为什么有两个功能呢?是什么让'Insertt'与'Insert'不同?另外,请不要以纯文本存储用户密码。如果用户使用他们的密码信任您,请妥善散列这些密码,以免他们被读取。 – David 2014-10-09 17:24:13

回答

3

你插入记录:

这些功能
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有一个密码?这只是误导。不要低估好命名的重要性。
0

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

第一 - 在您的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);