2014-10-12 95 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; 
    } 
相关问题