2012-02-17 6 views
3

C#を初めて使用しました&私はプログラムでSQL Serverデータベースを開く&を作成しようとしています。SQL Serverデータベースを作成して接続するコード:何が問題なのですか?

私は、&を作成中のASP.NET webappを持っています。データベースからデータを取り出す必要があります(dbが存在しない場合は、&にデフォルトデータが入力されています)。

PS:C#のSystem.Data.SqlClientは、MySQLまたはSQLiteなどを使用していますか?

正しく接続すると、自分のコードが正しくSQL Serverデータベース&を作成するかどうかはわかりません。

私のコードが正しいかどうか教えてください&どうすれば改善できますか?

UPDATE:エラーは、私がどこに発生するエラー以下のコードで示されている

"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)"}"

です。 SQL Serverデータベースの作成

// When I run this function no file seems to be created in my project directory? 
    // Although there is a ASPNETDB sql database file in my App_Data folder so this maybe it 
    public static string DEF_DB_NAME = "mydb.db"; // is this the correct extension? 
    private bool populateDbDefData() 
    { 
     bool res = false; 
     SqlConnection myConn = new SqlConnection("Server=localhost;Integrated security=SSPI;database=master"); 
     string str = "CREATE DATABASE "+DEF_DB_NAME+" ON PRIMARY " + 
      "(NAME = " + DEF_DB_NAME + "_Data, " + 
      "FILENAME = " + DEF_DB_NAME + ".mdf', " + 
      "SIZE = 2MB, MAXSIZE = 10MB, FILEGROWTH = 10%) " + 
      "LOG ON (NAME = " + DEF_DB_NAME + "_Log, " + 
      "FILENAME = " + DEF_DB_NAME + "Log.ldf', " + 
      "SIZE = 1MB, " + 
      "MAXSIZE = 5MB, " + 
      "FILEGROWTH = 10%)"; 


     SqlCommand myCommand = new SqlCommand(str, myConn); 
     try 
     { 
      myConn.Open(); // ERROR OCCURS HERE 
      myCommand.ExecuteNonQuery(); 
      insertDefData(myConn); 
     } 
     catch (System.Exception ex) 
     { 
      res = false; 
     } 
     finally 
     { 
      if (myConn.State == ConnectionState.Open) 
       myConn.Close(); 
      res = true; 
     } 

     return res; 
    } 

は、ここでSQL Serverデータベースのコードへの私の接続です:私はそれが接続に失敗したかなり確信している - 私は変数でCONNを使用しようとすると、それは接続があると言います開いていません。これは、私はどちらかの接続に失敗したかさえも1位にDBを作成するために失敗したことを意味するかもしれない:

private bool connect() 
    { 
     bool res = false; 
     try 
     { 
      conn = new SqlConnection("user id=username;" + 
            "password=password;" + 
            "Server=localhost;" + 
            "Trusted_Connection=yes;" + 
            "database="+DEF_DB_NAME+"; " + 
            "connection timeout=30"); 
      conn.Open(); 
      return true; 
     } 
     catch (Exception e) 
     { 
     } 

     return false; 
    } 
+1

は、おそらくあなたは、いくつかのエラーメッセージを受け取りましたか? –

+3

あなたは*確実に*ページの読み込みにデータベースを作成すべきではありません。同時に2人の人がページに当たったらどうなるでしょうか? –

+0

@ KirkWollはい、変数connを使用しようとすると、接続が開いていないと表示されます。これは、私が接続に失敗したか、1番目のデータベースを作成することができなかったことを意味する可能性があります。 –

答えて

0

PS:C#のSystem.Data.SqlClientのは、MySQLやSQLiteのか、何か他のものを使用していますか?

MySQLは、データベースに接続するための独自のC#DLLを提供しています。他のデータベースメーカの大多数がそうです。私はそれらを使用することをお勧めします。私は通常、MS SQL用の組み込みSQLクライアントを使用しています(他のDBで使用できるかどうかはわかりません)。

この行の場合:insertDefData(myConn) - >メソッドがコードサンプルに含まれていません。

一般的なSQLデバッグについては、GUIを使用してデバッグしてください。私は、MySQLで育った多くの人が望んでいない、またはなぜあなたがそれを使うべきか理解できないことを知っていますが、それは本当に良い考えです。 MySQLに接続する場合は、MySQL WorkBench CEをお勧めします。 MSデータベースに接続する場合は、SQL Management Studioが必要です。他の人には、GUIが利用できるはずです。ここでの考え方は、クエリのセクションを選択的に強調表示して実行できることです。コマンドラインからは利用できないものがあります。いくつかのクエリを実行し、実行したいクエリのみを強調表示することができます。さらに、RDBMSの探索はGUIを使用する方が簡単です。

そして、あなたは、SQLインジェクション攻撃を防ぐためにしたい場合は、単にBase64ではで起こって文字列データを符号化する。

接続文字列そのものについては、私たちは、正確に、データベースの種類にあなたをいくつかのより多くのデータが必要になりますに接続しようとしています。個人的には、操作を処理するために別のSQLアカウントを作成することを推奨します(追跡が簡単で、アクセスする権限、セキュリティなどすべてにアクセス許可を与える必要があります)。

3

あなたはすでにこれを理解しているかもしれませんが、人々が(私のように)同じ問題を抱えてここに来る場合、私はこれをどうやって稼働させるのでしょうか。

エラーは、適切なサーバーが見つからないため、SqlConnectionが開かれていないことです。あなたは、このようなSqlConnectionオブジェクトを設定する必要があります(私はのように)SQLサーバExpress Editionを使用している場合:

SqlConnection myConn = new SqlConnection("Server=localhost\\SQLEXPRESS;Integrated security=SSPI;database=master;"); 

をあなたががそのエラーを解決したら、あなたはあなたがしようとすると、次の行に失敗しようとしていますクエリを実行します。 "Filename"は単一引用符で区切る必要がありますが、拡張子の後ろに1つしか付いていません。あなたも前に1つ必要です。

また、これは完全な物理ファイルパスであり、現在のディレクトリコンテキストを使用しないため、パスを指定する必要があります。場所は、DBサーバは、それが実行しているときにアクセスする必要があります1であることを確認し、そうでなければ、の線に沿ってエラーメッセージが表示されてスローされるSQLExceptionが得られます:

Directory lookup for the file "...\filename.mdf" failed with the operating system error 5 (Access is denied). CREATE DATABASE failed. Some file names listed could not be created.

私が使用して終了コード次のようになります。

public static string DB_NAME = "mydb"; //you don't need an extension here, this is the db name not a filename 
public static string DB_PATH = "C:\\data\\"; 

public bool CreateDatabase() 
{ 
    bool stat=true; 
    string sqlCreateDBQuery; 
    SqlConnection myConn = new SqlConnection("Server=localhost\\SQLEXPRESS;Integrated security=SSPI;database=master;"); 

    sqlCreateDBQuery = " CREATE DATABASE " 
         + DB_NAME 
         + " ON PRIMARY " 
         + " (NAME = " + DB_NAME + "_Data, " 
         + " FILENAME = '" + DB_PATH + DB_NAME + ".mdf', " 
         + " SIZE = 2MB," 
         + " FILEGROWTH = 10%) " 
         + " LOG ON (NAME =" + DB_NAME + "_Log, " 
         + " FILENAME = '" + DB_PATH + DB_NAME + "Log.ldf', " 
         + " SIZE = 1MB, " 
         + " FILEGROWTH = 10%) "; 

    SqlCommand myCommand = new SqlCommand(sqlCreateDBQuery, myConn); 
    try 
    { 
     myConn.Open(); 
     myCommand.ExecuteNonQuery(); 
    } 
    catch (System.Exception) 
    { 
     stat=false; 
    } 
    finally 
    { 
     if (myConn.State == ConnectionState.Open) 
     { 
      myConn.Close(); 
     } 
     myConn.Dispose(); 
    } 
    return stat; 
} 
1

使用このコードは、

internal class CommonData 
    { 
    private static SqlConnection conn; 

    public static SqlConnection Connection 
    { 
     get { return conn; } 
    } 

    public static void ReadyConnection() 
    { 
     conn = new SqlConnection(); 
     conn.ConnectionString = ConfigurationManager.ConnectionStrings["DBConnectionString"].ToString(); 
     if (conn.State != ConnectionState.Open) 
     { 
      conn.Open(); 
     } 
    } 

    public static int ExecuteNonQuery(SqlCommand command) 
    { 
     try 
     { 
      ReadyConnection(); 
      command.Connection = conn; 
      int result = command.ExecuteNonQuery(); 
      return result; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

     finally 
     { 
      command.Dispose(); 
      if (conn.State == ConnectionState.Open) conn.Close(); 
      conn.Dispose(); 
     } 
    } 

    public static SqlDataReader ExecuteReader(SqlCommand command) 
    { 
     try 
     { 
      ReadyConnection(); 
      command.Connection = conn; 
      SqlDataReader result = command.ExecuteReader(CommandBehavior.CloseConnection); 
      return result; 
     } 
     catch (Exception Ex) 
     { 

      throw Ex; 
     } 
    } 

    public static object ExecuteScalar(SqlCommand command) 
    { 
     try 
     { 
      ReadyConnection(); 
      command.Connection = conn; 

      object value = command.ExecuteScalar(); 
      if (value is DBNull) 
      { 
       return default(decimal); 
      } 
      else 
      { 
       return value; 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    public static void ClearPool() 
    { 
     SqlConnection.ClearAllPools(); 
    } 
} 
関連する問題