2011-03-28 94 views
1

我一直在尝试使用相同的SqlConnectionSqlCommand对象来执行不同的命令。使用sql命令不止一次使用不同的命令

第一个检查重复,第二个插入数据,如果用户输入的数据不重复。

这里是我的代码示例:

 using (SqlConnection conn = new SqlConnection(ConnStr)) 
     { 
      string Command = "SELECT CountryName FROM [Countries] WHERE CountryName = @Name"; 

      using (SqlCommand comm = new SqlCommand(Command, conn)) 
      { 
       comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20); 
       comm.Parameters["@Name"].Value = Name; 

       comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit); 
       comm.Parameters["@IsVisible"].Value = IsVisible; 

       conn.Open(); 

       if (comm.ExecuteScalar() == null) 
       { 
         Command = "INSERT INTO [Countries] (CountryName, IsVisible) VALUES (@Name, @IsVisible);"; 
         comm.ExecuteNonQuery(); 
       } 
     } 

我试图用一个连接保存访问数据库。

的问题是:

第一个命令运行不错,但其插入到 数据库 第二个命令将无法正常工作(不加任何 记录到数据库)和当我 试图显示受影响的行它 给了我-1!

的问题是:

这是检查 重复记录约束 国内独一无二的理想方式?以及为什么第二个 命令没有执行?

+2

因为[连接池](http://msdn.microsoft.com/zh-cn/library/8xx3tyca.aspx),您不明确*需要*使用相同的数据库连接来保存到数据库的行程,几乎肯定会被使用(除非你明确禁用了它)。如果您执行两次(使用相同的连接或不),将有两个调用数据库。 – steinar 2011-03-28 23:07:12

+0

感谢您的提示+1 ..但在您看来,您是否认为有一种方法可以在我的情况下节省旅行以减少Db的负担? – lKashef 2011-03-28 23:11:44

+0

绝对是如果你使用存储过程。这是一个选择吗? – steinar 2011-03-28 23:15:22

回答

2

当你重写与INSERT语句中Command变量,你只需修改一个名为Command你已经先前定义的字符串。您不修改存储在SqlCommand对象内的命令文本。

尝试:

comm.CommandText = “INSERT INTO [国家](国家或地区名称,ISVISIBLE)VALUES(@Name,@IsVisible);”;

+0

这很简单..谢谢你=) – lKashef 2011-03-28 23:23:37

3

您正在更改string Command的值,但您实际上从未实际更改SqlCommand comm中的命令字符串。

0

我的事情,我建议你的SELECT语句来单独插入.. 成才,如:

private void Insert() 
    { 
     using (SqlConnection conn = new SqlConnection(ConnStr)) 
     {    
     string Command = "INSERT INTO [Countries] (CountryName, IsVisible) VALUES (@Name, @IsVisible)";  

     using (SqlCommand comm = new SqlCommand(Command, conn)) 
     { 
     comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20); 
     comm.Parameters["@Name"].Value = Name; 
     comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit);     comm.Parameters["@IsVisible"].Value = IsVisible; 
     conn.Open(); 

     comm.ExecuteNonQuery(); 

     conn.Close(); 
     } 

} 

private void SelectInsert() 
{ 
     using (SqlConnection conn = new SqlConnection(ConnStr)) 
    {    
    string Command = "SELECT CountryName FROM [Countries] WHERE CountryName = @Name";    
    using (SqlCommand comm = new SqlCommand(Command, conn)) 
    { 
    comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20); 
    comm.Parameters["@Name"].Value = Name; 

    conn.Open(); 
    if (comm.ExecuteScalar() == null) 
    { 

      Insert(); //your save method 

    } 
    } 
} 

问候

+0

感谢您的时间:) ..但改变CommandText做到了! =) – lKashef 2011-03-28 23:22:04

+0

:)是啊........ – Crimsonland 2011-03-28 23:26:24

2

要回答你的第一个问题:不,这是而不是确保国名的唯一性。在您的数据库中,您应该定义您的Countries表,以便CountryName是主键(或者,您可以将其他一些列声明为PK并在CountryName上定义唯一约束)。

然后,尝试插入重复值将引发异常,您可以正确处理该异常(丢弃现有记录,覆盖它,提示用户输入不同的值等)。

通过您的方法检查唯一性被认为是不好的,因为A)它将属于数据库本身的逻辑放入您的应用程序代码中;和B)它引入了潜在的竞争条件,其中一些其他应用程序或线程会在读取数据库和写入数据之间插入一个值。

+0

+1 ..我希望我也可以把这个标记为答案..但我最初的问题是“为什么我没有得到预期的输出”..但是相反,我认为你处理异常是非常正确的。尽管数字B对我来说有点时尚! =) – lKashef 2011-03-28 23:25:48

+1

@IKashef:B是比较少见的,尽管在许多不同线程同时访问数据库的环境中,它会经常发生,足以让你失去工作。 :)我多年来继承了其他人编写的许多应用程序/数据库,并且在开发人员依靠其应用程序代码确保唯一性的每种情况下,表中都有许多重复项。这是一种保证最终无法工作的方法。 – MusiGenesis 2011-03-28 23:41:34

+0

你刚刚救了我! ..因为我的应用程序允许不止一个人添加东西,并且有时候我们需要所有团队成为数据输入的东西! ..非常感谢,如果你有任何文章要避免这个问题,当数据库被操纵或同时访问时,请张贴.. + 1 – lKashef 2011-03-29 00:07:08