的ExecuteNonQuery。连接属性尚未初始化

时间:2015-01-19 08:49:37

标签: c# sql-server winforms

嘿伙计我的代码上有这个错误,但似乎在其他新项目上工作,它总是突出显示ExecuteNonQuery。 我试图用谷歌和这个网站搜索解决方案,但我真的不知道为什么它有错误。

我也在mssql express中使用。

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

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

    private void ICButton_Click(object sender, EventArgs e)
    {
        DBConn.DBOpen();
        lbConnTest.Text = "OK";
        DBConn.DBClose();
    }
    private void ISaveButton_Click(object sender, EventArgs e)
    {
        string sql = (@"INSERT INTO dbo.HWTable(Brand, CPU, RAM, HSerial, Model, ACode, PYear, UName, Position, Depart) VALUES('" + BrandCBox.Text + "', '" + CPUTBox.Text + "', '" + RAMTBox.Text + "', '" + HSerialTBox.Text + "', '" + ModelTBox.Text + "', '" + ACodeTBox.Text + "', '" + PYearPicker.Text + "', '" + UNameTBox.Text + "', '" + PositionCBox.Text + "', '" + DepartCBox.Text + "');");
        SqlCommand cmd = new SqlCommand(sql);
        DBConn.DBOpen();
        cmd.Parameters.AddWithValue("@Brand", BrandCBox.Text);
        cmd.Parameters.AddWithValue("@CPU", CPUTBox.Text);
        cmd.Parameters.AddWithValue("@RAM", RAMTBox.Text);
        cmd.Parameters.AddWithValue("@HSerial", HSerialTBox.Text);
        cmd.Parameters.AddWithValue("@Model", ModelTBox.Text);
        cmd.Parameters.AddWithValue("@ACode", ACodeTBox.Text);
        cmd.Parameters.AddWithValue("@PYear", PYearPicker.Text);
        cmd.Parameters.AddWithValue("@UName", UNameTBox.Text);
        cmd.Parameters.AddWithValue("@Position", PositionCBox.Text);
        cmd.Parameters.AddWithValue("@Depart", DepartCBox.Text);
        cmd.ExecuteNonQuery(); //<--error here
        DBConn.DBClose();      
    }

    public class DBConn
    {
        public static void DBOpen()
        {
            string source = @"Data Source = 10.201.0.17; Initial Catalog = ITinven; USER ID = sa; PASSWORD = jc9989;";
            SqlConnection conn;
            conn = new SqlConnection(source);
            conn.Open();
        }

        public static void DBClose()
        {
            string source = @"Data Source = 10.201.0.17; Initial Catalog = ITinven; USER ID = sa; PASSWORD = jc9989;";
            SqlConnection conn;
            conn = new SqlConnection(source);
            conn.Close();
        }
    } 

}

2 个答案:

答案 0 :(得分:7)

错误消息已清除;

  

连接属性尚未初始化

连接您的SqlComamndSqlConnection喜欢;

SqlCommand cmd = new SqlCommand(sql, conn);

奇怪的是,您使用字符串连接添加插入值,但您也尝试将它们添加为参数。阅读:Give me parameterized SQL, or give me death。而且您不需要DBOpenDBClose这样的方法。

作为最佳做法,请使用using statement来处理您的SqlComamndSqlConnection,而不是手动调用.Close()方法,并停止使用AddWithValue } 方法。 可能会产生意外结果。请改用.Add() method或它的重载。

阅读:Can we stop using AddWithValue() already?

using(SqlConnection conn = new SqlConnection(source))
using(SqlCommand cmd = conn.CreateCommand())
{
   // Set your CommandText property with parameterized way.
   // Add your parameters with .Add() method
   // Open your connection
   // Execute your query.
}

如果您的代码中出现任何错误消息或异常,请仔细阅读 。还有一次,还有一次......这使很多更容易解决你的问题。

答案 1 :(得分:0)

(1)传递参数的正确方法

(2)始终使用try-catch块

(3)使用sqlcommand text和sql connection初始化Sqlcommand的正确方法。

// see how parameters are used

SqlCommand sqlcommand0;

using (SqlConnection conn = new SqlConnection(con_str))

{

    conn.Open();

    string sql = "INSERT INTO dbo.HWTable(Brand, CPU, RAM, HSerial, Model, ACode, PYear, UName, Position, Depart) VALUES(@Brand, @CPU, @RAM, @HSerial, @Model, @ACode, @PYear, @UName, @Position, @Depart)";       // (1)

    try                                                // (2)

    {

        using (sqlcommand0 = new SqlCommand(commandtext, conn)) // (3)

        {

            sqlcommand0.Parameters.Add(new SqlParameter("@Brand", Brand.Text));

            sqlcommand0.Parameters.Add(new SqlParameter("@CPU", CPU.Text));

            ....

            sqlcommand0.ExecuteNonQuery();

        }

    }

    catch

    {

        Console.WriteLine("Count not insert data into table.");

    }

}