2011-09-28 102 views
0

嗨我想从本地SQL服务数据库获取数据以从用户注册表单中获取输入。但是当我按下它没有记录到可服务数据库的按钮时。C#使用SQL登录应用程序

我需要使用执行非查询吗?我将如何解决这个代码?感谢

using System.Data.Sql; 
using System.Data.SqlClient; 

namespace Paddle_Power 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Form2 form2 = new Form2(); 
      form2.Show(); 

      string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\PaddlePower.mdf;Integrated Security=True;User Instance=True"; 

      SqlConnection cn = new SqlConnection(connection); 
      try 
      { 
       cn.Open(); 
       MessageBox.Show("open"); 
      } 

      catch (Exception) 
      { 
       MessageBox.Show("Did not connect"); 
      } 

      string username = textBox1.Text; 
      string password = textBox2.Text; 
      string sqlquery = ("SELECT * FROM User WHERE Username = '" + textBox1.Text + "'"); 
      sqlquery = "INSERT INTO [User] (Username, Password) VALUES ('" + textBox1.Text + "','" + textBox2.Text + "')"; 

      SqlCommand command = new SqlCommand(sqlquery, cn); 

      command.Parameters.AddWithValue("Username", username); 
      command.Parameters.AddWithValue("Password", password); 
      command.Parameters.Clear(); 


     } 

    } 
} 
+1

你为什么分配给sqlquery,然后立即重新分配?你为什么不执行SQL?你没有正确使用参数...你有没有试过一个教程? –

+0

是的,我从一个教程得到了这个,但它有很多负面评论说同样的事情。你能帮我重新写这个吗? – stefan

+0

如果您不忽略抛出哪个异常,它可能也会帮助您排除故障。没有try/catch块,你会做得更好。 –

回答

2

东西。还有一些改进空间,但我至少希望能够解决你遇到的问题。

string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\PaddlePower.mdf;Integrated Security=True;User Instance=True"; 
object queryResult = null; 

using (SqlConnection cn = new SqlConnection(connection)) 
{ 
    cn.Open(); // Open connection 

    // SELECT 
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM User WHERE Username = @Username AND Password = @Password", cn)) 
    { 
     cmd.Parameters.AddWithValue("@Username", textBox1.Text); 
     cmd.Parameters.AddWithValue("@Password", textBox2.Text); 

     queryResult = cmd.ExecuteScalar(); 
    } 

    // INSERT 
    using (SqlCommand cmd = new SqlCommand("INSERT INTO [User] (Username, Password) VALUES (@Username, @Password)", cn)) 
    { 
     cmd.Parameters.AddWithValue("@Username", textBox1.Text); 
     cmd.Parameters.AddWithValue("@Password", textBox2.Text); 

     cmd.ExecuteNonQuery(); // or int affected = cmd.ExecuteNonQuery() 
    } 
} 

您可以要求第一个SqlCommand对象或创建一个新对象。您选择这样做的方式几乎没有什么区别。

queryResult只是为了存储cmd.ExecuteScalar()的结果。如果需要(可以选择多列)或将其转换为新类型(如果选择单列),可以将其映射到对象。

-1

你有没有参数,也没有你有没有实际发送查询到数据库沿着以下的应该有希望做到这一点的线

 // parameter placeholders defined with @parameter_name 
     sqlquery = "INSERT INTO [User] (Username, Password) VALUES (@username, @Password); 

     SqlCommand command = new SqlCommand(sqlquery, cn); 

     command.Parameters.AddWithValue("@Username", username); 
     command.Parameters.AddWithValue("@Password", password); 

     // This will make the query happen on the database. 
     // It will handle sending the parameters and all that good stuff 
     // http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx 
     command.ExecuteNonQuery(); 
+0

仍然无法正常工作,不会出现在我的数据库中。?任何其他想法 – stefan

+0

-1没有使用块。 –

+0

Downvote不使用块 - 严重吗?我相信OP在问我如何让数据库部分工作。我修复了参数部分并添加了所需的ExecuteNonQuery位。我的意思是,为什么不用downvote有一个Form1类名的问题? – billinkc

0

直接的答案是肯定的,你需要执行一个非查询。你看,你已经准备好了这个命令,但是你还没有发布它。 jstnasn的例子应该非常有帮助。记下使用语句 - 当你退出using语句时,这些语句会隐式关闭命令,从而确保命令始终在完成时关闭。

SqlConnection发生同样的情况 - 使用帮助确保连接正确处置。但是,如果你的数据库连接字符串允许连接池,那么我相信using语句只会杀死你的对象,而不会真正杀死与数据库的连接。这是有利的,因为下次需要打开数据库连接时,I/O开销会更低 - 只需连接到现有的TCP/IP套接字而不是打开新的连接。