2013-04-18 6 views
3

J'essaie d'insérer des données dans 2 tables à la fois mais le problème que j'ai avec mon code est ... Je ne peux insérer qu'une table à la fois. Si je commente la première instruction d'insertion alors la 2ème insertion fonctionnera et vice-versa.Insérer des données dans plusieurs tables en utilisant C#

Voici mon code

SqlCommand cmd = new SqlCommand("select Name from MainTable where Name= '" + Name+ "' ", sqlcon); 
SqlDataReader dr = cmd.ExecuteReader(); 
if (dr.Read()) 
{ 
    lblmsg.Text = "We are already have this Name" + Name; 
} 

else 
{ 
    dr.Close(); 
    sqlcmd.CommandText = "INSERT INTO Table1(Name, Address) VALUES(@Name, @Address)"; 
    sqlcmd.CommandText = "INSERT INTO Table2(Company, Address2) VALUES(@Company, @Address2)"; 

    sqlcmd.Parameters.Clear(); 
    sqlcmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = Name; 
    sqlcmd.Parameters.Add("@Address", SqlDbType.VarChar).Value = Address; 
    sqlcmd.Parameters.Add("@Company", SqlDbType.VarChar).Value = Company 
    sqlcmd.Parameters.Add("@Address2", SqlDbType.VarChar).Value = Address2; 

    sqlcmd.Connection = sqlcon; 
    sqlcmd.ExecuteNonQuery(); 

    DV_NameAdd.ChangeMode(DetailsViewMode.ReadOnly); 
    sqlcon.Close(); 
} 
sqlcon.Close(); 
+0

Comme Steve l'a souligné, l'instruction SELECT au début de votre exemple de code est potentiellement dangereux. Si la valeur de Name peut être définie via une entrée utilisateur, vous avez une vulnérabilité d'injection SQL. S'il te plaît, regarde ça. Vous pouvez éviter ce danger en paramétrant la requête plutôt qu'en utilisant la concaténation de chaîne. – Odrade

Répondre

4

Vous définissez CommandText du même SqlCommand

sqlcmd.CommandText = "INSERT INTO Table1(Name, Address) VALUES(@Name, @Address)"; 
    sqlcmd.CommandText = "INSERT INTO Table2(Company, Address2) VALUES(@Company, @Address2)"; 

Seul le dernier sera exécuté parce qu'il a remplacé le premier. Probablement vous devez exécuter la première, effacer la collection de paramètres, définissez le nouveau texte, puis réexécuter ou créer une commande séparée

sqlcmd.CommandText = "INSERT INTO Table1(Name, Address) VALUES(@Name, @Address)"; 
    sqlcmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = Name; 
    sqlcmd.Parameters.Add("@Address", SqlDbType.VarChar).Value = Address; 
    sqlCmd.ExecuteNonQuery(); 
    sqlCmd.Parameters.Clear(); 
    sqlcmd.CommandText = "INSERT INTO Table2(Company, Address2) VALUES(@Company, @Address2)"; 
    sqlcmd.Parameters.Add("@Company", SqlDbType.VarChar).Value = Company 
    sqlcmd.Parameters.Add("@Address2", SqlDbType.VarChar).Value = Address2; 
    sqlCmd.ExecuteNonQuery(); 

D'ailleurs, le premier SELECT est très dangereux. Vous devez également utiliser les paramètres de cette commande.

4

Vous écrasez votre SqlCommand original et c'est pourquoi seulement on travaille à la fois. Un SqlCommand n'exécute qu'une commande à la fois. Il n'accepte pas les versions supplémentaires de CommandText comme votre code semble l'attendre. Si vous voulez exécuter un deux ou plusieurs commandes en même temps, vous devez créer un seul, CommandText délimité par des virgules, quelque chose comme ceci:

sqlcmd.CommandText = 
"INSERT INTO Table1(Name, Address) VALUES(@Name, @Address);" + 
"INSERT INTO Table2(Company, Address2) VALUES(@Company, @Address2)"; 

Notez le point-virgule (;) entre les deux commandes. Vos noms de paramètres sont uniques, vous devriez donc être OK.

1

Parfois, vous pouvez avoir un point-virgule entre deux instructions SQL pour en exécuter deux à la fois. Voir si le changement ceci:

sqlcmd.CommandText = "INSERT INTO Table1(Name, Address) VALUES(@Name, @Address)"; 
        sqlcmd.CommandText = "INSERT INTO Table2(Company, Address2) VALUES(@Company, @Address2)"; 

à ceci:

sqlcmd.CommandText = "INSERT INTO Table1(Name, Address) VALUES(@Name, @Address);" + 
"INSERT INTO Table2(Company, Address2) VALUES(@Company, @Address2)"; 

travaille pour vous.

0

Une autre chose à considérer est de pousser la logique dans votre insert requête et en éliminant une condition de course, comme ceci:

public bool InsertEntry(string name , string addr1 , string company , string addr2) 
{ 
    const string QUERY = @" 
begin transaction 
declare @success bit 

insert dbo.table_1 
select @name , @addr1 
where not exists (select * 
        from dbo.main_table 
        where name = @name 
       ) 

insert dbo.table_2 
select @company , @addr2 
where @@rowcount = 1 
    and not exists (select * 
        from dbo.main_table 
        where name = @name 
       ) 
set @success = case when @@ROWCOUNT > 0 then 1 else 0 end 

if (@success = 1) 
begin 
    commit transaction 
end 
else 
begin 
    rollback transaction 
end 

select @success 
" ; 
    bool success = false ; 
    using (SqlConnection connection = new SqlConnection("Server=(local);Database=sandbox;Trusted_Connection=True;")) 
    using (SqlCommand command = connection.CreateCommand()) 
    { 
    command.CommandType = CommandType.Text; 
    command.CommandText = QUERY ; 

    command.Parameters.Add("@name" , SqlDbType.VarChar).Value = name ; 
    command.Parameters.Add("@addr1" , SqlDbType.VarChar).Value = addr1 ; 
    command.Parameters.Add("@company" , SqlDbType.VarChar).Value = company ; 
    command.Parameters.Add("@addr2" , SqlDbType.VarChar).Value = addr2 ; 

    object returnedValue = command.ExecuteScalar() ; 
    if (returnedValue is bool) 
    { 
     success = (bool) returnedValue ; 
    } 
    } 
    return success ; 
} 
Questions connexes