用于Insering到数据库的C#Sql命令

时间:2017-03-30 18:11:33

标签: c# sql database

我是Visual C#编程语言的新手,最近我试图制作一个应该插入用户本地数据库的应用程序一些数据,但每次我的代码运行并且插入工作正常,数据库不会更新。这是我正在使用的代码

try
{
    cn.Open();
    SqlCommand insert = new SqlCommand();
    insert.CommandText = "insert into Clienti (Nume,Prenume,Parola,Email) values(@Nume,@Prenume,@Parola,@Email)";
    insert.Connection = cn;
    insert.Parameters.AddWithValue("@Nume", register_nume.Text);
    insert.Parameters.AddWithValue("@Prenume", register_prenume.Text);
    insert.Parameters.AddWithValue("@Parola", register_password.Text);
    insert.Parameters.AddWithValue("@Email", register_email.Text);
    insert.ExecuteNonQuery();
    SqlDataReader reader = insert.ExecuteReader();
    while (reader.Read()) { }

    MessageBox.Show("Added succesfully");
}
catch (Exception ex)
{
    MessageBox.Show(""+ex);
}

我已经尝试将属性Copy复制到输出,但它似乎不起作用。 对于我所犯的任何语法错误,我感到很抱歉,如果有任何帮助,我将不胜感激。

4 个答案:

答案 0 :(得分:2)

因为你现在必须使用select语句读取数据库,所以你不能使用INSERT SQL语句来阅读。

您可以在插入后立即添加以下内容。

using(var selectCmd = new SqlCommand("SELECT Nume,Prenume,Parola,Email FROM Clienti WHERE Nume = @Nume", cn))
{
    selectCmd.Parameters.AddWithValue("@Nume", register_nume.Text);
    using(SqlDataReader reader = selectCmd.ExecuteReader())
    {
        while (reader.Read()) { }
    }
}

如果你想知道如果插入了行或者插入了多少条记录,那么ExecuteNonQuery会返回受影响的行数。你可以改变这部分代码:

var recordsAffected = insert.ExecuteNonQuery();

if(recordsAffected > 0)
    MessageBox.Show("Added succesfully");
else
    MessageBox.Show("Nothing happened");

虽然在这种特殊情况下它没有意义,因为如果没有插入任何东西,它可能是由异常引起的。

一些附注

  • 始终在IDisposable块中包装实现using的类型(请参阅上面的代码作为示例)。它确保即使抛出异常,资源也会在您完成后立即释放。
  • 永远不要吞下例外!从一个恢复并记录它或根本不捕获它。如果你吞下它,你将永远不知道你的代码是否/为什么破坏。

答案 1 :(得分:2)

       insert.ExecuteNonQuery();
        SqlDataReader reader = insert.ExecuteReader();
        while (reader.Read()) { }

您只需要ExecuteNonQuery,它将运行INSERT。只有在运行生成结果集的语句(例如ExecuteReader)时,才需要使用SELECT 而不是。所以它应该是:

 insert.ExecuteNonQuery();

答案 2 :(得分:0)

这部分代码正在准备您正在运行的SQL命令

cn.Open();
SqlCommand insert = new SqlCommand();
insert.CommandText = "insert into Clienti (Nume,Prenume,Parola,Email) values(@Nume,@Prenume,@Parola,@Email)";
insert.Connection = cn;
insert.Parameters.AddWithValue("@Nume", register_nume.Text);
insert.Parameters.AddWithValue("@Prenume", register_prenume.Text);
insert.Parameters.AddWithValue("@Parola", register_password.Text);
insert.Parameters.AddWithValue("@Email", register_email.Text);

您的代码正在运行的SQL命令是INSERT语句,只有将新记录添加到您的表中。

此语句运行您之前设置的命令:

insert.ExecuteNonQuery();

如果我理解正确,在这里你试图再次从表中读取数据:

SqlDataReader reader = insert.ExecuteReader();
while (reader.Read()) { }

问题是,你的命令没有设置为阅读。要读取数据,您需要使用SELECT语句。像这样:

insert.CommandText = "SELECT Nume,Prenume,Parola,Email from Clienti" ;

因此,要在执行插入后读取数据,您应该这样做:

insert.CommandText = "SELECT Nume,Prenume,Parola,Email from Clienti" ;
SqlDataReader reader = insert.ExecuteReader();
while (reader.Read()) { }

答案 3 :(得分:0)

您执行2次查询:

insert.ExecuteNonQuery();
SqlDataReader reader = insert.ExecuteReader();

尝试获取受影响的行

int rows = insert.ExecuteNonQuery();

我建议在数据库中创建一个存储过程,然后执行SP。

从代码执行SP并将SQL编程保留在DB中总是更好。