在数据库中保存记录时提交不起作用

在数据库中保存记录时提交不起作用

问题描述:

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

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。我是否必须将模式包含为点符号来访问插入语句中的表?我试过这个。当我这样做,它说无效的对象。不知道我是否需要在其他地方包含数据库名称。

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) 
); 

连接字符串逻辑,同时加载形式app.config

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

连接字符串:

<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> 
+0

不知道为什么它没有提交,但为什么你插入一个ID?您应该使用主键。也许这就是问题表中有一个主键列(Id),你试图插入没有IDENTITY_INSERT开/关的记录 –

+0

@JeremyThompson感谢您的建议。尝试过一些事情,但迄今为止没有成功。如果我删除Id字段并指定其他字段作为插入的一部分,则会得到“Id不能为空”。如果我删除特定的字段前值和后值除Id外的所有字段,我得到“列名或提供的值数量不匹配表定义”。不知道如何在没有指定Id的情况下插入。另外,不知道我的表格定义是否正确。 MS Access数据库中的Id是否会自动插入带有序列的主键? –

+0

如果你想使用这个事务,它应该是'SqlCommand command = new SqlCommand(aSQL,conn,tx)'。见https://msdn.microsoft.com/en-au/library/352y4sff(v=vs.110).aspx – potatopeelings

尝试使用大括号内交易明细

  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) 
        { 
        } 
       } 
      } 
+0

试过。没有工作。 :( –

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

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

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

只需更改属性复制到输出目录复制如果更新,代码运行良好。 (Peraphs现在还为时过早,但记得要将你的查询改为参数化查询,因为你可能会破坏你的代码,只需在txtName文本框中插入一个单引号,比如O'Malley,更不要说Sql Injection hack)