2013-04-18 22 views
3

我想一次插入一些數據到2個表中,但是我遇到的問題是我一次只能插入一個表。如果我註釋掉第一個插入語句,那麼第二個插入將會工作,反之亦然。使用C#插入一些數據到多個表#

這裏是我的代碼

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

正如史蒂夫指出,在您的代碼示例開始時的SELECT語句是潛在的危險。如果Name的值可以通過用戶輸入設置,那麼你有一個SQL注入漏洞。請看看。您可以通過參數化查詢來避免這種危險,而不是使用字符串連接。 – Odrade

回答

4

你設置的是相同的SqlCommand

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

,只有最後一個的CommandText將被執行。 也許你需要執行的第一個,清除參數採集,設定新的文本,然後重新執行,或由道路創造一個單獨的命令

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

,第一選擇是非常危險的。您也應該使用該命令的參數

4

您將要覆蓋原有的SqlCommand,這就是爲什麼只有一個在工作一段時間。一個SqlCommand一次只能運行一個命令。它不接受額外版本的CommandText,因爲您的代碼似乎期望。如果你想在同一時間運行兩個或多個命令,你必須創建一個單一的,分號分隔的CommandText,這樣的事情:

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

注意分號;在這兩個命令之間()。你的參數名稱是獨一無二的,所以你應該在那裏確定。因爲它已經取代了第一個

1

有時,您可以在兩個SQL語句之間使用分號來一次執行兩個SQL語句。看看是否改變這個:

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

這樣:

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

爲你工作。

0

另一個要考慮的是推動邏輯到您的insert查詢和消除競爭狀態,就像這樣:

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 ; 
} 
相關問題