尝试从表单中的 C# 代码将值插入 MySQL 数据库,但得到“列不能为 NULL
Attempting to INSERT values into a MySQL DB from C# code within a form, but getting "Column cannot be NULL
所有 - 预先感谢您的时间。因此,背景信息 - 我正在尝试使用 C# 创建联系人注册表单,以将信息传递到我的 MySql 数据库中。如果我直接在代码中使用查询,它就可以工作。但是,我读到您应该使用存储过程来保证安全。所以,工作代码是:
using (MySqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = @"INSERT INTO Contacts (contactID,last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell) VALUES (@ciD,@ln, @fn, @add, @city, @state, @zip, @email, @news, @cell)";
//cmd.CommandText = "insert_contact";
//cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("@cID", MySqlDbType.VarChar);
cmd.Parameters.Add("@ln", MySqlDbType.VarChar);
cmd.Parameters.Add("@fn", MySqlDbType.VarChar);
cmd.Parameters.Add("@add", MySqlDbType.VarChar);
cmd.Parameters.Add("@city", MySqlDbType.VarChar);
cmd.Parameters.Add("@state", MySqlDbType.VarChar);
cmd.Parameters.Add("@zip", MySqlDbType.VarChar);
cmd.Parameters.Add("@email", MySqlDbType.VarChar);
cmd.Parameters.Add("@news", MySqlDbType.Bit);
cmd.Parameters.Add("@cell", MySqlDbType.Bit);
cmd.Parameters["@cID"].Value = default;
cmd.Parameters["@ln"].Value = lastName_TextBox.Text;
cmd.Parameters["@fn"].Value = firstName_TextBox.Text;
cmd.Parameters["@add"].Value = address_TextBox.Text;
cmd.Parameters["@city"].Value = city_TextBox.Text;
cmd.Parameters["@state"].Value = state_DropDown.Text;
cmd.Parameters["@zip"].Value = zipCode_TextBox.Text;
cmd.Parameters["@email"].Value = email_TextBox.Text;
cmd.Parameters["@news"].Value = newsletter_CheckBox.Checked;
cmd.Parameters["@cell"].Value = cell_CheckBox.Checked;
cmd.ExecuteNonQuery();
conn.Close();
但是,当我将以下行更改为此时,出现“不能为 NULL 错误”:
conn.Open();
//cmd.CommandText = @"INSERT INTO Contacts (contactID,last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell) VALUES (@ciD,@ln, @fn, @add, @city, @state, @zip, @email, @news, @cell)";
cmd.CommandText = "insert_contact";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
我在数据库上的存储过程是(我怀疑这可能是错误所在):
BEGIN
INSERT INTO Contacts (contactID,last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell)
VALUES (@ciD,@ln, @fn, @add, @city, @state, @zip, @email, @news, @cell);
END
我尝试了以下操作,但出现了错误:
• 将存储过程中的“@”更改为“?” -(在 SQL 语法中出现错误)
• 更改所有列以接受 NULL 值。 -(然后所有列都有一个 NULL 值)。
抱歉,如果这很简单 - 刚开始学习。
提前致谢!
- Pherix
您的 insert_contact
存储过程必须提供如下参数(带有类型):
CREATE PROCEDURE insert_contact
(
IN cID VARCHAR,
IN ln VARCHAR(30),
IN fn VARCHAR(45),
IN `add` VARCHAR(30),
IN city VARCHAR(30),
IN state VARCHAR(10),
IN zip VARCHAR(20),
IN email VARCHAR(45),
IN news bit,
IN cell bit,
)
BEGIN
INSERT INTO Contacts
(contactID,last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell)
VALUES
(@cID, @ln, @fn, @add, @city, @state, @zip, @email, @news, @cell);
END
如果有参数与MySQL保留字冲突,需要escape the reserved words加单引号。
注:
您的 contactID
列是 int(11)
类型,但您提供的 cID
参数是 VARCHAR
类型。您需要注意列类型不匹配并可能导致异常。
参考
好的,终于找到存储过程喜欢的东西了:
BEGIN
INSERT INTO Contacts
(last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell)
VALUES
(ln, fn, address, city, state, zip, email, news, cell);
END
显然,它不喜欢传递值前面的“@”。
所有 - 预先感谢您的时间。因此,背景信息 - 我正在尝试使用 C# 创建联系人注册表单,以将信息传递到我的 MySql 数据库中。如果我直接在代码中使用查询,它就可以工作。但是,我读到您应该使用存储过程来保证安全。所以,工作代码是:
using (MySqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = @"INSERT INTO Contacts (contactID,last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell) VALUES (@ciD,@ln, @fn, @add, @city, @state, @zip, @email, @news, @cell)";
//cmd.CommandText = "insert_contact";
//cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("@cID", MySqlDbType.VarChar);
cmd.Parameters.Add("@ln", MySqlDbType.VarChar);
cmd.Parameters.Add("@fn", MySqlDbType.VarChar);
cmd.Parameters.Add("@add", MySqlDbType.VarChar);
cmd.Parameters.Add("@city", MySqlDbType.VarChar);
cmd.Parameters.Add("@state", MySqlDbType.VarChar);
cmd.Parameters.Add("@zip", MySqlDbType.VarChar);
cmd.Parameters.Add("@email", MySqlDbType.VarChar);
cmd.Parameters.Add("@news", MySqlDbType.Bit);
cmd.Parameters.Add("@cell", MySqlDbType.Bit);
cmd.Parameters["@cID"].Value = default;
cmd.Parameters["@ln"].Value = lastName_TextBox.Text;
cmd.Parameters["@fn"].Value = firstName_TextBox.Text;
cmd.Parameters["@add"].Value = address_TextBox.Text;
cmd.Parameters["@city"].Value = city_TextBox.Text;
cmd.Parameters["@state"].Value = state_DropDown.Text;
cmd.Parameters["@zip"].Value = zipCode_TextBox.Text;
cmd.Parameters["@email"].Value = email_TextBox.Text;
cmd.Parameters["@news"].Value = newsletter_CheckBox.Checked;
cmd.Parameters["@cell"].Value = cell_CheckBox.Checked;
cmd.ExecuteNonQuery();
conn.Close();
但是,当我将以下行更改为此时,出现“不能为 NULL 错误”:
conn.Open();
//cmd.CommandText = @"INSERT INTO Contacts (contactID,last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell) VALUES (@ciD,@ln, @fn, @add, @city, @state, @zip, @email, @news, @cell)";
cmd.CommandText = "insert_contact";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
我在数据库上的存储过程是(我怀疑这可能是错误所在):
BEGIN
INSERT INTO Contacts (contactID,last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell)
VALUES (@ciD,@ln, @fn, @add, @city, @state, @zip, @email, @news, @cell);
END
我尝试了以下操作,但出现了错误:
• 将存储过程中的“@”更改为“?” -(在 SQL 语法中出现错误)
• 更改所有列以接受 NULL 值。 -(然后所有列都有一个 NULL 值)。
抱歉,如果这很简单 - 刚开始学习。
提前致谢!
- Pherix
您的 insert_contact
存储过程必须提供如下参数(带有类型):
CREATE PROCEDURE insert_contact
(
IN cID VARCHAR,
IN ln VARCHAR(30),
IN fn VARCHAR(45),
IN `add` VARCHAR(30),
IN city VARCHAR(30),
IN state VARCHAR(10),
IN zip VARCHAR(20),
IN email VARCHAR(45),
IN news bit,
IN cell bit,
)
BEGIN
INSERT INTO Contacts
(contactID,last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell)
VALUES
(@cID, @ln, @fn, @add, @city, @state, @zip, @email, @news, @cell);
END
如果有参数与MySQL保留字冲突,需要escape the reserved words加单引号。
注:
您的 contactID
列是 int(11)
类型,但您提供的 cID
参数是 VARCHAR
类型。您需要注意列类型不匹配并可能导致异常。
参考
好的,终于找到存储过程喜欢的东西了:
BEGIN
INSERT INTO Contacts
(last_name,first_name,address,city,state,zip_code,email_address,newsletter,is_Cell)
VALUES
(ln, fn, address, city, state, zip, email, news, cell);
END
显然,它不喜欢传递值前面的“@”。