2013-07-15 2 views
1

Я использую MVC4 с Visual Basic для создания веб-системы. Но когда мне приходится сохранять свои данные в моих таблицах и отношениях, мне нужно сохранить много таблиц. Итак, я делаю это:Лучший способ выполнить множество команд SQL в Visual Basic?

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.Open и Close).

Нет ли лучшего способа сделать это? Как только открыть только conn 1 раз и выполнить все? На самом деле, если я это сделаю, он отправляет мне сообщение о том, что соединение действительно открыто

+0

Все ли они связаны с FK? Entity Framework может действительно иметь значение, если это так, предполагая, что изменение базовой технологии - это вариант. – 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/Улов/Наконец блокировать и использовать транзакции, так что если один из ваших вставок не удается, все они откатить.

+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, если хотите). Тогда вам вообще не нужно управлять соединениями.

Смежные вопросы