加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从Windows窗体上的单个按钮多次将数据插入到SQL表中

发布时间:2020-12-15 18:30:56 所属栏目:百科 来源:网络整理
导读:我将数据从 Windows Forms表单插入到SQL数据库中,如下所示: public partial class Form1 : Form{ SqlConnection c = new SqlConnection(); string q = "Trusted_Connection = true; "; public Form1() { InitializeComponent(); c.ConnectionString = q; Me
我将数据从 Windows Forms表单插入到SQL数据库中,如下所示:
public partial class Form1 : Form
{
    SqlConnection c = new SqlConnection();
    string q = "Trusted_Connection = true; ";

    public Form1()
    {
        InitializeComponent(); c.ConnectionString = q;
        MessageBox.Show("Connecting Database");
    }

    private void button1_Click(object sender,EventArgs e)
    {
        string w = "insert into checkmultiuser(username) values (@username)";

        SqlCommand cmd = new SqlCommand(w,c);
        cmd.Parameters.Add("@username",SqlDbType.VarChar);
        cmd.Parameters["@username"].Value = textBox1.Text;
        cmd.ExecuteReader();
    }

但是,当我再次单击该按钮时,它会显示“已经有一个与此命令关联的打开的DataReader必须先关闭.”.

我该如何处理?

*更新:*我已更改按钮点击事件代码,如下所示:

private void button1_Click(object sender,EventArgs e)
{
    **c.Open();**

    string w = "insert into checkmultiuser(username) values (@username)";

    SqlCommand cmd = new SqlCommand(w,c);

    cmd.Parameters.Add("@username",SqlDbType.VarChar);
    cmd.Parameters["@username"].Value = textBox1.Text;
    //cmd.ExecuteNonQuery();
    cmd.ExecuteReader();
    **c.Close();**
}

它的缺点是什么?一个是一次又一次,当点击按钮时,连接被打开和关闭.

解决方法

读者需要打开连接,因为您一次检索一个结果.您需要为插入,删除和更新执行 ExecuteNonQuery().您还需要在事后关闭连接.另一种方法是,如果计划进行多次插入,则将插入包装成循环.

有几种方法可以做到这一点.如果您计划一遍又一遍地重用相同的连接对象和命令对象,这种方法很有用:

public partial class Form1 : Form
{
    SqlConnection _cn;
    SqlCommand _cmd;

    const string ConnString = "Enter your connection string here";
    readonly string _insertQuery;
    const string UsernameParm = "@username";

    public Form1()
    {
        InitializeComponent(); 
        _cn = new SqlConnection(ConnString);

        _cmd = new SqlCommand(InsertQuery,_cn);        
        _cmd.Parameters.Add(UsernameParm,SqlDbType.VarChar);

        _insertQuery = String.Format("INSERT INTO checkmultiuser(username) VALUES ({0})",UsernameParm);
    }

    private void button1_Click(object sender,EventArgs e)
    {        
        _cmd.Parameters[UsernameParm].Value = textBox1.Text;

        try
        {
            _cn.Open();
            _cmd.ExecuteNonQuery();
        }
        catch (Exception ex) // probably best to catch specific exceptions
        {
            // handle it
        }
        finally
        {
            _cn.Close();
        }
    }
}

只需确保处理连接和命令对象(当表单关闭或对应用程序最有意义时).

使用块是一种更安全的替代方法,但它们每次都会处理该对象(尽管默认情况下连接使用连接池):

public partial class Form1 : Form
{
    const string ConnString = "Enter your connection string here";
    readonly string _insertQuery;
    const string UsernameParm = "@username";

    public Form1()
    {
        InitializeComponent();             

        _insertQuery = String.Format("INSERT INTO checkmultiuser(username) VALUES ({0})",EventArgs e)
    {  
        using (var cn = new SqlConnection(ConnString))
        {
            using (var cmd = new SqlCommand(InsertQuery,cn))
            {
                cmd.Parameters.Add(UsernameParm,SqlDbType.VarChar);
                cmd.Parameters[UsernameParm].Value = textBox1.Text;

                cn.Open();
                cmd.ExecuteNonQuery();
            }
        }
    }
}

任何组合都可以.您可以设置一次连接,然后将命令对象包装在using块中.我知道有些人不是嵌套使用块的粉丝(因为在幕后它是尝试(最后尝试))).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读