1

Visual Basic で MVC4 を使用して Web システムを作成しています。しかし、テーブルやリレーションシップにデータを保存する必要がある場合は、多くのテーブルに保存する必要があります。だから、私はこれを行います:

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

私は何度も開閉してSqlConnection connいます(ここでは例として 3 つしか入れていませんが、実際には 9conn.Openや などがありますClose)。

これを行うより良い方法はありませんか?1回だけ開いconnてすべてを実行したいですか?実際にそうすると、接続が実際に開いていることを示すエラーが表示されます

4

4 に答える 4

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
于 2013-07-15T14:40:41.597 に答える
2

はい、一度接続を開き、複数のコマンドを実行してから閉じることができます。すべてのコマンドが比較的近い時間帯に発生する場合にのみ、これを行うことをお勧めします。

やりたくないことは、アプリの起動時に接続を開き、ずっと開いたままにすることです。

ただし、MVC を使用している場合は、EntityFramework (または、必要に応じて別の ORM) の使用を検討することをお勧めします。その後、接続を管理する必要はまったくありません。

于 2013-07-15T14:42:00.620 に答える
2

エラーが伝えようとしているように、接続が既に開いている場合、接続を開くことはできません。

何度も電話する必要はありませんOpen()

于 2013-07-15T14:38:55.497 に答える
2

接続を複数回開く必要はありません。開くのに 1 回、閉じるのに 1 回だけです。私たちはしばしば次のようなことをします:

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 ブロックでラップしてトランザクションを使用することもできます。これにより、挿入の 1 つが失敗した場合、すべてがロールバックされます。

于 2013-07-15T14:41:34.617 に答える