2012-02-17 74 views
3

我是新來的C#&我試圖以編程方式創建&打開一個SQL Server數據庫。創建並連接到SQL Server數據庫的代碼:它有什麼問題?

我有一個ASP.NET web應用程序,我在頁面加載創建&應該從數據庫中獲取一些數據(如果該數據庫不存在,應創建&默認數據填充)。

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數據庫的代碼連接:我敢肯定它連接失敗 - 如果我嘗試使用變量康涅狄格州,它說的連接沒開。這可能意味着,我要麼無法接通或甚至未能建立在第一名的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

想必你已經收到了一些錯誤信息? – 2012-02-17 00:29:35

+3

你絕對不應該在頁面加載時創建數據庫。如果兩個人同時碰到網頁怎麼辦? – 2012-02-17 00:30:34

+0

@KirkWoll是的,如果我嘗試使用變量conn,它說連接沒有打開。這可能意味着我要麼連接失敗,要麼失敗,甚至無法創建數據庫第一名 – 2012-02-17 00:31:39

回答

0

PS:不C#的System.Data.SqlClient的使用MySQL或SQLite的還是其他什麼東西?

與大多數其他數據庫製造商一樣,MySQL提供了自己的C#dll用於連接其數據庫。我建議使用他們的。我通常使用MS SQL的內置SQL客戶端(我不知道它是否可以與其他數據庫一起使用)。

至於這一行:insertDefData(myConn) - >該方法不包含在您的代碼示例中。

對於一般的SQL調試,使用GUI進行調試。我知道很多在MySQL上長大的人不想或不明白爲什麼你應該使用它,但這確實是一個好主意。如果你連接到MySQL,我推薦MySQL WorkBench CE;如果您要連接到MS數據庫,那麼SQL Management Studio就是您想要的。對於其他人,GUI應該可用。這裏的想法是,您可以選擇性地突出顯示查詢的各個部分並運行它,這是通過命令行不可用的。您可以有幾個查詢,並只突出顯示您想要運行的查詢。另外,通過GUI來探索RDBMS更容易。

如果你想防止SQL注入攻擊,只是Base64編碼的字符串數據去。

至於連接字符串本身,我們需要什麼類型的數據庫的一些數據,就是這樣,你正在嘗試連接。就我個人而言,我建議只創建一個單獨的SQL帳戶來處理操作(更容易跟蹤,並且您只需授予它訪問權限的權限;安全等等)。

3

你可能已經知道了這一點,但以防萬一到最後在這裏出現同樣的問題(就像我做的那樣),這裏是我如何得到這個工作。

你的錯誤是SqlConnection沒有被打開,因爲它沒有找到合適的服務器。如果您正在使用的SQL Server Express版本(如我),你應該設置SqlConnection對象是這樣的:

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

一旦你解決這個錯誤,雖然,你會當您嘗試下一行失敗執行查詢。 「文件名」需要用單引號分開,但擴展後只有一個結尾;你以前也需要一個。

此外,這是完整的物理文件路徑,它不會使用當前目錄上下文,您必須指定一個路徑。確保位置是其中一個數據庫服務器可以訪問時,它的運行,否則你將得到一個拋出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(); 
    } 
}