Получение значения varchar в select с помощью MySQL Connector / Arduino - PullRequest
0 голосов
/ 09 июня 2019

Я устанавливаю автоматическую систему взвешивания для контроля качества. Для этого я использую библиотеку MySQL Connector / Arduino .

Все готово, и у меня остались только следующие шаги:

  1. Обратитесь к базе данных, которая является номером партии, которую я собираюсь оценить (номер партии хранится в VARCHAR в таблице данных qcInsecta_get).

  2. Включите полученное выше значение в INSERT со значением веса, которое датчик веса возвращает мне.

Я работал с примерами basic_insert и basic_select , предоставленными автором библиотеки. Вставка значений в таблицу данных у меня не было никаких проблем (я делал это раньше со значениями проб). Однако, когда я делаю SELECT, полученное значение всегда является числовым значением, если поле базы данных числовое, например, INT. Но если поле базы данных является VARCHAR, оно возвращает 0.

Я не эксперт в C-коде, но я видел его в примере:

head_count = atol(row->values[0]);

И atol преобразует строку в ее числовое значение. Я пытался использовать другие формы или конвертеры, чтобы иметь возможность сделать SELECT и получить значение из базы данных, но это было невозможно для меня. Как я могу решить эту проблему?

Код, выполняющий SELECT с использованием платы NODEMCU V3:

#include <ESP8266WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

char ssid[] = ""; // SSID NAME
char pass[] = ""; // SSID PASSWORD

IPAddress server_addr(xxx, xxx, x, xxx);
char user[] = "";
char password[] = "";
char query[] = "SELECT batchnumber FROM registro.qcInsecta_get ORDER BY id DESC LIMIT 1";
WiFiClient client;
MySQL_Connection conn((Client *)&client);

void setup() {
  delay(500);
  Serial.begin(115200);
  WiFi.begin(ssid, pass);
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(100);
    Serial.println(F("Connected"));    
  }
  else {
      Serial.println();
      conn.close();  
      if (conn.connect(server_addr, 3306, user, password)) {
      delay(500);
      } 
      else {
        Serial.println("...");
      }
  }
}

void loop() {
  delay(1000);
  row_values *row = NULL;
  long head_count = 0;

  Serial.println("1) Demonstrating using a cursor dynamically allocated.");
  // Initiate the query class instance
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  // Execute the query
  cur_mem->execute(query);
  // Fetch the columns (required) but we don't use them.
  column_names *columns = cur_mem->get_columns(); 

  // Read the row (we are only expecting the one)
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      head_count = atol(row->values[0]);
    }
  } while (row != NULL);
  // Deleting the cursor also frees up memory used
  delete cur_mem;

  // Show the result
  Serial.print("  Batch number = ");
  Serial.println(head_count);

  delay(500);
} 

О базе данных:

| qcInsecta | CREATE TABLE `qcInsecta` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `batchnumber` varchar(30) NOT NULL,
  `weight` float NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `batchnumber` (`batchnumber`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 |

MariaDB [registro]> SELECT * FROM qcInsecta;
+----+-------------+--------+---------------------+
| id | batchnumber | weight | created_at          |
+----+-------------+--------+---------------------+
|  5 | COL-01-05   |     35 | 2019-06-06 17:04:38 |
| 16 | COL-01-01   |     22 | 2019-06-06 18:57:02 |
| 17 | COL-01-01   |     22 | 2019-06-06 18:57:02 |
| 18 | COL-01-01   |     25 | 2019-06-06 21:52:02 |

1 Ответ

0 голосов
/ 10 июня 2019

С head_count = atol(row->values[0]); вы конвертируете каждый символ вывода в длинное значение, которое является числом. Таким образом, вы должны сделать это только для числовых полей. Для строковых полей вам просто нужен row->values, который представляет собой массив строки C.

На основании этот row->values содержит массив с размером результата SELECT столбцов. Например, если вы выберете один столбец (как ваш текущий запрос на выборку), row->values будет иметь размер 1, а ваши результаты будут в row->values[0].

Если вам нужно разделить каждый столбец, попробуйте выбрать для каждого столбца или вы можете последовать примеру complex_select.ino и перебрать столбцы вместо строк, затем разделить каждый тип столбца и преобразовать их в нужные значения.

#include <ESP8266WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

char ssid[] = ""; // SSID NAME
char pass[] = ""; // SSID PASSWORD

IPAddress server_addr(xxx, xxx, x, xxx);
char user[] = "";
char password[] = "";
char query[] = "SELECT batchnumber FROM registro.qcInsecta_get ORDER BY id DESC LIMIT 1";
WiFiClient client;
MySQL_Connection conn((Client *)&client);

void setup()
{
    delay(500);
    Serial.begin(115200);
    WiFi.begin(ssid, pass);
    if (conn.connect(server_addr, 3306, user, password))
    {
        delay(100);
        Serial.println(F("Connected"));
    }
    else
    {
        Serial.println();
        conn.close();
        if (conn.connect(server_addr, 3306, user, password))
        {
            delay(500);
        }
        else
        {
            Serial.println("...");
        }
    }
}

void loop()
{
    delay(1000);

    long head_count = 0;

    Serial.println("1) Demonstrating using a cursor dynamically allocated.");
    // Initiate the query class instance
    MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
    // Execute the query
    cur_mem->execute(query);
    // Fetch the columns (required) but we don't use them.
    Serial.println("Fetching with Columns");
    column_names *columns = cur_mem->get_columns();

    for (int f = 0; f < columns->num_fields; f++)
    {
        Serial.print(columns->fields[f]->name);
        if (f < columns->num_fields - 1)
        {
            Serial.print(',');
        }
    }
    Serial.println("Done");

    // Read the rows and print them
    Serial.println("Fetching with Rows");
    row_values *row = NULL;
    do
    {
        row = cur_mem->get_next_row();
        if (row != NULL)
        {
            //e.g convert to a float value
            // float batchnumber = 0;
            //   batchnumber = atol(row->values[0]);
            //   Serial.print("float value: ");
            //   Serial.println(batchnumber,2);
            String batchnumber_str = "";
            for (int f = 0; f < columns->num_fields; f++)
            {
                //just print the String value
                // Serial.print(row->values[f]);
                // convert value to String
                batchnumber_str = String(row->values[f]);
                Serial.print("batchnumber_str: ");
                Serial.println(batchnumber_str);
                if (f < columns->num_fields - 1)
                {
                    Serial.print(',');
                }
            }
            Serial.println();
        }
    } while (row != NULL);
    Serial.println("Done");
    // Deleting the cursor also frees up memory used
    delete cur_mem;

    // Show the result
    Serial.print("  Batch number = ");
    Serial.println(head_count);

    delay(500);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...