2013-03-19 230 views
-1

我是新手C#程序員。我試圖用C#做遊戲。在我的註冊頁面有一些錯誤。它說ExecuteNonQuery:Connection屬性還沒有初始化在這行「int result = command.ExecuteNonQuery();」。這是我的C#代碼。請幫我解決這個問題。如何解決ExecuteNonQuery:連接屬性尚未初始化

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace WiimoteTest 
{ 
public partial class regispage : Form 
{ 

    private SqlConnection connection; 
    private string sql; 
    private SqlCommand command = new SqlCommand(); 



    public regispage() 
    { 
     InitializeComponent(); 
    } 

    private void back_Click(object sender, EventArgs e) 
    { 
     startpage back = new startpage(); 
     back.Show(); 
     this.Close(); 
    } 

    private void regispage_Load(object sender, EventArgs e) 
    { 
     string conStr = @"Data Source=.\SQLEXPRESS; 
         AttachDbFilename=C:\Users\vaio\Downloads\Compressed\WiimotLib_1.7\WiimotLib_1.7\samples\WiimoteTestCS_5_AllpagePuppyGameTestBirdResizepicTestDB\Angee.mdf; 
         Intregrated Security=True;User Instance=True;"; 
     connection = new SqlConnection(conStr); 
     if (connection.State == ConnectionState.Closed) 
     { 
      connection.Open(); 
     } 
    } 

    private bool IsCompleteData() 
    { 
     string errMsg = ""; 
     if (username.Text == "") 
     { 
      errMsg = "Please input username"; 
     } 
     else if (password.Text == "") 
     { 
      errMsg = "Please input password"; 
     } 
     else if (fname.Text == "") 
     { 
      errMsg = "Please input firstname"; 
     } 
     else if (lname.Text == "") 
     { 
      errMsg = "Please input lastname"; 
     } 
     else if (nickname.Text == "") 
     { 
      errMsg = "Please input nickname"; 
     } 
     else if (gender.SelectedIndex == -1) 
     { 
      errMsg = "Please select gender"; 
     } 
     else if (age.Text == "") 
     { 
      errMsg = "Please input age"; 
     } 
     else if (symptom.Text == "") 
     { 
      errMsg = "Please input symptom"; 
     } 

     if (errMsg == "") 
     { 
      return true; 
     } 
     else 
     { 
      MessageBox.Show(errMsg); 
      return false; 
     } 
    } 

    private void AddParamterValues() 
    { 
     command.Parameters.AddWithValue("username", username.Text); 
     command.Parameters.AddWithValue("password", password.Text); 
     command.Parameters.AddWithValue("fname", fname.Text); 
     command.Parameters.AddWithValue("lname", lname.Text); 
     command.Parameters.AddWithValue("nickname", nickname.Text); 
     command.Parameters.AddWithValue("gender", gender.SelectedItem.ToString()); 
     command.Parameters.AddWithValue("age", age.Text); 
     command.Parameters.AddWithValue("symptom", symptom.Text); 
    } 

    private void submit_Click(object sender, EventArgs e) 
    { 
     if (!IsCompleteData()) 
     { 
      return; 
     } 

     InsertData(); 


    } 

    private void InsertData() 
    { 
     using (var connection = new SqlConnection()) 
     using (var command = connection.CreateCommand()) 
     { 
      sql = @"INSERT INTO User(username, password, fname, lname, nickname, gender, age, symptom) 
       VALUES(@username, @password, @fname, @lname, @nickname, @gender, @age, @symptom),this.connection"; 

      **connection.Open();** 

      var affectedRows = command.ExecuteNonQuery(); 

      command.Parameters.Clear(); 
      command.CommandText = sql; 

      AddParamterValues(); 

      if (affectedRows < 1) 
      { 
       MessageBox.Show("Error to insert data"); 
       return; 
      } 
      else 
      { 
       MessageBox.Show("Insert data complete"); 
       menupage submit = new menupage(); 
       submit.Show(); 
       this.Close(); 
      } 
     } 
    } 

    private void regispage_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (connection.State == ConnectionState.Open) 
     { 
      connection.Close(); 
     } 
    } 

} 

}

回答

0

你沒有告訴命令要使用的連接。

+0

Thx幫助。在那一行,我已經刪除了「//」評論,但它仍然有相同的錯誤。我應該怎麼做:( – user2187208 2013-03-19 16:06:57

+0

command.Connection =連接 – 2013-03-19 16:09:50

+0

我已經修改我的代碼爲command.Connection = connection;但它仍然不起作用 – user2187208 2013-03-19 16:14:04

1

沒有類級別的數據客戶端對象。儘快創建並處理它們。

private void InsertData() 
{ 
    using (var connection = new SqlConnection("YOUR_CONNECTION_STRING_HERE")) 
    using (var command = connection.CreateCommand()) 
    { 
     // populate command details 

     connection.Open(); 

     var affectedRows = command.ExecuteNonQuery(); 

     // do whatever 
    } 
} 

當您使用我的建議,你就可以擺脫這些行:

private SqlConnection connection; 
private string sql; 
private SqlCommand command = new SqlCommand(); 

......一旦你解決所有的編譯器錯誤(通過刪除代碼),你會好去。

+0

我真的不知道在哪裏添加這段代碼。可以更詳細地解釋一下 – user2187208 2013-03-19 16:13:02

+0

他意味着你應該使用你正在使用的相同功能創建你的連接和命令。 – 2013-03-19 16:15:13

+0

@ user2187208:查看更新 – 2013-03-19 16:20:03

0

請注意,通常應避免打開連接並將其保持打開狀態,特別是在Web或其他多用戶,多線程應用程序中。默認情況下,連接是合併(也就是說,只要使用完全相同的連接字符串值進行連接,它們就會保持打開狀態並可在應用程序域內使用)。只需創建所需的連接,儘可能快地構建並執行連接的命令和執行,並讓基礎結構擔心引擎蓋下發生的事情。

用於執行SQL的總體方案是這樣的:

public DataTable executeMyStoredProcedure() 
{ 
    DataTable dt = new DataTable() ; 
    string connectString = "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;" ; 

    using (SqlConnection connection = new SqlConnection(connectString)) 
    using (SqlCommand cmd = connection.CreateCommand()) 
    using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
    { 
    cmd.CommandText = "dbo.myStoredProcedure" ; 
    cmd.CommandType = CommandType.StoredProcedure; 

    // add your parameters here 

    sda.Fill(dt) ; 

    connection.Close() ; // redundant, FWIW, since it will be closed via Dispose() when control leaves the using block. 

    } 

    return dt ; 
} 

連接字符串的格式將取決於你在說什麼關係數據庫的不同而不同。請參閱http://connectionstrings.com以瞭解針對不同提供者和數據庫類型所需的最小值。但應該指出,連接字符串有許多不同的鍵可以根據需要設置爲配置連接。

而且代碼將取決於您的執行如何。有幾種不同的方法可以執行您的查詢。

相關問題