【问题标题】:How to solve ExecuteNonQuery: Connection property has not been initialized如何解决 ExecuteNonQuery:连接属性尚未初始化
【发布时间】:2013-03-19 16:02:07
【问题描述】:

我是新手 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();
        }
    }

}

}

【问题讨论】:

    标签: c# executenonquery


    【解决方案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();
    

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

    【讨论】:

    • 我真的不知道在哪里添加这段代码。你能解释一下在哪里添加这段代码吗?谢谢。
    • 他的意思是你应该在你使用它们的同一个函数中创建你的连接和命令。
    • 我已经根据您的建议修改了我的代码,但出现此错误“连接字符串属性尚未初始化。”在这一行“connection.Open();”。我认为我的代码错过了一些东西,因为在“connection.Open();”行中打开的单词用黑色书写。
    • 我尝试删除这段代码“private SqlConnection connection; private string sql; private SqlCommand command = new SqlCommand();”但它会导致很多错误,因为上面的代码不知道“命令”和“连接”参数所以我把它放回去它得到了零错误但是当我运行代码时它得到了上面的错误。
    • @user2187208:查看更新。同时摆脱这些行并修复编译器错误(删除代码并内联设置属性的方法)
    【解决方案2】:

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

    【讨论】:

    • 感谢您的帮助。在那一行,我已经删除了“//”注释,但它仍然有同样的错误。我该怎么办:(
    • 我已经将我的代码修改为 command.Connection = connection;但它仍然不起作用。
    【解决方案3】:

    请注意,一般情况下,您应避免打开连接并使其保持打开状态,尤其是在 Web 或其他多用户、多线程应用程序中。默认情况下,连接是 pooled 的(也就是说,只要使用完全相同的连接字符串值建立连接,它们就会保持打开并在应用程序域中可用)。只需尽可能快地创建所需的连接,构建并执行命令和连接的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 了解不同提供程序和数据库类型所需的 minimal 值。不过应该注意的是,连接字符串有许多不同的键,可以根据需要设置来配置连接。

    并且代码会根据您的执行方式而有所不同。您可以通过多种不同的方式执行查询。

    【讨论】:

      猜你喜欢
      • 2012-05-03
      • 2011-07-22
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多