在数据库中保存记录时,提交无效

时间:2016-04-24 01:56:51

标签: c# sql-server

我很难将简单记录插入数据库。保存时我没有收到任何错误。此外,如果我在程序运行时尝试检索它,我可以验证它是否已插入。但是一旦我关闭程序并刷新数据库,它就不会出现在数据库中。我知道这是一个提交问题但不确定我到底错过了什么。

private void saveEmpBtn_Click(object sender, EventArgs e)
{
    string aSQL = "INSERT INTO Employee(Id, Name, Type, Email, UTAId, Dept) VALUES (@Id, @Name, @Type, @Email, @UTAId, @Dept) ";

    using (conn = new SqlConnection(connectionString))
    {
        conn.Open();

        using (var tx = conn.BeginTransaction())
        using (SqlCommand command = new SqlCommand(aSQL, conn))
        {
            command.Connection = conn;
            command.Transaction = tx;

            command.Parameters.AddWithValue("@Id",  3);
            command.Parameters.AddWithValue("@Type", empTypCmbBx.SelectedItem.ToString());
            command.Parameters.AddWithValue("@Name", nmTxtBx.Text);
            command.Parameters.AddWithValue("@UTAId", utaIdTxtBx.Text);
            command.Parameters.AddWithValue("@Email", emailTxtBx.Text);
            command.Parameters.AddWithValue("@Dept", deptTxtBx.Text);

            try
            {
                command.ExecuteNonQuery();
                tx.Commit();
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        MessageBox.Show("Employee Saved Successfully");
    }
}

包含该表的数据库脚本的少量图像。架构定义和ID属性也是如此。一些问题:我所遵循的示例有employee.mdf并且只有一个表。在我的情况下,数据库名称为RoomAllocationSystemDatabase,表名为Employee。我是否必须将模式包含为点表示法才能访问insert语句中的表?我试过这个。当我这样做时,它表示无效的对象。不确定我是否需要在其他地方包含数据库名称。

CREATE TABLE [dbo].[Employee] 
(
    [Id]       INT          NOT NULL,
    [Name]     VARCHAR (50) NULL,
    [Type]     VARCHAR (50) NULL,
    [Email]    VARCHAR (50) NOT NULL,
    [UTAId]    VARCHAR (50) NULL,
    [Dept]     VARCHAR (50) NULL,
    [Password] VARCHAR (50) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

加载表单时的连接字符串逻辑

connectionString = ConfigurationManager.ConnectionStrings["RoomAllocationSystem.Properties.Settings.RoomAllocationSystemDatabaseConnectionString"].ConnectionString;

app.config中的连接字符串:

<connectionStrings>
    <add name="RoomAllocationSystem.Properties.Settings.RoomAllocationSystemDatabaseConnectionString"
         connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\RoomAllocationSystemDatabase.mdf;Integrated Security=True"
         providerName="System.Data.SqlClient" />
</connectionStrings>

2 个答案:

答案 0 :(得分:0)

这就是答案。它被发布here。 这是一种常见的情况。您有一个使用替换字符串| DataDirectory |的连接字符串。在桌面应用程序中,此目录通常与程序运行的目录相同。在Visual Studio中,您的程序在BIN \ DEBUG(或x86变体)目录中运行。因此,Visual Studio将MDF文件从项目目录复制到BIN \ DEBUG文件夹。您将记录添加到此副本,而不是添加到项目文件夹中的记录。但是,“服务器资源管理器”窗口具有特定于项目文件夹数据库的连接,当然,该数据库仍为空。

您可以向指向文件夹BIN \ DEBUG的服务器资源管理器添加另一个连接,并检查您的数据库是否已更新。

为了使问题复杂化,存在与MDF文件关联的属性Copy to the Output Directory。如果每次使用Visual Studio启动新的调试会话时此属性都设置为“始终复制”,则会再次将该文件从项目文件夹复制到输出目录(BIN \ DEBUG),并使用新的空副本覆盖已存在的副本。所以第一次运行成功,第二次运行失败。你观察到的症状是这种情况的明显迹象。

只需将属性Copy复制到Output目录,如果更新则复制,代码运行良好。 (Peraphs现在还为时过早,但请记住将查询更改为参数化查询。因此,您可以简单地在txtName文本框中插入单引号,例如O&#39; Malley,更不用说Sql Injection hack了)

答案 1 :(得分:-1)

尝试在花括号内使用事务语句

            using (var tx = conn.BeginTransaction())
            {
                using (SqlCommand command = new SqlCommand(aSQL, conn))
                {
                    command.Connection = conn;
                    command.Transaction = tx;
                    command.Parameters.AddWithValue("@Id", 3);

                    try
                    {
                        command.ExecuteNonQuery();
                        tx.Commit();
                        conn.Close();
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }