C#插入后直接更新,但获得额外插入

C#插入后直接更新,但获得额外插入,c#,sql-server,C#,Sql Server,我有以下代码: private void btnAddMatter_Click(object sender, EventArgs e) { MatterCode = ""; EntityID = 0; FeeEarnerID = 0; OpenedByUserID = 0; CompanyContactDetailsID = 0; Description = ""; OurReference = &q

我有以下代码:

private void btnAddMatter_Click(object sender, EventArgs e)
{
    MatterCode = "";
    EntityID = 0;
    FeeEarnerID = 0;
    OpenedByUserID = 0;
    CompanyContactDetailsID = 0;
    Description = "";
    OurReference = "";
    TheirReference = "";
    DateOpened = DateTime.Now;
    MatterTypeID = 0;
    DepartmentID = 0;
    ResponsibleUserID = 0;
    TrustBankAccountID = 0;
    BusinessBankAccountID = 0;

    string connectionString = "Data Source=***\\SQLEXPRESS;Initial Catalog=STUPELG;Persist Security Info=True;User ID=***;Password=***";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand cmd = new SqlCommand("INSERT INTO dbo.Matter ( MatterCode, EntityID, FeeEarnerID, OpenedByUserID, CompanyContactDetailsID, Description," +
                                        " OurReference, TheirReference, DateOpened, MatterTypeID, DepartmentID, ResponsibleUserID, TrustBankAccountID, BusinessBankAccountID)" +
                                        " VALUES ( @MatterCode, @EntityID, @FeeEarnerID, @OpenedByUserID, @CompanyContactDetailsID, @Description," +
                                        " @OurReference, @TheirReference, @DateOpened, @MatterTypeID, @DepartmentID, @ResponsibleUserID, @TrustBankAccountID, @BusinessBankAccountID);" +
                                        " SELECT SCOPE_IDENTITY();");
        cmd.CommandType = CommandType.Text;
        cmd.Connection = connection;
        cmd.Parameters.AddWithValue("@MatterID", MatterID);
        cmd.Parameters.AddWithValue("@MatterCode", MatterCode);
        cmd.Parameters.AddWithValue("@EntityID", EntityID);
        cmd.Parameters.AddWithValue("@FeeEarnerID", FeeEarnerID);
        cmd.Parameters.AddWithValue("@OpenedByUserID", OpenedByUserID);
        cmd.Parameters.AddWithValue("@CompanyContactDetailsID", CompanyContactDetailsID);
        cmd.Parameters.AddWithValue("@Description", Description);
        cmd.Parameters.AddWithValue("@OurReference", OurReference);
        cmd.Parameters.AddWithValue("@TheirReference", TheirReference);
        cmd.Parameters.AddWithValue("@MatterTypeID", MatterTypeID);
        cmd.Parameters.AddWithValue("@DepartmentID", DepartmentID);
        cmd.Parameters.AddWithValue("@ResponsibleUserID", ResponsibleUserID);
        cmd.Parameters.AddWithValue("@TrustBankAccountID", TrustBankAccountID);
        cmd.Parameters.AddWithValue("@BusinessBankAccountID", BusinessBankAccountID);
        cmd.Parameters.AddWithValue("@DateOpened", DateOpened);
        connection.Open();
        cmd.ExecuteNonQuery();

        SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        DataSet NewMatterID = new DataSet();
        adapter.Fill(NewMatterID);
        MatterCode = Convert.ToString(NewMatterID.Tables[0].Rows[0][0]);
    }
   
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand cmd = new SqlCommand("UPDATE Matter SET MatterCode = @MatterCode WHERE MatterID = " + MatterCode);


        cmd.CommandType = CommandType.Text;
        cmd.Connection = connection;
    
        cmd.Parameters.AddWithValue("@MatterCode", MatterCode);
  
        connection.Open();
        cmd.ExecuteNonQuery();
    }

    MessageBox.Show("Matter " + MatterCode + " successfully created");
}
插入行后,应将新MatterID(自动生成的主键)复制到MatterCode字段。当前它可以工作,但单击按钮时会生成一个额外的行:


如何修复此问题?

好吧-这是因为您的代码执行了两次
插入查询

connection.Open();
cmd.ExecuteNonQuery();  // first execution

SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet NewMatterID = new DataSet();
adapter.Fill(NewMatterID);  // second execution
我不完全确定您想用该
SqlDataAdapter
做什么-但它使用了与以前相同的
SqlCommand
,使用第二次执行的
INSERT
语句

    cmd.ExecuteNonQuery();

    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    DataSet NewMatterID = new DataSet();
    adapter.Fill(NewMatterID);
    MatterCode = Convert.ToString(NewMatterID.Tables[0].Rows[0][0]);


as
ExecuteScalar
运行命令并返回第一个结果集第一行第一列的值。

cmd.ExecuteNonQuery()和adapter.Fill(NewMatterID)将执行插入查询twiceJust,正如您所知:,和。进一步的要点:1。不需要适配器,因为您只返回一个值,请改用
(int)(decimal)cmd.ExecuteScalar()
。2.如果要在第二个查询中连接该值,请使用参数而不是3。无论如何,您不需要运行两个查询,您可以在一批
INSERT
中完成整个过程,然后执行
UPDATE。。。其中matteriId=SCOPE\u IDENTITY()
。不要忘记,如果需要重用,只能调用
SCOPE\u idenity
一次,然后保存在变量中
    MatterCode = cmd.ExecuteScalar().ToString();