代码之家  ›  专栏  ›  技术社区  ›  Patrick

C#MySql参数化查询将long变为null

  •  -2
  • Patrick  · 技术社区  · 8 年前

    代码基于 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();
    
            }
        }
    

    消息=列“auction_key”不能为空

    我尝试更改我的“严格”设置。ini和它没有区别。

    请帮忙。

    2 回复  |  直到 8 年前
        1
  •  1
  •   elloco999    8 年前

    那么,将参数添加到命令中,然后实例化一个新命令:

    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);
    

    希望这能有所帮助。

        2
  •  0
  •   Greg    8 年前

    您可以通过简单地执行以下操作来缓解您的问题:

    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 如果成功,将返回零或一。也可以手动指定 SqlDbType 。以避免错误的SQL推断。此外,这将正确地确定您的 MySqlCommand ,以便您可以正确地用于查询。

    根据文档,它确实实现了 IDisposable 利用 using 块这确保您实例化 我的SQL命令 再一次