创建和连接到SQL Server数据库的代码:它有什么问题吗?

我是C#的新手,我正在尝试以编程方式创建和打开SQL Server数据库。

我有一个我正在创建的ASP.NET webapp,在页面加载时它应该从数据库中提取一些数据(如果db不存在,则应该创建并填充默认数据)。

PS:C#的System.Data.SqlClient使用MySQL或SQLite或其他东西?

现在我不确定我的代码是否正确创建了SQL Server数据库以及我是否正确连接到它。

你能告诉我我的代码是否正确以及我如何改进它?

更新:错误是

“建立与SQL Server的连接时发生与网络相关或特定于实例的错误。未找到服务器或无法访问服务器。validation实例名称是否正确以及SQL Server是否配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 – 无法打开与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,它表示连接未打开。 这可能意味着我要么连接失败,要么甚至无法在第一位创建数据库:

  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; } 

你可能已经弄明白了,但万一人们最终会遇到同样的问题(就像我一样),这就是我的工作方式。

您的错误是没有打开SqlConnection,因为它找不到合适的服务器。 如果您正在使用SQL Server Express版本(就像我一样),您应该像这样设置SqlConnection对象:

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

一旦解决了该错误,当您尝试执行查询时,您将在下一行失败。 “文件名”需要用单引号分隔,但扩展后只有一个在末尾; 你以前还需要一个。

此外,这是完整的物理文件路径,它不会使用当前目录上下文,您必须指定路径。 确保该位置是数据库服务器在运行时可以访问的位置,否则您将收到一条SqlException,其中包含以下行的错误消息:

文件“… \ filename.mdf”的目录查找失败,出现操作系统错误5(访问被拒绝)。 CREATE DATABASE失败。 无法创建列出的某些文件名。

我最终使用的代码如下所示:

 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; } 

使用此代码,

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

PS:C#的System.Data.SqlClient是否使用MySQL或SQLite或其他东西?

与大多数其他数据库制造商一样,MySQL提供了自己的C#dll来连接数据库。 我建议使用他们的。 我通常使用内置的SQL客户端进行MS SQL(我不知道它是否可以与其他数据库一起使用)。

至于这一行:insertDefData(myConn) – >该方法未包含在您的代码示例中。

至于SQL调试,一般使用GUI进行调试。 我知道很多在MySQL上长大的人不想或者不明白你为什么要使用它,但这确实是一个好主意。 如果你连接MySQL,我推荐MySQL WorkBench CE; 如果要连接到MS数据库,SQL Management Studio就是您想要的。 对于其他人,GUI应该是可用的。 这里的想法是,您可以有选择地突出显示查询的各个部分并运行它,这是通过命令行无法实现的。 您可以有多个查询,只突出显示要运行的查询。 此外,通过GUI可以更轻松地探索RDBMS。

如果你想防止SQL注入攻击,只需Base64对进入的字符串数据进行编码。

至于连接字符串本身,我们需要更多关于您尝试连接的数据库类型的数据。 就个人而言,我建议只创建一个单独的SQL帐户来处理操作(更容易跟踪,您只需要赋予它对您希望它访问的权限;安全性和所有这些)。