【问题标题】:Create .mdf/.sdf database dynamically动态创建 .mdf/.sdf 数据库
【发布时间】:2016-04-25 17:59:26
【问题描述】:

如何使用“代码”创建新的 .mdf/.sdf 数据库?

我试过这个: http://support.microsoft.com/kb/307283

它所做的只是在 ConnectionString 上失败。由于我在创建文件之前没有连接到已存在的文件,我如何才能仅连接到 SQL Express 服务器来创建 mdf/sdf 数据库?

我希望能够连接到服务器并创建文件,从那里创建表等可能会更容易。

有什么建议吗?

【问题讨论】:

标签: c# sql-server database sql-server-ce dynamically-generated


【解决方案1】:
public static void CreateSqlDatabase(string filename)
{
    string databaseName = System.IO.Path.GetFileNameWithoutExtension(filename);
    using (var connection = new System.Data.SqlClient.SqlConnection(
        "Data Source=.\\sqlexpress;Initial Catalog=tempdb; Integrated Security=true;User Instance=True;"))
    {
        connection.Open();
        using (var command = connection.CreateCommand())
        {
            command.CommandText =
                String.Format("CREATE DATABASE {0} ON PRIMARY (NAME={0}, FILENAME='{1}')", databaseName, filename);
            command.ExecuteNonQuery();

            command.CommandText =
                String.Format("EXEC sp_detach_db '{0}', 'true'", databaseName);
            command.ExecuteNonQuery();
        }
    }
}

Catalog=tempdb改成Catalog=master,效果不错

使用示例:

var filename = System.IO.Path.Combine("D:\\", "testdb.mdf");
if (!System.IO.File.Exists(filename))
{
    CreateSqlDatabase(filename);
}

【讨论】:

  • 这行得通。但后来,我根本无法连接到数据文件。 SQL Connection String 在创建文件时有效,但后来连接到它会给我带来很多不同的错误。如果我使用该方法在 CurrentDirectory 中创建“mdf”文件,我以后如何使用它?
  • 现在,我收到错误消息,指出数据库已经存在,但没有与之关联的文件。数据库、表格等不是包含在“MDF”文件中吗?既然没有,怎么会有没有文件的数据库呢?
  • 这个连接字符串对我有用:“Data Source=(LocalDB)\\v11.0;Initial Catalog=master; Integrated Security=true;”
  • 我收到错误:"System.Data.SqlClient.SqlException: '建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。”你能帮帮我吗?
【解决方案2】:

关于 .sdf 文件 (SQL Server CE),您可以使用 SqlCeEngine 类创建新数据库,如 this MSDN article 中所述。

【讨论】:

    【解决方案3】:

    创建 .sdf 数据库

    using System.Data.SqlServerCe;
    using System.IO;
      string folderPath="D:\\Compact_DB"
      string connectionString;
      string fileName =folderPath+"\\School.sdf";
      string password = "12345";
    
      if (File.Exists(fileName))
      {
        File.Delete(fileName);
      }
    
      connectionString = string.Format("DataSource=\"{0}\"; Password='{1}'",    fileName, password);
      SqlCeEngine obj_ceEngine = new SqlCeEngine(connectionString);
      obj_ceEngine.CreateDatabase();
    

    【讨论】:

      【解决方案4】:

      确保您有一个有效的连接字符串。

      您需要的数据库/目录必须设置为有效的数据库,通常这可以是始终可用的“主”,因为您将使用主来创建数据库。

      【讨论】:

        【解决方案5】:

        如果您需要以编程方式从头开始创建数据库,我通常会进入 SQL Server Management Studio 并在第一步中通过 gui 创建它。但我没有单击右下角的确定按钮,而是单击顶部工具栏中的脚本按钮。这将为我提供一个完整的 sql 脚本,用于创建我想要的数据库。然后我可以更改脚本并动态更改我想要的部分。

        【讨论】:

          【解决方案6】:

          我想问题在 ConnectionString 中。它应该指向 ma​​ster 数据库的有效实例(如您所指的文章中所示)。确保它是正确的,它应该可以工作。

          【讨论】:

            【解决方案7】:

            使用带有InitialCatalog = master 的连接字符串。由于只有 master 具有创建数据库的默认权限。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多