-1

我是一个新手 C# 程序员。我尝试用 C# 制作游戏。在我的注册页面上出现了一些错误。它说 ExecuteNonQuery: Connection property has not been initializedat this line "int result = command.ExecuteNonQuery();"。这是我的 C# 代码。请帮我解决这个问题。

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

}

}

4

3 回答 3

2

没有类级数据客户端对象。尽快创建和处理它们。

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();

...一旦您修复了所有编译器错误(通过删除代码),您就可以开始了。

于 2013-03-19T16:06:19.443 回答
1

您没有告诉 Command 要使用哪个连接。

于 2013-03-19T16:04:43.397 回答
0

请注意,一般情况下,您应该避免打开连接并使其保持打开状态,尤其是在 Web 或其他多用户、多线程应用程序中。默认情况下,连接是化的(也就是说,只要使用完全相同的连接字符串值建立连接,它们就会保持打开并在应用程序域中可用)。只需创建所需的连接,尽可能快地构建和执行连接的命令和Close()/ ,让基础设施担心幕后发生的事情。Dispose()

执行 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 。不过应该注意的是,连接字符串有许多不同的键,可以根据需要设置这些键来配置连接。

并且代码将根据的执行方式而有所不同。有几种不同的方法可以执行您的查询。

于 2013-03-19T19:27:05.700 回答