在 C# 中以编程方式创建本地数据库

本文关键字:创建 数据库 方式 编程 | 更新日期: 2023-09-27 18:35:15

我正在尝试创建一个包装类来创建数据库。

我希望通过使用创建和删除函数在代码中创建和销毁数据库。

我在网上读到使用DROP DATABASE会破坏数据库,但是我无法检查我是否正确解释了信息,因为我无法编写创建函数。

我找到的示例都是针对包含服务器的.mdf数据库。

我的数据库将仅在本地使用,并且将包含单个数据表。

数据库将在创建时由用户选择的数据文件填充。

以下是我开始写的课。

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlServerCe;
using System.Windows.Forms;
using System.IO;
namespace DatabaseForm
{
    class DatabaseManager
    {
        private SqlCeConnection _sqlConnection;
        private string _cacheDatabase;
        private string _password;
        /// <summary>
        /// 
        /// </summary>
        public DatabaseManager()
        {
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        private string ConnectionString()
        {
            return string.Format("DataSource='"{0}'"; Password='{1}'", this._cacheDatabase, this._password);
        }
        /// <summary>
        /// 
        /// </summary>
        private void Open()
        {
            if (_sqlConnection == null)
            {
                _sqlConnection = new SqlCeConnection(this.ConnectionString());
            }
            if (_sqlConnection.State == ConnectionState.Closed)
            {
                _sqlConnection.Open();
            }
        }
        /// <summary>
        /// 
        /// </summary>
        private void Close()
        {
            if (_sqlConnection != null)
            {
                if (_sqlConnection.State == ConnectionState.Open)
                {
                    _sqlConnection.Close();
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public void CreateDatabase(string dbname, string password)
        {
            string strCommand;
            try
            {
                Open();
                strCommand = "CREATE DATABASE " + dbname;
                SqlCeCommand sqlCommand = new SqlCeCommand(strCommand, _sqlConnection);
                sqlCommand.ExecuteNonQuery();
                Close();
                _cacheDatabase = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName + dbname;
                _password = password;
            }
            catch (Exception exc)
            {
                MessageBox.Show("Error in CreateDatabase(): " + exc.Message);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public void Delete()
        {
            string strCommand;
            try
            {
                Open();
                strCommand = "DROP DATABASE MyTable";
                SqlCeCommand sqlCommand = new SqlCeCommand(strCommand, _sqlConnection);
                sqlCommand.ExecuteNonQuery();
                Close();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Error in Delete(): " + exc.Message);
            }
        }
    }
}

我想在我担心课程如何失败之前让它工作。我将在以后添加防御性代码。

因此,问题领域与SqlCeConnection有关。要创建数据库,连接字符串需要什么?

创建数据库后,我可以使用:

_cacheDatabase = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName + "''MyDatabase.sdf";
_password = "";
string.Format("DataSource='"{0}'"; Password='{1}'", _cacheDatabase, _password);

但是,MyDatabase.sdf 在调用 CREATE DATABASE 之前不存在。

因此,什么是连接字符串?

在 C# 中以编程方式创建本地数据库

为什么要打扰"DROP DATABASE"。使用 SQL Server CE 时,数据库是一个文件。删除文件就足够了。

如果您真的想DROP/CREATE这样的数据库,那么正确获取脚本的最简单方法是在SQL管理工作室中创建一个示例数据库,然后右键单击该数据库并选择Tasks > Generate Scrips...

有很多选项可供选择,其中还有一个DROP/CREATE选项。然后,您只需要关心如何执行脚本。