NX二次开发-NX访问MySQL数据库(增删改查)
版本:NX11+VS2013+MySQL5.6(x64)+SQLyog
1.新建一个NX项目(多字节)
2.设置VC++目录(调用MySQL的头文件,dll和lib库文件)

3.设置番茄助手


然后重启VS
3.源代码(发布:程序运行时需要libmysql.dll,此DLL要随程序一同发布)
//DataBaseTest // Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h> // Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx> // Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx> #include <uf.h>
#include <uf_ui.h> //头文件
#include <stdio.h>
#include <stdlib.h>
//MySQL support on Windows
#include <WinSock2.h>
#include <mysql.h>
#pragma comment(lib,"libmysql") // Std C++ Includes
#include <iostream>
#include <sstream> using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr; //------------------------------------------------------------------------------
// NXOpen c++ test class
//------------------------------------------------------------------------------
class MyClass
{
// class members
public:
static Session *theSession;
static UI *theUI; MyClass();
~MyClass(); void do_it();
void print(const NXString &);
void print(const string &);
void print(const char*); private:
Part *workPart, *displayPart;
NXMessageBox *mb;
ListingWindow *lw;
LogFile *lf;
}; //------------------------------------------------------------------------------
// Initialize static variables
//------------------------------------------------------------------------------
Session *(MyClass::theSession) = NULL;
UI *(MyClass::theUI) = NULL; //------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
MyClass::MyClass()
{ // Initialize the NX Open C++ API environment
MyClass::theSession = NXOpen::Session::GetSession();
MyClass::theUI = UI::GetUI();
mb = theUI->NXMessageBox();
lw = theSession->ListingWindow();
lf = theSession->LogFile(); workPart = theSession->Parts()->Work();
displayPart = theSession->Parts()->Display(); } //------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
} //------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
} //------------------------------------------------------------------------------
// 定义结构体
//------------------------------------------------------------------------------
struct Student
{
int id;
char name[];
char birthday[];
char cellphone[];
}; //------------------------------------------------------------------------------
// 接收界面输入参数,增加一条数据
//------------------------------------------------------------------------------
int do_insert(Student* stu)
{
MYSQL conn;
mysql_init(&conn); // 连接服务器
if (NULL == mysql_real_connect(&conn,
"127.0.0.1", "root", "", "example"
, , NULL, ))
{
printf("Failed to connect to database: %s\n",
mysql_error(&conn));
return -;
} // 构造SQL语句
char sql[];
sprintf(sql,
" INSERT INTO `student` "
" (`id`, `name`, `birthday`, `cellphone`) "
" VALUES "
"('%d', '%s', '%s', '%s')"
, stu->id
, stu->name
, stu->birthday
, stu->cellphone
); // 执行SQL语句
int ret = mysql_query(&conn, sql);
if (ret != )
{
printf("error: %s \n", mysql_error(&conn));
}
else
{
my_ulonglong affected_rows = mysql_affected_rows(&conn); // a 64-bit large number
printf("%d rows affected. \n", (int)affected_rows); // cast to int
} // 关闭连接
mysql_close(&conn); return ;
} //------------------------------------------------------------------------------
// 增加一条数据
//------------------------------------------------------------------------------
int my_insert(MYSQL* conn)
{
//SQL语句的末尾不要加分号
const char* sql =
" INSERT INTO `student` "
" (`id`, `name`, `birthday`, `cellphone`) "
" VALUES "
"('17', 'qian22', '1992-12-2', '18601088987')"
; int ret = mysql_query(conn, sql);//执行SQL语句
char msg[];
if (ret != )
{
sprintf_s(msg, "error: %s\n", conn, sql);
uc1601(msg, );
return -;
}
my_ulonglong affected_rows = mysql_affected_rows(conn);//获得受影响的行数
sprintf_s(msg, "%d rows affected\n", (int)affected_rows);
uc1601(msg, ); return ;
} //------------------------------------------------------------------------------
// 查找数据
//------------------------------------------------------------------------------
int my_select(MYSQL* conn)
{
// SQL语句,末尾不加分号。每次只执行一条SQL语句。
const char* sql = "SELECT * FROM student";
int ret = mysql_query(conn, sql);
char msg[];
UF_UI_open_listing_window();
if (ret != )
{
sprintf_s(msg,"error: %s \n", mysql_error(conn));
uc1601(msg, );
return -;
} MYSQL_RES * result = mysql_store_result(conn);
if (result == NULL)
{
//printf("error(%d): %s \n", mysql_errno(conn), mysql_error(conn));
}
else
{
// how many rows
my_ulonglong num_rows = mysql_num_rows(result);
sprintf_s(msg,"got %d rows: \n", (int)num_rows);
UF_UI_write_listing_window(msg); // number of fields for each row
unsigned int num_fields = mysql_num_fields(result);
sprintf_s(msg,"number of fields: %d \n", (int)num_fields);
UF_UI_write_listing_window(msg); // fetch the rows
MYSQL_ROW row;
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths = mysql_fetch_lengths(result);
for (int i = ; i < num_fields; i++)
{
char* field = row[i]; // can be a NULL value
unsigned int field_length = lengths[i]; // the data length sprintf_s(msg," column[%d], length[%d] , data[%s] \n",
i, field_length, field ? field : "null");
UF_UI_write_listing_window(msg);
}
UF_UI_write_listing_window("\n");
} // release the memory
mysql_free_result(result);
} return ;
} //------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------
void MyClass::do_it()
{ // TODO: add your code here /*
//获取用户输入
Student stu;
printf("ID:");
char buf[128];
gets(buf);
stu.id = atoi(buf);
printf("Name:");
gets(stu.name);
printf("Birthday:");
gets(stu.birthday);
printf("CellPhone:");
gets(stu.cellphone);
*/ if (mysql_library_init(, NULL, NULL))//初始化
{
uc1601("could not initialize MySQL library\n", );
return;
}
//连接服务器
MYSQL conn;
mysql_init(&conn); MYSQL* ret = mysql_real_connect(&conn, "127.0.0.1", "root", "", "example", , NULL, );
if (!ret)
{
char msg[];
sprintf_s(msg, "Failed to connect to database: %s\n", mysql_error(&conn));
uc1601(msg, );
} //增加一条数据
my_insert(&conn); //查找数据
my_select(&conn); //关闭连接
mysql_close(&conn); mysql_library_end();//结束
} //------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
// Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
try
{
// Create NXOpen C++ class instance
MyClass *theMyClass;
theMyClass = new MyClass();
theMyClass->do_it();
delete theMyClass;
}
catch (const NXException& e1)
{
UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
}
catch (const exception& e2)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
}
catch (...)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
}
} //------------------------------------------------------------------------------
// Unload Handler
//------------------------------------------------------------------------------
extern "C" DllExport int ufusr_ask_unload()
{
return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
} Caesar卢尚宇
2020年2月12日

4.补充(出自https://chuanke.baidu.com/v4509752-209102-1284621.html C语言C++学习指南(数据库篇)MySQL与SQLite)


学习资料 https://chuanke.baidu.com/v4509752-209102-1284621.html C语言C++学习指南(数据库篇)MySQL与SQLite
MySQL https://www.mysql.com/
MySQL :: MySQL 5.6 Reference Manual :: 23.7.5 C API Function Overview https://dev.mysql.com/doc/refman/5.6/en/c-api-function-overview.html
补充
数据库不能写入中文,设置数据库字符集,// "gbk" or "utf8"
位置加到mysql_init之后,mysql_real_connect之前。
// "gbk" or "utf8"
if (!mysql_set_character_set(&conn, "gbk"))
{
char msg[];
sprintf_s(msg, "Charset for the connection : %s\n", mysql_character_set_name(&conn));
//uc1601(msg, 1);
}
2020年4月27日
Caesar卢尚宇
NX二次开发-NX访问MySQL数据库(增删改查)的更多相关文章
- NX二次开发-NX访问SqlServer数据库(增删改查)C#版
版本:NX9+VS2012+SqlServer2008r2 以前我写过一个NX访问MySQL数据库(增删改查)的文章https://www.cnblogs.com/nxopen2018/p/12297 ...
- MySQL数据库(增删改查语句)
MySQL数据库(增删改查语句)一.登录数据库:----> mysql -uroot -proot;(对应用户名和密码)二.SQL语句: 数据定义语言DDL 用来定义数据库.表.列,关 ...
- Java连接MySQL数据库增删改查通用方法
版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...
- python操作mysql数据库增删改查的dbutils实例
python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...
- Asp.Net操作MySql数据库增删改查
Asp.Net操作MySql数据库增删改查,话不多说直接步入正题.git源码地址:https://git.oschina.net/gxiaopan/NetMySql.git 1.安装MySQL数据库 ...
- Python实现mysql数据库增删改查
利用python操作mysql数据库用法简单,环境配置容易,本文将实现对库增.删.改.查的简易封装! 1. 环境配置 安装第三方包 ,导入模块 mysql.connector pip inst ...
- python2.7入门---操作mysql数据库增删改查
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: G ...
- 安卓版php服务器的mysql数据库增删改查简单案例
界面: index.php文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- jsp-2 简单的servlet连接mysql数据库 增删改查
连接mysql数据库的操作 有增删改查 用的包有 commons-lang3-3.5 mysql-connector-java-5.1.40-bin 但是实际上也就是 数据查询和数据处理两种 所以对数 ...
随机推荐
- NOSQL基础
一.mongoDB介绍和使用 1.分布式文件储存数据库,使用C++开发的,可以存储任意数据(文件),允许在服务器端执行脚本,使用JSON形式储存数据{key:value} 2.支持的编程语言有:PHP ...
- springboot~通过面向接口编程对控制反转IOC的理解
IOC,把控制反转到业务端,这句话没什么问题,在springboot框架里,对象的管理是通过spring ioc来实现的,而开发人员的开发原则里总是说"面向接口编程",而为什么要面 ...
- html的JavaScript的简单输入验证
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 第一篇scrum冲刺博客--Interesting-Corps
第一篇scrum冲刺博客 一.Alpha阶段各成员任务 鲍鱼铭 任务名称 预计时间 主页页面和探测空间设计及布局实现 6h 主页页面跳转社区功能及社区设计及布局实现 6h 搜索页面跳转.设计及布局实现 ...
- go微服务系列(四) - http api中引入protobuf
1. protobuf相关依赖安装 2. 改造之前的client 2.1 新建proto文件 2.2 运行protoc命令生成go文件 2.3 然后把原来的map修改成具体的类型就可以了 3. 处理j ...
- 推荐一款万能抓包神器:Fiddler Everywhere
搞IT技术的同行,相信没有几个人是不会抓包这项技能的(如果很不幸你中枪了,那希望这篇文章给你一些动力),市面上的抓包工具也有很多,常用的有:Charles.Fiddler.Burpsuite.Wire ...
- REST架构简介
restful简介 在如今web开发纵横的时代,几乎处处可见web页面,每个人都有自己的设计风格,这也导致了web接口五花八门,可能一个增删改查就要对应4个不同的url,这是非常浪费资源,于是Fiel ...
- C++入门记-大纲
缘来 由于某个不可告人的目标以及想趁着还有精力的年龄,开始了C++学习之路.C++ 诞生很多年了,但依然具有强大的生命力. 我们来看下2020年8月TIOBE 8 月编程语言排行榜. 可以看到C以及C ...
- 用Java写编译器(1)- 词法和语法分析
词法和语法分析器构建 ANTLR简介 ANTLR全称ANother Tool for Languate Recognition,是基于LL(*)算法实现的语法分析器生成器和词法分析器生成器,由旧金山大 ...
- 【代码优化】Unity查漏补缺
1.XML: 使用Unity社区中的开源脚本(Js语言)解析XML文件,网址:http://dev.grumpyferret.com/unity/,已打包XMLParser.unitypackage, ...