我是 Visual Studio 的 super 新手。我想在 Visual Studio 中创建一个应用程序表单以将数据插入我的 T-SQL 数据库。
我创建了一个非常简单的 Windows 应用程序表单。它从字段中获取数据并将它们插入到我的数据库中。它简单而且有效。
现在,我想要做的是为应用程序添加功能,以查看数据库中是否已存在值,因此它不会创建重复项。
我要检查的是 first_name、last_name 和 dob。
作为我的 super 新手,我向提交按钮(点击)添加了一个 if 语句,如下所示:
private void btnSubmit_Click(object sender, EventArgs e)
{
using (SqlConnection sqlCon = new SqlConnection(connectionString))
{
sqlCon.Open();
SqlCommand sqlCmd = new SqlCommand("UserInterface", sqlCon);
sqlCmd.CommandType = CommandType.StoredProcedure;
if (txtFirstName == sqlCmd.CommandText("EXISTS first_name FROM employee"))
MessageBox.Show("already exists");
}
using (SqlConnection sqlCon = new SqlConnection(connectionString))
{
sqlCon.Open();
SqlCommand sqlCmd = new SqlCommand("UserInterface", sqlCon);
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.Parameters.AddWithValue("@first_name", txtFirstName.Text.Trim());
sqlCmd.Parameters.AddWithValue("@last_name", txtLastName.Text.Trim());
sqlCmd.Parameters.AddWithValue("@dept_id", txtDepartmentID.Text.Trim());
sqlCmd.Parameters.AddWithValue("@job_title", txtJobTitle.Text.Trim());
sqlCmd.Parameters.AddWithValue("@dob", dateDOB.Text);
sqlCmd.Parameters.AddWithValue("@start_date", dateStartDate.Text);
sqlCmd.Parameters.AddWithValue("@contract_type", txtContractType.Text.Trim());
sqlCmd.Parameters.AddWithValue("@status_code", txtStatusCode.Text.Trim());
sqlCmd.Parameters.AddWithValue("@effect_date", dateEffectDate.Text);
sqlCmd.ExecuteNonQuery();
MessageBox.Show("Insertion Successful");
Clear();
}
}
void Clear()
{
txtFirstName.Text = txtLastName.Text = txtJobTitle.Text = txtDepartmentID.Text = txtContractType.Text = txtStatusCode.Text = "";
dateDOB.Text = dateEffectDate.Text = dateStartDate.Text = "";
}
显然我很新,它不起作用。
我怎样才能继续做这件事?
最佳答案
关于这部分的一些事情:
using (SqlConnection sqlCon = new SqlConnection(connectionString))
{
sqlCon.Open();
SqlCommand sqlCmd = new SqlCommand("UserInterface", sqlCon);
sqlCmd.CommandType = CommandType.StoredProcedure;
if (txtFirstName == sqlCmd.CommandText("EXISTS first_name FROM employee"))
MessageBox.Show("already exists");
}
SqlCommand
对象可以有多种命令类型,其中 2 种是CommandType.StoredProcedure
(用于插入新记录)和CommandType.Text
用于直接提供纯 SQL。对于这种情况,您希望将其设置为纯文本,因此将该行更改为:sqlCmd.CommandType = CommandType.Text;
SqlCommand
的构造函数的第一个参数是命令文本。如果该命令将成为存储过程调用,那么您需要传递 SP 名称(您在插入新行时已经完成),但如果您想要纯 SQL,则可以在此处编写(我将 SQL 修改为实际上以安全的方式搜索名字,防止 SQL 注入(inject)):SqlCommand sqlCmd = new SqlCommand("SELECT first_name FROM employee WHERE first_name = @firstName", sqlCon); DbParameter firstNameParameter = new SqlParameter("@firstName", txtFirstName.Text.Trim()); sqlCmd.Parameters.Add(firstNameParameter);
您需要使用
ExecuteReader()
方法执行命令,这将返回一个读取器对象,您需要使用它来检索它的结果(SQL 可能返回几行)。using (DbDataReader reader = sqlCmd.ExecuteReader()) while (reader.Read()) { MessageBox.Show("already exists"); break; }
这是一个良好的开端,因此您可以继续编码,还有许多需要改进的地方,但如果突然解释一下,可能会太多。
using (SqlConnection sqlCon = new SqlConnection(connectionString))
{
SqlCommand sqlCmd = new SqlCommand("SELECT first_name FROM employee WHERE first_name = @firstName", sqlCon);
DbParameter firstNameParameter = new SqlParameter("@firstName", txtFirstName.Text.Trim());
sqlCmd.Parameters.Add(firstNameParameter);
sqlCmd.CommandType = CommandType.Text;
sqlCon.Open();
using (DbDataReader reader = sqlCmd.ExecuteReader())
while (reader.Read())
{
MessageBox.Show("already exists");
break;
}
}
关于c# - 使用 Visual Studio 创建 T-SQL 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54444501/