C# ExecuteOnQuery在C中不工作#

C# ExecuteOnQuery在C中不工作#,c#,sql-server,executenonquery,C#,Sql Server,Executenonquery,我正在使用Visual Studio 2008 c#构建一个数据库,当我尝试向数据库中插入一条新记录时,ExecuteNonQuery似乎尚未初始化。我复制我的代码,希望有人能在这方面帮助我,因为我是新手 private void button1_Click(object sender, EventArgs e) { SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:

我正在使用Visual Studio 2008 c#构建一个数据库,当我尝试向数据库中插入一条新记录时,
ExecuteNonQuery
似乎尚未初始化。我复制我的代码,希望有人能在这方面帮助我,因为我是新手

 private void button1_Click(object sender, EventArgs e)
 {
     SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Usuario\Documents\Visual Studio 2010\Projects\Nova\Nova\Database1.mdf;Integrated Security=True;User Instance=True");
     SqlCommand cmd = new SqlCommand();
     cn.Open();
     cmd.CommandText = "insert into Database1.mdf(Codigo,Nombre,Cantidad,Tipo) values('"+comboBox1.Text+"','"+textBox3.Text+"','"+textBox1.Text+"','"+comboBox2.Text+"')";
     cmd.ExecuteNonQuery();
     cmd.Clone();
     cn.Close();
     MessageBox.Show("Acabas de agregar un producto");
 }

您尚未设置与命令的连接:

cmd.Connection = cn;

您没有使用连接初始化
SqlCommand
。此外,您还应该使用
将所有内容包含在这里。并考虑使用参数化的命令避免SQL注入。
   private void button1_Click(object sender, EventArgs e)
    {
        using (SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Usuario\Documents\Visual Studio 2010\Projects\Nova\Nova\Database1.mdf;Integrated Security=True;User Instance=True"))
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = "insert into databaseTableName (Codigo,Nombre,Cantidad,Tipo) values (@Codigo, @Nombre, @Cantidad, @Tipo)";
                cmd.Parameters.AddWithValue("@Codigo", comboBox1.Text);
                cmd.Parameters.AddWithValue("@Nombre", textBox3.Text);
                cmd.Parameters.AddWithValue("@Cantidad", textBox1.Text);
                cmd.Parameters.AddWithValue("@Tipo", comboBox2.Text);
                cmd.Connection = cn; //this was where the error originated in the first place.
                cn.Open();
                cmd.ExecuteNonQuery();
                MessageBox.Show("Acabas de agregar un producto");
            }
        }
    }

您的代码中有许多问题:

  • 第一:需要一个目标datatable,而不是 MDF文件
  • 第二步:使用关闭和处理连接
  • 第三:避免解析问题和sql 注射
  • 第四:您需要将连接与命令相关联(很容易) (在会议上完成)

编辑 下面@RemusRusanu添加的链接提供的信息非常重要。使用AddWithValue虽然方便,但可能会妨碍查询的性能。正确的方法应该是使用正确定义的SqlParameter,该参数具有显式数据类型和参数大小。 例如

SqlParameter p = new SqlParameter("@cod", SqlDbType.NVarChar, 255).Value = comboBox1.Text;
cmd.Parameters.Add(p);

但是,当然,这要求您检查列的确切数据类型和大小。

是否有异常?与我们共享?您必须为命令对象分配连接。您的代码易受SQL注入攻击。此外,您应该对实现IDisposable接口的类使用
using
块,特别是对SqlConnection类,以便在出现异常时关闭连接。此外,Database1.mdf是文件名。您的数据库中是否定义了任何表?以及什么'cmd.Clone();应该怎么做?打字错误(cmd.Close?..)。在第一个
{
。此外,即使在第一次使用
语句后不需要大括号,它们也会使范围更容易查看。是的,复制粘贴总是失败。我真的不同意大括号,尽管你再次添加超链接、更好的格式和更快的键入。触摸!;)+1但仅供参考
AddWithValue
一个反模式。看,真相!编辑掉了,这是一个疏忽,因为我试图击败你找到答案;)这也让我明白:(我希望它会抛出一个错误
SqlParameter p = new SqlParameter("@cod", SqlDbType.NVarChar, 255).Value = comboBox1.Text;
cmd.Parameters.Add(p);