我一直有问题让我的插件工作。我一直在考虑根据两个组合框的选择指数(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;
}
}
}
}
答案 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这一事实,并应谨慎使用(或者根本不要使用)。它对您的参数做了很多假设。例如,日期在此处作为字符串传递。如果列期望日期,您只能希望数据库引擎可以将字符串转换回日期。