使用不同的命令多次使用sql命令

时间:2011-03-28 23:02:50

标签: c# asp.net sql ado.net

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

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

以下是我的代码示例:

        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();
                }
        }

我试图通过一个连接来保存数据库之旅。

问题是:

  

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

问题是:

  

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

4 个答案:

答案 0 :(得分:3)

您正在更改string Command的值,但实际上您永远不会更改SqlCommand comm中的命令字符串。

答案 1 :(得分:2)

当您使用insert语句重写Command变量时,您只需修改之前定义的名为Command的字符串。您没有修改存储在SqlCommand对象内的命令文本。

尝试:

  

comm.CommandText =“INSERT INTO [Countries](CountryName,IsVisible)VALUES(@ Name,@ IsVisible);”;

答案 2 :(得分:2)

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

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

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

答案 3 :(得分: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

     }
    } 
}

此致