首页 > 解决方案 > 参数不起作用,这里有什么问题

问题描述

插入消息不起作用!我尝试使用参数插入数据

System.Data.SqlClient.SqlException:'变量名'@name'已经被声明。变量名称在查询批处理或存储过程中必须是唯一的。

    SqlCommand com = new SqlCommand();


    
    public Form1()
    {
        InitializeComponent();
    }

    //save | event Click
    private void btnSave_Click(object sender, EventArgs e)
    {



        if (txtName.Text == "" || txtLocation.Text == "")
        {
               MessageBox.Show("no data!","Hey you...",MessageBoxButtons.OK,MessageBoxIcon.Error);
        }

        else

        {
            com.Connection = con;
            com.CommandText = "insert into Table_1 values ( @name ,@location )";
            com.Parameters.AddWithValue("@name", txtName.Text);
            com.Parameters.AddWithValue("@location", txtLocation.Text);
            con.Open();
            com.ExecuteNonQuery();
            con.Close();
        }
        

    }

    //clear fun
    private void Clear()

    {
        txtName.Clear();
        txtLocation.Clear();
    }

    }
}

}

标签: c#.net

解决方案


你有一个范围问题。com您在修改它的范围之外定义 SqlCommand (即添加到参数列表)。本质上,您@name每次btnSave_Click调用方法时都会添加参数。

将您创建的行com移到方法中,使其看起来像这样:

 SqlCommand com = new SqlCommand();
 com.Connection = con;
 com.CommandText = "insert into Table_1 values ( @name ,@location )";
 com.Parameters.AddWithValue("@name", txtName.Text);
 com.Parameters.AddWithValue("@location", txtLocation.Text);
 con.Open();
 com.ExecuteNonQuery();
 con.Close();

SqlCommand com = new SqlCommand();从代码顶部删除。

这样,每次方法运行时都会重新创建命令,并且当它重新创建时,参数列表将为空,并且添加参数的行不会失败。

编辑 进一步澄清 - 问题是当你在你做的地方定义它时,你应该只添加一次参数。作为“全局变量”(实际上,在您的代码中它被称为字段),例如您正在创建它只会被实例化一次,这很好。当您向 SqlCommand 添加参数时,就会出现问题。因为每次单击按钮时都会运行该按钮单击处理程序(我假设),因此您会重复将参数添加到列表中。第一次点击按钮是可以的,因为那个时候参数列表是空的。下次单击该按钮时,您将获得异常,因为该列表已经添加了这些参数。

如果要继续cmd用作全局变量/字段,则应清除处理程序方法中的参数列表,如下所示:

 com.Connection = con;
 com.CommandText = "insert into Table_1 values ( @name ,@location )";
 com.Parameters.clear();
 com.Parameters.AddWithValue("@name", txtName.Text);
 com.Parameters.AddWithValue("@location", txtLocation.Text);
 con.Open();
 com.ExecuteNonQuery();
 con.Close();

推荐阅读