2014-10-12 94 views
0

我試圖在C#中編程創建一個可以創建自己的數據庫。我在視覺工作室中使用Windows窗體應用程序作爲基礎。在Visual Studio中創建SQL數據庫時出錯

使用此代碼時的問題是它始終返回false。你看到這個代碼可能導致問題的任何錯誤?

public static String DB_NAME = "database name"; 
public static string DB_PATH = "database path"; //this path does not have " " in the string. 
public bool CreateDatabase() 
    { 
     bool stat = true; 
     string sqlCreateDBQuery; 
     SqlConnection myConn = new SqlConnection("Server=localhost\\(localdb)\\v11.0;Integrated security=SSPI;database=master;"); 

     sqlCreateDBQuery = " CREATE DATABASE " 
          + DB_NAME 
          + " ON PRIMARY " 
          + " (NAME = " + DB_NAME + "_Data, " 
          + " FILENAME = '" + DB_PATH + DB_NAME + ".mdf', " 
          + " LOG ON (NAME =" + DB_NAME + "_Log, " 
          + " FILENAME = '" + DB_PATH + DB_NAME + "Log.ldf', "; 

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

編輯:閱讀評論我已經改變了代碼有點不吞嚥異常。

獲得異常的結果是:

System.Data.SqlClient.SqlException (0x80131904): Error related with the network or specific from the instance while the server established a connection with the SQL Server. The server was not found or not is not accesible. Check that the name of the instance is correct and the SQL server is configured to admit remote conections. (provider: SQL Network Interfaces, error: 26 - Error searching for server o specified instance) 
    in System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    in System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    in System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) 
    in System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) 
    in System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) 
    in System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) 
    in System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) 
    in System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) 
    in System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) 
    in System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 
    in System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 
    in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
    in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
    in System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) 
    in System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
    in System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
    in System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) 
    in System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) 
    in System.Data.SqlClient.SqlConnection.Open() 
    in Contabilidad.Form1.CreateDatabase() en c:\*****\Form1.cs:línea 46 
ClientConnectionId:00000000-0000-0000-0000-000000000000 
+0

你爲什麼不拿出異常的錯誤信息。它會幫助你輕鬆找出原因。 – Sachin 2014-10-12 11:37:33

+0

我在這段代碼中看到了很多問題。首先你不能吞下例外。 – 2014-10-12 11:37:57

+0

這是非常糟糕的做法 - 當你發現異常並返回'bool'時。異常總是比「布爾」承載更多的信息。 – 2014-10-12 11:39:30

回答

0

感謝鏈接VDohnal已經張貼我找到了解決辦法。

就像在鏈接中說的那樣,首先需要檢查.NET Framework版本(版本可以查看該鏈接的說明http://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx)。

我的代碼的問題之一是文件路徑的定義。 ExecuteQuerycommand()無法正確執行查詢,因爲它無法正確讀取路徑(執行此操作的正確版本是代碼)。

Finnaly讀取用戶3514987的註釋,((localdb)\ v11.0)是我已經安裝的本地數據庫,如果安裝了快速版本,SQL Express(SQLEXPRESS)必須小心,必須更改零件的代碼(特別是myConn)來使這項工作。

// your db name 
    static string dbName = "myDbName"; 

    // path to your db files: 
    // ensure that the directory exists and you have read write permission. 
    string[] files = { Path.Combine(Application.StartupPath, dbName + ".mdf"), 
       Path.Combine(Application.StartupPath, dbName + ".ldf") }; 
public bool CreateDatabase() 
    { 
     bool stat = true; 
     string sqlCreateDBQuery; 
     SqlConnection myConn = new SqlConnection("Server=(localdb)\\v11.0;Integrated Security=true;"); 


     var query = "CREATE DATABASE " + dbName + 
      " ON PRIMARY" + 
      " (NAME = " + dbName + "_data," + 
      " FILENAME = '" + files[0] + "'," + 
      " SIZE = 10MB," + 
      " MAXSIZE = 100MB," + 
      " FILEGROWTH = 10%)" + 

      " LOG ON" + 
      " (NAME = " + dbName + "_log," + 
      " FILENAME = '" + files[1] + "'," + 
      " SIZE = 1MB," + 
      " MAXSIZE = 5MB," + 
      " FILEGROWTH = 10%)" + 
      ";"; 

     SqlCommand myCommand = new SqlCommand(query, myConn); 
     try 
     { 
      myConn.Open(); 
      myCommand.ExecuteNonQuery(); 
     } 
     catch (System.Exception e) 
     { 
      Debug.WriteLine(e.ToString()); 
      stat = false; 
     } 
     finally 
     { 
      if (myConn.State == ConnectionState.Open) 
      { 
       myConn.Close(); 
      } 
      myConn.Dispose(); 
     } 
     return stat; 
    } 
相關問題