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]);
与
asExecuteScalar
运行命令并返回第一个结果集第一行第一列的值。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();