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

时间:2012-02-17 00:25:21

标签: c# asp.net sql-server

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

3 个答案:

答案 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帐户来处理操作(更容易跟踪,您只需要赋予它对您希望它访问的权限;安全性等等)。