我正在建立一个自动称重系统以进行质量控制。为此,我正在使用MySQL Connector/Arduino库。
一切就绪,我只剩下以下步骤:
咨询一个数据库,该数据库是我要评估的批次号(该批次号存储在VARCHAR
数据表的qcInsecta_get
中)。
将上面获得的值包含在INSERT
中,并将称重传感器返回给我的重量值。
我已经处理了库作者提供的basic_insert和basic_select的示例。在datable中插入值我没有任何问题(之前我已经用探测值完成过)。但是,当我执行SELECT时,如果数据库字段是数字(例如INT),则检索到的值始终是数字值。但是,如果数据库字段是VARCHAR,则返回0。
我不是C代码方面的专家,但我在示例中看到了它:
head_count = atol(row->values[0]);
然后atol
将字符串转换为其数值。我试图使用其他形式或转换器来进行SELECT并从数据库中获取值,但是对我来说这是不可能的。我该如何解决这个问题?
使用NODEMCU V3板进行SELECT的代码为:
#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 |
答案 0 :(得分:0)
使用head_count = atol(row->values[0]);
,您正在将输出的每个字符转换为数字的长值。因此,您应该仅对NUMERIC字段执行此操作。对于字符串字段,您只需要row->values
,它是C字符串的数组。
基于this 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);
}