C# MySql 参数化查询使 longs 变为 null
C# MySql Parameterized Query makes longs into null
代码基于https://dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html
public void TableTest(string connectionString)
{
string sqlToCreateTable = @"CREATE TABLE IF NOT EXISTS my_table
(auction_key BIGINT NOT NULL, auction_owner VARCHAR(25), first_seen BIGINT,
PRIMARY KEY(auction_key))";
string sqlInsertOrUpdateAuction = "INSERT INTO my_table (auction_key) VALUES (@my_auc_id); ";
using (MySqlConnection dbConnection = new MySqlConnection(connectionString))
{
dbConnection.Open();
// is the table in the database?
MySqlCommand cmd = new MySqlCommand(sqlToCreateTable, dbConnection);
cmd.ExecuteNonQuery();
cmd.Parameters.AddWithValue("@my_auc_id", 123456);
cmd = new MySqlCommand(sqlInsertOrUpdateAuction, dbConnection);
cmd.ExecuteNonQuery();
}
}
错误是 123456 被视为 null。
消息=列'auction_key'不能为空
我尝试更改 my.ini 中的 "strict" 设置,但没有任何区别。
请帮忙。
嗯,你给命令加上参数,然后实例化一个新的命令:
cmd.Parameters.AddWithValue("@my_auc_id", 123456);
cmd = new MySqlCommand(sqlInsertOrUpdateAuction, dbConnection);
如果您这样做,该命令将不再具有 @my_auc_id 的值。尝试切换这两行:
cmd = new MySqlCommand(sqlInsertOrUpdateAuction, dbConnection);
cmd.Parameters.AddWithValue("@my_auc_id", 123456);
希望对您有所帮助。
您只需执行以下操作即可缓解您的问题:
using(var connection = new MySqlConnection(dbConnection))
{
connection.Open();
using(var command = new MySqlCommand(createTableQuery, connection))
{
command.ExecuteNonQuery();
}
using(var command = new MySqlCommand(insertOrUpdate, connection))
{
command.Parameters.Add("..", SqlDbType = SqlDbType.Int).Value = 123456;
command.ExecuteNonQuery();
}
}
请记住,如果成功,ExecuteNonQuery
将 return 为零或一。您也可能希望手动指定 SqlDbType
。避免 SQL 错误推断。此外,这将正确地限定您的 MySqlCommand
,因此您可以正确地用于查询。
并且根据文档,它确实实现了 IDisposable
以利用 using
块。这确保您再次实例化 MySqlCommand
。
代码基于https://dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html
public void TableTest(string connectionString)
{
string sqlToCreateTable = @"CREATE TABLE IF NOT EXISTS my_table
(auction_key BIGINT NOT NULL, auction_owner VARCHAR(25), first_seen BIGINT,
PRIMARY KEY(auction_key))";
string sqlInsertOrUpdateAuction = "INSERT INTO my_table (auction_key) VALUES (@my_auc_id); ";
using (MySqlConnection dbConnection = new MySqlConnection(connectionString))
{
dbConnection.Open();
// is the table in the database?
MySqlCommand cmd = new MySqlCommand(sqlToCreateTable, dbConnection);
cmd.ExecuteNonQuery();
cmd.Parameters.AddWithValue("@my_auc_id", 123456);
cmd = new MySqlCommand(sqlInsertOrUpdateAuction, dbConnection);
cmd.ExecuteNonQuery();
}
}
错误是 123456 被视为 null。
消息=列'auction_key'不能为空
我尝试更改 my.ini 中的 "strict" 设置,但没有任何区别。
请帮忙。
嗯,你给命令加上参数,然后实例化一个新的命令:
cmd.Parameters.AddWithValue("@my_auc_id", 123456);
cmd = new MySqlCommand(sqlInsertOrUpdateAuction, dbConnection);
如果您这样做,该命令将不再具有 @my_auc_id 的值。尝试切换这两行:
cmd = new MySqlCommand(sqlInsertOrUpdateAuction, dbConnection);
cmd.Parameters.AddWithValue("@my_auc_id", 123456);
希望对您有所帮助。
您只需执行以下操作即可缓解您的问题:
using(var connection = new MySqlConnection(dbConnection))
{
connection.Open();
using(var command = new MySqlCommand(createTableQuery, connection))
{
command.ExecuteNonQuery();
}
using(var command = new MySqlCommand(insertOrUpdate, connection))
{
command.Parameters.Add("..", SqlDbType = SqlDbType.Int).Value = 123456;
command.ExecuteNonQuery();
}
}
请记住,如果成功,ExecuteNonQuery
将 return 为零或一。您也可能希望手动指定 SqlDbType
。避免 SQL 错误推断。此外,这将正确地限定您的 MySqlCommand
,因此您可以正确地用于查询。
并且根据文档,它确实实现了 IDisposable
以利用 using
块。这确保您再次实例化 MySqlCommand
。