1

我将参加 ac# 比赛,我需要离线使用数据库,它们应该在每台 PC 上工作,所以如果有人复制我的项目并运行我的程序,一切都会正常工作。

我使用 Add - New Item 创建了一个本地数据库并创建了我的数据库。

我的代码

private void Form1_Load(object sender, EventArgs e)
{
    SqlCeConnection con = new SqlCeConnection(Properties.Settings.Default.bazalocalaConnectionString);
    con.Open();
    SqlCeCommand com = new SqlCeCommand("select * from Tabela",con);
    SqlCeDataReader r = com.ExecuteReader();
    while (r.Read())
    {
        MessageBox.Show(r["nume"].ToString());
    }
      com = new SqlCeCommand("create table taby(id int identity(1,1) primary key,nume nvarchar(10),prenume nvarchar(10) )", con);
    com.ExecuteNonQuery();
    con.Close();
}

我遇到的问题是,在我创建表并关闭程序后,我的新表将不会出现在我的服务器资源管理器中。为什么会这样?我做错了吗?

如果我这样工作,它会在每台电脑上工作吗?

当我创建本地数据库时,我的连接字符串是由 Visual Studio 自动生成的,它是

Data Source=|DataDirectory|\bazalocala.sdf
4

4 回答 4

2

替换字符串|DataDirectory|由程序运行的目录替换。
在 Visual Studio 调试会话期间,此目录是 BIN\DEBUG(或 x86 变体)。
因此,您的表被添加到位于 BIN\DEBUG 文件夹中的数据库中,而您的服务器资源管理器窗口具有指向位于项目文件夹中的数据库的连接。

您可以尝试在 BIN\DEBUG 文件夹中添加另一个指向数据库的连接,您将能够看到您的表。

如果你在 VS 之外运行你的程序,那么你就没有这个问题。

使问题进一步复杂化的是Copy to output directory您的 SDF 文件的属性。如果此属性设置为Copy Always,则每次启动调试会话时,您的 SDF 文件都会从项目文件夹复制到 BIN\DEBUG 文件夹,从而有效地覆盖文件和您在上一个调试会话中所做的更改。您应该将此属性更改为Copy if Newer

于 2014-05-12T17:59:42.593 回答
2

当你使用 |DataDirectory| 并在 Visual Studio 中编译程序,Visual Studio 在 Debug 文件夹中创建一个与原始数据库不同的临时数据库。这就是为什么添加的表没有出现在那里,而不是 |DataDirectory| 使用实际地址。

于 2014-05-12T18:01:46.283 回答
1

你可以试试这样

    try
    {
        SqlCeConnection con = new SqlCeConnection(Properties.Settings.Default.bazalocalaConnectionString);
        con.Open();
        //
        // The following code uses an SqlCommand based on the SqlConnection.
        //
        using (SqlCeCommandcommand = new SqlCeCommand("CREATE TABLE taby(id int identity(1,1) primary key,nume nvarchar(10),prenume nvarchar(10) );", con))
            {
                command.ExecuteNonQuery();
            }

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
于 2014-05-12T18:00:22.183 回答
0
SqlCeConnection con = new SqlCeConnection("Data Source=K:/PROJECT LOCATION/Database1.sdf");

con.Open();           
string x = "insert into TABLE(your columns) values (what values you want)";
SqlCeCommand cmd = new SqlCeCommand(x, con);
try
{
    cmd.ExecuteNonQuery();
}
catch
{
    MessageBox.Show(" Something is wrong","ERROR!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
con.Close();

我创建了一个连接并为其提供了数据库的完整位置,而不是来自 bin/debug 的那个。然后我打开连接并写入字符串 x 以将该数据保存在我的数据库中。我创建了一个新命令,我在 try-catch 子句中进行了测试,最后我关闭了连接。

于 2015-05-07T12:47:22.037 回答