尝试插入数据库文件

时间:2016-09-24 08:50:18

标签: c# sql combobox

我一直有问题让我的插件工作。我一直在考虑根据两个组合框的选择指数(1.cboCustomer 2.cboProduct)和一个文本框(RegistrationDate)来完成它。我得到的最大错误与CustomerID为Null有关;我认为应该是自动生成的。当然最让我困惑的是表格规格。 cboCustomer组合框必须显示客户的名称;这不是注册表的一部分。而cboProduct组合框必须显示产品名称;它也与注册表无关。注册表是我需要进行插入的地方,但组合框是使用两种方法加载的,这些方法从Customer和Product表中获取名称,这些方法不能用于插入。其中,如果我尝试只插入registrationDate,我会收到一条错误,指出ProductCode不能为空。如果尽管返回一个布尔值,AddRegistration方法将运行插入,我也有点困惑。感谢您的帮助和时间。

下面的大多数代码都被更改了几次,因为我尝试了几种解决方案但没有成功。

这是我必须获取要传递给AddRegistration方法的值的代码。

public void PutRegistrationData(Registration registration)
    {
        registration.RegistrationDate = registrationDateTextBox.Text;
        registration.ProductCode = productComboBox.SelectedValue.ToString();
    }

这是表单上按钮的代码,用于触发插入 AddRegistration。

    private void btnRegister_Click(object sender, EventArgs e)
    {
        if (this.IsPresent(registrationDateTextBox.Text))
        {
            registration = new Registration();
            this.PutRegistrationData(registration);
            try
            {
                RegistrationDB.AddRegistration(registration);
                MessageBox.Show("The product was entered successfully", "Registration Success");

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, ex.GetType().ToString());
            }
        }
    }

这是我在RegistrationDB类的AddRegistration中插入的代码。

public static bool AddRegistration(Registration registration)
    {
        try
        {
            SqlConnection connection = TechSupportDB.GetConnection();
            string insertStatement = "INSERT INTO Registrations (ProductCode, RegistrationDate" +
                                     "VALUES (@ProductCode,@RegistrationDate)";
            SqlCommand insertCommand = new SqlCommand(insertStatement, connection);
            //insertCommand.Parameters.AddWithValue("@CustomerID", registration.CustomerID);
            insertCommand.Parameters.AddWithValue("@ProductCode", registration.ProductCode);
            insertCommand.Parameters.AddWithValue("@RegistrationDate", registration.RegistrationDate);
            insertCommand.Connection = connection;

            connection.Open();
            insertCommand.ExecuteNonQuery();
            connection.Close();
            return true;
        }
        catch
        {
            return false;
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

根据您的上述评论,您还需要阅读来自客户的CustomerID价值'组合,将其添加到您的Registration实例并更改查询以插入该值

public void PutRegistrationData(Registration registration)
{
    registration.RegistrationDate = registrationDateTextBox.Text;
    registration.ProductCode = productComboBox.SelectedValue.ToString();
    registration.CustomerID = customerComboBox.SelectedValue.ToString();
}


public static bool AddRegistration(Registration registration)
{
     string insertStatement = @"INSERT INTO Registrations 
            (ProductCode, RegistrationDate, CustomerID) 
            VALUES (@ProductCode,@RegistrationDate, @CustomerID)";
    using(SqlConnection connection = TechSupportDB.GetConnection())
    using(SqlCommand insertCommand = new SqlCommand(insertStatement, connection))
    {    
        insertCommand.Parameters.AddWithValue("@CustomerID", registration.CustomerID);
        insertCommand.Parameters.AddWithValue("@ProductCode", registration.ProductCode);
        insertCommand.Parameters.AddWithValue("@RegistrationDate", registration.RegistrationDate);

        connection.Open();
        int added = insertCommand.ExecuteNonQuery();
        return added != 0;
   }
}

请注意,我已将SqlConnection和SqlCommand放在using块中,以确保正确关闭和处理这两个对象实例。当一个类实现IDisposable接口时,最好总是尽快处理该对象,using statement允许这样做。此外,如果已添加记录,则返回布尔值true我仅在插入成功检查ExecuteNonQUery的返回值是否为零时才将AddRegistration的return语句更改为true。

在所有其他情况下,让异常到达您的应用程序的上一级,您可以为您的用户处理它。

我还希望强调AddWithValue is a dangerous method这一事实,并应谨慎使用(或者根本不要使用)。它对您的参数做了很多假设。例如,日期在此处作为字符串传递。如果列期望日期,您只能希望数据库引擎可以将字符串转换回日期。