2013-07-15 75 views
1

我正在使用MVC4與Visual Basic來建立一個網絡系統。但是當我必須將我的數據保存在我的表格和關係中時,我需要保存在很多表格中。所以,我這樣做:在Visual Basic中執行大量SQL命令的更好方法?

conn.Open() 
Dim guardador_datos2 As New SqlCommand("INSERT INTO Creadores (ID_Creador,Usuario) VALUES (" + ultimo_id_creador.ToString() + ", '" + creada_por + "')", conn) 
guardador_datos2.ExecuteNonQuery() 
conn.Close() 

conn.Open() 
Dim guardador_datos3 As New SqlCommand("INSERT INTO ReunionCreada_X_Usuario (ID_Reunion,ID_Creador) VALUES (" + ultimo_id.ToString() + "," + ultimo_id_creador.ToString() + ")", conn) 
guardador_datos3.ExecuteNonQuery() 
conn.Close() 

conn.Open() 
Dim guardador_datos4 As New SqlCommand("INSERT INTO Reuniones_X_DepartamentoEmpresa (ID_Departamento_X_Empresa,ID_Reunion) VALUES (" + departamento.ToString() + "," + ultimo_id.ToString() + ")", conn) 
guardador_datos4.ExecuteNonQuery() 
conn.Close() 

我打開和關閉SqlConnectionconn了很多次(我只放三比如在這裏,但真的有像9 conn.OpenClose)。

沒有更好的方法來做到這一點嗎?只喜歡打開conn 1次並執行一切? 其實如果我這樣做,它會向我發送一個錯誤,告訴我連接實際上已打開

+0

它們都與FKs有關嗎?如果是這樣的話,實體框架可能真的有所作爲,假設改變你的底層技術是一種選擇 – James

+2

看看如何使用參數化SQL語句而不是字符串連接來組裝你的語句 - 這是一個最佳實踐避免SQL注入攻擊以及格式問題。 – Cortright

回答

2

你並不需要連接多次打開,只是一次打開和一次關閉。我們經常做這樣的事情:

conn.Open() 
Dim guardador_datos2 As New SqlCommand("INSERT INTO Creadores (ID_Creador,Usuario) VALUES (" + ultimo_id_creador.ToString() + ", '" + creada_por + "')", conn) 
guardador_datos2.ExecuteNonQuery() 

Dim guardador_datos3 As New SqlCommand("INSERT INTO ReunionCreada_X_Usuario (ID_Reunion,ID_Creador) VALUES (" + ultimo_id.ToString() + "," + ultimo_id_creador.ToString() + ")", conn) 
guardador_datos3.ExecuteNonQuery() 

Dim guardador_datos4 As New SqlCommand("INSERT INTO Reuniones_X_DepartamentoEmpresa (ID_Departamento_X_Empresa,ID_Reunion) VALUES (" + departamento.ToString() + "," + ultimo_id.ToString() + ")", conn) 
guardador_datos4.ExecuteNonQuery() 
conn.Close() 

您可能還需要將其包裝在一個try/catch/Finally塊和使用的交易,因此,如果您的刀片出現故障,所有的人都回滾。

+0

非常感謝!它適用於ExecuteNonQuery,但對於ExecuteReader它不起作用。但現在我只有3個conn.open並且關閉,而不是9個,jaja!謝謝! – GalloPinto

+0

ExecuteReader應該以相同的方式工作。這裏唯一的問題是,你應該需要用閱讀器結果填充dataTable。 ExecuteReader會出現某種錯誤嗎? – tlbignerd

+0

@GalloPinto:在'SqlDataReader'的情況下,您需要**迭代**讀取器並存儲返回的數據,然後**關閉'SqlDataReader' **,因爲默認情況下您只能擁有一個其中一個開放。 'SqlDataReader' - ***不是***'SqlConnection'是問題 –

2

由於錯誤試圖告訴您,如果連接已打開,則無法打開連接。

您不需要多次撥打Open()

3

我會把它放在try..catch中,打開你的連接,做所有需要的東西,然後關閉連接。將在try..catch的最後部分保證了即使存在引發錯誤的連接被關閉:

conn.Open() 

try 

    Dim guardador_datos2 As New SqlCommand("INSERT INTO Creadores (ID_Creador,Usuario) VALUES (" + ultimo_id_creador.ToString() + ", '" + creada_por + "')", conn) 
    guardador_datos2.ExecuteNonQuery() 

    Dim guardador_datos3 As New SqlCommand("INSERT INTO ReunionCreada_X_Usuario (ID_Reunion,ID_Creador) VALUES (" + ultimo_id.ToString() + "," + ultimo_id_creador.ToString() + ")", conn) 
    guardador_datos3.ExecuteNonQuery() 

    Dim guardador_datos4 As New SqlCommand("INSERT INTO Reuniones_X_DepartamentoEmpresa (ID_Departamento_X_Empresa,ID_Reunion) VALUES (" + departamento.ToString() + "," + ultimo_id.ToString() + ")", conn) 
    guardador_datos4.ExecuteNonQuery() 

catch ex as exception 
    throw(ex) 
finally 
    conn.Close() 
end try 
+1

或者只是使用'使用'。 http://msdn.microsoft.com/en-us/library/htd05whh(v=vs.110).aspx – cadrell0

2

是的,您可以打開連接一次並在關閉之前執行多個命令。如果所有命令都會在相對較短的時間內發生,我只會建議您這樣做,這聽起來就像您正在做的一樣。

你不想做的事情是當你的應用程序啓動時打開一個連接,並保持它打開整個時間。但是,如果您使用MVC,您可能需要考慮使用EntityFramework(或者如果您願意,可以使用其他ORM)。那麼你根本不需要管理連接。