我收到一条错误,指出连接属性尚未初始化(请参阅https://imgur.com/CTHIabz)。这很令人困惑,因为它与其他方法中的代码完全相同。这是代码:
public bool AddBirthday(string full_name, string month, int day, int year)
{
if (!string.IsNullOrWhiteSpace(full_name) && month.ToString() != "" && day.ToString() != "" && year.ToString() != "")
{
// all required fields were filled out
// determine which month
values = birthdayMonths.Where(v => v.Value == month).ToList();
using (OleDbConnection dbConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\qbcdb.mdb"))
{
dbConn.Open();
using (cmd = new OleDbCommand("INSERT INTO birthdays (full_name, birthday_month, birthday_day, birthday_year) VALUES (@full_name, @birthday_month, @birthday_day, @birthday_year)"))
{
foreach (KeyValuePair<int, string> key in values)
{
if (key.Value != "")
{
try
{
cmd.Parameters.AddWithValue("@full_name", full_name);
cmd.Parameters.AddWithValue("@birthday_month", key.Value);
cmd.Parameters.AddWithValue("@birthday_day", day);
cmd.Parameters.AddWithValue("@birthday_year", year);
if (cmd.ExecuteNonQuery() > 0)
{
return true;
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
else
{
MessageBox.Show("No values were given.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
dbConn.Close();
}
}
return false;
}
我已经查看了代码并检查以确保数据库位于正确的位置以及我能想到的其他所有内容。我很困惑为什么这个工作会在另一个使用相同代码的方法(几乎)涉及到数据库查询并将其绑定到dvg时。
任何帮助都将不胜感激。
谢谢!
哦顺便说一句,它会从列表框中插入选定的值,如下所示:
insertBirthday.Click += (senders, argss) =>
{
if (btd.AddBirthday(name.Text, birthdays.SelectedItem.ToString(), Convert.ToInt32(dayListBox.SelectedItem.ToString()),
Convert.ToInt32(yearListBox.SelectedItem.ToString())))
{
MessageBox.Show("Birthday Added Successfully", "Success", MessageBoxButtons.OK);
}
};
答案 0 :(得分:1)
将此构造函数用于OleDbCommand
:OleDbCommand Constructor (String, OleDbConnection)
答案 1 :(得分:0)
您尚未将连接分配给OleDbCommand。有两种方法可以解决这个问题:
cmd.Connection = dbConn;
或在构造函数中:
using (cmd = new OleDbCommand(sql, dbConn)) { ... }
最好不要在打算使用它之前打开你的连接,即在cmd.ExecuteNonQuery()
之前。由于您使用的是using
块,因此您也无需关闭连接,这将为您解决,但它可能不会伤害任何内容。
我建议将数据库代码与UI代码和验证逻辑(显示MessageBox和检查值)分离到一个单独的“存储库”类中。执行操作所需的所有数据也应作为参数传递给数据库代码,这样您就不会在其他地方没有设置这些值时出现任何令人困惑的问题。在调用方法之前计算要插入的值,然后将它们作为参数传递。