要创建的代码&;连接到SQL Server数据库:它有什么问题
本文关键字:数据库 Server 问题 什么 SQL 代码 创建 amp 连接 | 更新日期: 2023-09-27 18:24:50
我是C#&我正在尝试用程序创建&打开SQL Server数据库。
我有一个正在创建的ASP.NET Web应用程序&在页面加载时,它应该从数据库中提取一些数据(如果数据库不存在,则应该创建并填充默认数据)。
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;
}
您可能已经弄清楚了这一点,但为了防止人们最终遇到同样的问题(就像我一样),我是如何做到这一点的。
您的错误是没有打开SqlConnection,因为它找不到合适的服务器。如果您使用的是SQL server express版本(和我一样),您应该像这样设置SqlConnection对象:
SqlConnection myConn = new SqlConnection("Server=localhost''SQLEXPRESS;Integrated security=SSPI;database=master;");
但是,一旦解决了该错误,当您尝试执行查询时,下一行就会失败。"Filename"需要用单引号分隔,但在扩展名后的末尾只有一个;你之前也需要一个。
此外,这是完整的物理文件路径,它不会使用当前的目录上下文,您必须指定一个路径。请确保数据库服务器在运行时可以访问该位置,否则将引发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来连接数据库。我建议使用他们的。我通常使用MS SQL的内置SQL客户端(我不知道它是否可以与其他数据库一起使用)。
至于这一行:insertDefData(myConn)->该方法不包括在您的代码示例中。
对于一般的SQL调试,请使用GUI进行调试。我知道很多在MySQL上长大的人不想,或者不明白为什么要使用MySQL,但这确实是个好主意。如果你正在连接MySQL,我推荐MySQL WorkBench CE;如果要连接到MS数据库,则需要SQL Management Studio。对于其他人来说,GUI应该是可用的。这里的想法是,您可以选择性地突出显示查询的部分并运行它,这是无法通过命令行获得的。您可以有多个查询,并且只突出显示要运行的查询。此外,通过GUI可以更轻松地探索RDBMS。
如果你想防止SQL注入攻击,只需Base64对进入的字符串数据进行编码
至于连接字符串本身,我们将需要更多关于您正试图连接到哪种类型的数据库的数据。就我个人而言,我建议只创建一个单独的SQL帐户来处理操作(更容易跟踪,您只需要授予它访问您希望它访问的内容的权限;安全性等等)。