web-dev-qa-db-ja.com

C#コンソールアプリケーションの無効な操作の例外

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

8
mnlfischer

それを行う正しい方法は次のようになります:

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認証ログイン認証情報を使用してみます。そのアカウントを使用してデータベースに正常に接続した場合は、上記のコードが機能するはずです。

宜しくお願いします

14
BizApps

コードを読む必要があります

using (SqlConnection con = new SqlConnection(connectionString))
{
    con.Open();

    ...
}
2

私は同じ問題を抱えていました、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秒だったので、これをWebConfigWebServiceで変更する必要がありました。

<system.web>
    <httpRuntime executionTimeout="600" /> <!--10 min-->
...
0
Dani

このコードを追加してみてください。おそらく接続が開いていますが、プログラムを再実行しているときに接続を再度開こうとしたか、サーバーまたは接続文字列に問題があります

con.Close();

詳細については、こちらをご覧ください http://msdn.Microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open.aspx

0
Jacek

あなたはこれを試す前に 接続状態 をチェックすることができます:

SqlConnection con = new SqlConnection(connectionString);
if (con.State==ConnectionState.Closed)
{                      
    con.Open();   
}

// here your code goes for sql operations

con.Close();
0
Arshad

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

} 

お役に立てば幸いです。

0
Freelancer