2016-10-03 58 views
0

我决定编写一个连接到SQL服务器的联系程序。 差不多我已经完成了代码和程序运行良好。 但我有一个问题。 当用户想从这个程序中删除一个联系人时,他应该输入他想删除的联系人的姓氏,然后按下表格中的删除按钮。 这种方式并不是很好,因为有可能有5个家庭成员具有相同的姓氏。 我决定在代码名称中添加SQL服务器中的一个字段。 此代码对于每个联系人都是唯一的。 但我有一个问题。我应该如何编写程序,只要用户输入联系人信息并单击保存,这个唯一代码就会自动添加到SQL服务器中的代码字段中? 这里是我的代码,你可以看到:设置代码到SQL服务器并显示在DataGridView中

namespace Contact 
{ 
    class Operation 
    { 
     SqlConnection cn; 
     public Operation() 
     { 
      cn = new SqlConnection(Connection.Server); 
     } 

     public DataTable Show() 
     { 
      SqlCommand cmd = new SqlCommand("select * from tblContact ", cn); 
      SqlDataAdapter da = new SqlDataAdapter(cmd.CommandText, cn); 
      DataTable dt = new DataTable(); 
      da.Fill(dt); 

      cn.Open(); 
      cmd.ExecuteNonQuery(); 
      cn.Close(); 

      return dt; 
     } 

     public void Add(string Name , string FamilyName , string Work , string Fax , string Phone , string Home) 
     { 
      SqlCommand cmd = new SqlCommand("insert into tblContact(Name,FamilyName,Work,Fax,Phone,Home) values ('" + Name + "' , '" + FamilyName + "' , '" + Work + "' , '" + Fax + "' , '" + Phone + "' , '" + Home + "')", cn); 

      cn.Open(); 
      cmd.ExecuteNonQuery(); 
      cn.Close(); 
     } 
     public void Delete(string FamilyName) 
     { 
      SqlCommand cmd = new SqlCommand("delete from tblContact where FamilyName = '" + FamilyName + "'", cn); 

      cn.Open(); 
      cmd.ExecuteNonQuery(); 
      cn.Close(); 
     } 

     public void Update (string Name , string FamilyName , string Work , string Fax , string Phone , string Home) 
     { 
      SqlCommand cmd = new SqlCommand("update tblContact set FamilyName = '" + FamilyName + "' ,Work = '" + Work + "' , Fax = '" + Fax + "' , Name = '" + Name + "' , Home = '" + Home + "' where Phone = '" + Phone + "'",cn); 

      cn.Open(); 
      cmd.ExecuteNonQuery(); 
      cn.Close(); 
     } 
    } 
} 
+1

搜索有关[IDENTITY列(https://msdn.microsoft.com/en-us/library/ms186775.aspx? F = 255&MSPPError = -2147217396)。之后,看看如何编写参数化查询。如果您允许用户从DataGridView中进行选择,然后将您需要的所有列隐藏在DataGridView的Identity密钥字段中,并且当用户选择了一行时,则您的代码是每个黑客的免费通行 – Steve

+0

一个'foreach(dataGridView.SelectedRows中的DataGridViewRow行)''那么你可以捕获KeyId的例子,并从表中删除KeyId =从'row.Cells [0] .Value'中选择的KeyId的表格 – MethodMan

+0

你需要阅读,理解并立即开始使用参数化查询。这是广泛开放的SQL注入。你真的应该避免使用select *,除非它在EXISTS中 –

回答

0

对于具有在表中的唯一列,最好的办法是创建int型或bigint一列(〔实施例命名ID)和Identity属性设置为真正。在这种情况下,您有一个值从1开始的列,并为每个新行自动递增。您也可以将此列设置为主键,因为它是唯一的且不为空。

然后,为了删除目的,您只能使用此列。

DELETE FROM tblContact WHERE ID = (Your Parameter) 

只需设置参数。

您应该首先找到基于familyname或其他列的删除行,然后从该行获取ID值并调用该行的delete。

为此,更好的方法是向用户显示联系人列表(例如在网格中并隐藏ID列),然后用户选择要删除的行。当时你从该行有ID并传递给这个函数:

public void Delete(int ID) 
{ 
    SqlCommand cmd = new SqlCommand("delete from tblContact where ID = " + ID + "'", cn); 

    cn.Open(); 
    cmd.ExecuteNonQuery(); 
    cn.Close(); 
}