c# - 使用 Visual Studio 创建 T-SQL 表单

标签 c# sql-server visual-studio

我是 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/

相关文章:

c++ - 如何在 Visual Studio 2019 中全局禁用 C/C++ 编译器的弃用警告?

c# - Windows Mobile 5 SDK 是否适用于 Windows 7.5 芒果操作系统手机

c# - Gridview:根据同一行中单元格的值更改链接按钮文本

c# - 连接到机器的 USB 设备的路径?

sql-server - SQL Server 2012 数据转换

c++ - 如何关闭程序中用于打印调试数据的功能

c# - 特殊(或外国)字符

sql - Entity Framework 迁移 - 分支管理

c# - 将 TransactionScope TransactionInformation 事务标识符与 sql server 事务 ID 链接起来

windows - 如何解决LNK2019 unresolved external symbol DriverEntry referenced in function GsDriverEntry?