我是C#&我试图以编程方式创建&打开SQL Server数据库。
我有一个我正在创建的ASP.NET webapp&在页面加载时,它应该从数据库中提取一些数据(如果数据库不存在,则应该创建并使用默认数据填充)。
PS:C#的System.Data.SqlClient
是否使用MySQL或SQLite或其他东西?
现在我不确定我的代码是否正确创建了SQL Server数据库&如果我正确连接它。
你能告诉我我的代码是否正确吗?我怎么能改进它?
更新:错误
“发生与网络相关或特定于实例的错误 建立与SQL Server的连接。找不到服务器或 无法访问。验证实例名称是否正确 SQL Server配置为允许远程连接。 (提供者:命名 管道提供程序,错误:40 - 无法打开与SQL的连接 服务器) “}”
我已在下面的代码中指出了错误发生的位置。
创建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;
}
答案 0 :(得分:3)
你可能已经弄明白了,但万一人们最终遇到同样的问题(就像我一样),这就是我如何运作的。
您的错误是没有打开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;
}
答案 1 :(得分: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();
}
}
答案 2 :(得分:0)
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帐户来处理操作(更容易跟踪,您只需要赋予它对您希望它访问的权限;安全性等等)。