要创建的代码&;连接到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;
    }

要创建的代码&;连接到SQL Server数据库:它有什么问题

您可能已经弄清楚了这一点,但为了防止人们最终遇到同样的问题(就像我一样),我是如何做到这一点的。

您的错误是没有打开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帐户来处理操作(更容易跟踪,您只需要授予它访问您希望它访问的内容的权限;安全性等等)。