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