在使用mysql c語言庫進(jìn)行數(shù)據(jù)庫操作時(shí),我們通常會(huì)使用mysql_query函數(shù)來執(zhí)行sql語句。而在執(zhí)行成功后,我們可以通過mysql_affected_rows函數(shù)來獲取受影響的行數(shù)。
然而,有時(shí)候我們會(huì)發(fā)現(xiàn),在執(zhí)行一些語句(如插入、刪除、更新等操作)后,mysql_affected_rows函數(shù)返回的值為-1,而不是我們期望的受影響行數(shù)。這是為什么呢?
MYSQL *conn; conn = mysql_init(NULL); // 初始化數(shù)據(jù)庫連接 // 連接數(shù)據(jù)庫 if (mysql_real_connect(conn, host, user, pass, db, port, NULL, 0) == NULL) { printf("Failed to connect to database: %s\n", mysql_error(conn)); mysql_close(conn); return -1; } // 執(zhí)行插入語句 char *sql = "INSERT INTO users (name, age, gender) VALUES ('Mike', 20, 'male')"; if (mysql_query(conn, sql) != 0) { printf("Failed to insert data: %s\n", mysql_error(conn)); mysql_close(conn); return -1; } int rows = mysql_affected_rows(conn); printf("Affected rows: %d\n", rows); // 輸出-1
這個(gè)問題出現(xiàn)的原因是,當(dāng)執(zhí)行一些語句后,受影響行數(shù)可能會(huì)為0,而mysql_affected_rows函數(shù)在這種情況下會(huì)返回-1。如果我們想獲取到具體的受影響行數(shù),可以通過執(zhí)行"SELECT ROW_COUNT()"語句,該語句會(huì)返回上一次操作受影響的行數(shù)。
char *sql = "INSERT INTO users (name, age, gender) VALUES ('Mike', 20, 'male')"; if (mysql_query(conn, sql) != 0) { printf("Failed to insert data: %s\n", mysql_error(conn)); mysql_close(conn); return -1; } if (mysql_query(conn, "SELECT ROW_COUNT()") != 0) { printf("Failed to get affected rows: %s\n", mysql_error(conn)); mysql_close(conn); return -1; } MYSQL_RES *result = mysql_store_result(conn); MYSQL_ROW row = mysql_fetch_row(result); int rows = atoi(row[0]); mysql_free_result(result); printf("Affected rows: %d\n", rows); // 輸出具體的受影響行數(shù)
通過以上方法,我們就可以避免由于受影響行數(shù)為0而導(dǎo)致mysql_affected_rows返回-1的問題。