2015-10-15 74 views
1

我有一个问题,即如果我的textbox-ID中的值为4,则表示房间类型,费率,额外费用;如果房间类型存在于数据库中,则更新,如果不存在,则插入数据库。如果存在值,则更新,否则在数据库中插入值

public void existRoomType() 
{ 
    con.Open(); 
    string typetable = "tblRoomType"; 
    string existquery = "SELECT*FROM tblRoomType WHERE RoomType = '" + txtRoomType.Text + "'"; 
    da = new SqlDataAdapter(existquery, con); 
    da.Fill(ds, typetable); 
    int counter = 0; 
    if (counter < ds.Tables[typetable].Rows.Count) 
    { 
     cmd.Connection = con; 
     string edittypequery = "UPDATE tblRoomType SET RoomType = '" + txtRoomType.Text + "', RoomRate = '" + txtRateOfRoom.Text + "', ExtraCharge = '" + txtExtraCharge.Text + "', CancelFee = '" + txtCancelFee.Text + "', MaxOccupant = " + txtMaxOccupants.Text + "" + 
      "WHERE TypeID = '" + txtTypeID.Text + "'"; 
     cmd.CommandText = edittypequery; 
     cmd.ExecuteNonQuery(); 

     MessageBox.Show("Type of Room is added.", "Room Type Management", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    } 
    else 
    { 
     cmd.Connection = con; 
     string addtypequery = "INSERT INTO tblRoomType VALUES ('" + txtTypeID.Text + "','" + txtRoomType.Text + "','" + txtRateOfRoom.Text + "','" + txtExtraCharge.Text + "','" + txtCancelFee.Text + "'," + txtMaxOccupants.Text + ")"; 
     cmd.CommandText = addtypequery; 
     cmd.ExecuteNonQuery(); 

     MessageBox.Show("Type of Room is edited.", "Room Type Management", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    } 
    con.Close(); 
} 

如果我更改条件if声明从counter < ds.Tables[typetable].Rows.Countcounter > ds.Tables[typetable].Rows.Count,我可以增加价值,但我不能在数据库编辑/更新。

+1

我认为您使用的是Microsoft SQL Server - 请确认,因为SQL实现之间的语法不同。 – STW

+4

你需要阅读SQL注入,这是一个教科书的例子。您需要使用参数化查询。不要像select *一样检查行的存在。使用EXISTS。 –

+0

'cmd.Connection = con;'可以在if语句之外移动 –

回答

7

你要找的是“UPSERT”语句。 upsert结合了插入和更新语句,并将执行相关操作。从MS SQL 2003开始就已经可以使用它,但是直到引入了MERGE函数的SQL Server 2008才能完全实现。

这是一个代码示例,取自another answerThis article也被该答案引用,因为它提供了使用MERGE语句的良好介绍。

MERGE 
    member_topic AS target 
USING 
    someOtherTable AS source 
ON 
    target.mt_member = source.mt_member 
    AND source.mt_member = 0 
    AND source.mt_topic = 110 
WHEN MATCHED THEN 
    UPDATE SET mt_notes = 'test' 
WHEN NOT MATCHED THEN 
    INSERT (mt_member, mt_topic, mt_notes) VALUES (0, 110, 'test') 
; 

这种方法的好处是它只需要一个SQL查询,而目前的方法需要两个查询。它也避免了混合语言,这对于可维护性通常是有利的。

您还应该使用Parameterized Queries将变量值传递给SQL。这可以防止SQL注入。

+1

为什么人们不喜欢这个? – CSharpie

+0

答案可以通过显示参数化查询看起来像这个例子来改善......至少对于查询部分。 –

相关问题