一次记录插入然后多次更新

时间:2013-06-25 17:57:37

标签: c#

我有一个表单,用户可以在其中插入,查看和更新​​数据。数据插入只进行一次,然后可以多次进行更新。默认情况下,用户将能够查看数据库中是否存在数据。

我尝试了这个,但它没有插入数据库。然后假设数据库中存在数据,当用户想要更新记录时,它会抛出错误 - DataReader已打开。

   private void display_Emp()
    {
        try
        {
            using (sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
            {
                sqlCon.Open(); 

                SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Employee", sqlCon);
                DataSet ds = new DataSet("Employee");
                da.Fill(ds, "Employee");
                int x = 0;
                for (x = 0; x < ds.Tables[0].Rows.Count; x++)
                {
                    txtID.Text = ds.Tables[0].Rows[x][1].ToString();
                    txtEmpName.Text = ds.Tables[0].Rows[x][2].ToString();
                }
            }
        }
        catch(Exception exx) {
            MessageBox.Show(exx.Message);
        }
        finally {
            sqlCon.Close();
        }
    }

private void btnSave_Click(object sender, EventArgs e)
{
    try 
    {
        using (sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
        {
            sqlCon.Open();
            SqlCommand com = new SqlCommand("SELECT * FROM Employee", sqlCon);

            read = com.ExecuteReader(); 

            while (read.Read())
            {                     
                if (read.HasRows) 
                {
                    SqlCommand update = new SqlCommand("UPDATE Employee SET EmpID = '" + txtID.Text + "' , EmpName = '" + txtEmpName.Text + "', sqlCon);
                    update.ExecuteNonQuery();
                    MessageBox.Show("Employee details updated!", "Employee", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    SqlCommand comm = new SqlCommand("INSERT INTO Employee(EmpID, EmpName) VALUES ('" + txtID.Text + "','" + txtEmpName.Text + "')", sqlCon);
                    comm.ExecuteNonQuery();
                    MessageBox.Show("Employee details saved!", "Employee", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }
    }
    catch(Exception ex) 
    {
       MessageBox.Show(ex.Message);
    }
    finally 
    {
        read.Close();
        sqlCon.Close();
    }                   
}

修改

表: - Deepz(ID int PK,Goodname varchar(50))

DECLARE @ID int 
DECLARE @Goodname varchar(50) 

    MERGE Deepz t
    USING (SELECT @ID[ID], @Goodname[Goodname]) s 
        ON (t.ID = s.ID)
    WHEN MATCHED THEN
        UPDATE
        SET t.Goodname = @Goodname
    WHEN NOT MATCHED THEN
        INSERT (ID, Goodname)
        VALUES (@ID, @Goodname);

错误:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 't'.
Msg 137, Level 15, State 2, Line 2
Must declare the scalar variable "@ID".

3 个答案:

答案 0 :(得分:3)

您应该将保存功能更改为:

  • 如果您使用的是SQL Server 2008或更高版本,请使用SQL Merge语句插入或更新,具体取决于是否存在记录
    DECLARE @nameField    VarChar(50) = 'some data'

    MERGE dbo.MyTable t
    USING (SELECT @nameField [field]) s
        ON t.myData = s.field
    WHEN MATCHED THEN
        UPDATE
        SET t.myData = @nameField
    WHEN NOT MATCHED THEN
        INSERT (myData)
        VALUES (@nameField);
  • 如果您使用的是SQL Server 2005或更早版本,则需要使用如下所示的内容,但您可能会遇到竞争条件(但imho仍然会比您的原始设计更好,因为它可能会出现竞争条件那么根据你的环境,你可能需要玩锁等等。
    IF EXISTS (SELECT * FROM Deepz WHERE [ID] = @ID)
    BEGIN
        UPDATE Deepz
        SET Goodname = @Goodname
        WHERE [ID] = @ID
    END
    ELSE
    BEGIN
        INSERT Deepz (ID, Goodname)
        VALUES (@ID, @Goodname);
    END
  • 使用sql params而不是通过连接构建语句,将使您免于SQL injection次攻击
    UPDATE Employee SET EmpID = @id, EmpName = @name

然后

    SqlCommand comm = new SqlCommand(...);
    // note below is a bit simplified, in reality you should do int.TryParse
    comm.Parameters.Add(@id, SqlDbType.Int).Value = int.Parse(txtID.Text);

答案 1 :(得分:0)

这是在黑暗中的一点点,但试试这个:

private void btnSave_Click(object sender, EventArgs e)
{
   try 
   {
      using (sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
      {
         sqlCon.Open();
         SqlCommand com = new SqlCommand("SELECT * FROM Employee", sqlCon);
         com.Parameters.AddWithValue(@empID, SqlDbType.Int).Value = int.Parse(txtID.Text);  // Add this line
         com.Parameters.AddWithValue(@empName, SqlDbType.NVarChar).Value = txtEmpName.Text; // Add this line too
         SqlDataReader read = new SqlDataReader();  // You also need to 'new' up your SqlDataReader.
         read = com.ExecuteReader(); 

         while (read.Read())
         {                     
            if (read.HasRows) 
            {
            SqlCommand update = new SqlCommand("UPDATE Employee SET EmpID = @empID, EmpName = @empName", sqlCon);
            update.ExecuteNonQuery();
            MessageBox.Show("Employee details updated!", "Employee", MessageBoxButtons.OK, MessageBoxIcon.Information);
             }

             else
             {
                SqlCommand comm = new SqlCommand("INSERT INTO Employee(EmpID, EmpName) VALUES (@empID, @empName)", sqlCon);
                comm.ExecuteNonQuery();
                MessageBox.Show("Employee details saved!", "Employee", MessageBoxButtons.OK, MessageBoxIcon.Information);
             }
         }
    }

    catch(Exception ex) 
    {
        MessageBox.Show(ex.Message);
    }

    finally 
    {
        read.Close();
        sqlCon.Close();
    }
}

答案 2 :(得分:0)

从示例中我看“If”条件和“While”条件看起来是倒置的。

http://msdn.microsoft.com/en-us/library/haa3afyz%28v=vs.80%29.aspx

先检查是否有行,然后迭代它们