using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
namespace BissUpdater
{
class Program
{
static void Main(string[] args)
{
string connectionString = "Data Source=H....;
Initial Catalog=LANDesk; Persist Security Info=True;
User ID=Mainstc; Password=xxxxxxxx";
SqlConnection con = new SqlConnection(connectionString);
con.Open();
}
}
}
SQL接続が無効な操作の例外をスローしました。
"無効な操作です。接続は閉じられています。"
これは私の完全なコードです。他のプログラムでは、完全に機能します。
これは2回目ですが、機能しません。 VS2005で作業しています...おそらくプログラムが破損していますか?
スタックトレース:
system.Data.SqlClient.SqlConnection.GetOpenConnection()で
System.Data.SqlClient.SqlConnection.get_ServerVersion()で
それを行う正しい方法は次のようになります:
static void Main(string[] args) {
string connectionString = "Data Source=H....;
Initial Catalog=LANDesk;User ID=Mainstc; Password=xxxxxxxx";
// removed Persist Security Info=True;
using(SqlConnection con = new SqlConnection(connectionString))
{
if (con.State==ConnectionState.Closed)
{
con.Open();
}
}
}
Using Statement
を使用すると、SQL接続が自動的に破棄されます。
これも確認してください: MSDNでADO.NETを使用するためのベストプラクティス
その他のこと:SQL Management Studioを使用して、接続文字列からSQL認証ログイン認証情報を使用してみます。そのアカウントを使用してデータベースに正常に接続した場合は、上記のコードが機能するはずです。
宜しくお願いします
コードを読む必要があります
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
...
}
私は同じ問題を抱えていました、VBの私の解決策は:
Dim db As New Database
' ... Some Work with EF without procedures (90 seconds)
db.SaveChanges()
For Each p In list
If db.Database.Connection.State <> ConnectionState.Open Then
' This is only executed 1 time
db.Database.Connection.Open()
End If
' ... Some Work with EF but calling a mapped procedure (1 or 2 seconds each call)
db.MyProcedure(p.FieldId)
Next
db.Dispose()
しかし、合計時間は200秒だったので、これをWebConfig
のWebService
で変更する必要がありました。
<system.web>
<httpRuntime executionTimeout="600" /> <!--10 min-->
...
このコードを追加してみてください。おそらく接続が開いていますが、プログラムを再実行しているときに接続を再度開こうとしたか、サーバーまたは接続文字列に問題があります
con.Close();
詳細については、こちらをご覧ください http://msdn.Microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open.aspx
あなたはこれを試す前に 接続状態 をチェックすることができます:
SqlConnection con = new SqlConnection(connectionString);
if (con.State==ConnectionState.Closed)
{
con.Open();
}
// here your code goes for sql operations
con.Close();
using
ステートメントを使用してみてください。大規模なデータベースの場合、データベースを直接手動で開いたり閉じたりすることは悪い考えです。
using(SqlConnection con = new SqlConnection(connectionString))
接続を開いたり閉じたりする場合は、このようにしてください>>
public DB(string conStr):base()
{
con = new OracleConnection(conStr);
con.Open();
}
public void Close()
{
con.Close();
//con.Dispose();
}
お役に立てば幸いです。