2011-09-28 73 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套接字而不是打開新的連接。