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 但是实际上也就是 数据查询和数据处理两种 所以对数 ...
随机推荐
- Redis设计与实现——数据结构与对象
SDS 简单动态字符串 在redis数据库里面,包含字符串值得键值对在底层都是由SDS实现的. redis > set msg "hello world" 1)键值对的键是 ...
- 面试中HashMap链表成环的问题你答出了吗
HashMap作为老生常谈的问题,备受面试官的青睐,甚至成为了面试必问的问题.由于大量的针对HashMap的解析横空出世,面试官对HashMap的要求越来越高,就像面试官对JVM掌握要求越来越高一样, ...
- goalng包和命令工具
1. 包简介 任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性.这种模块化的特性允 ...
- 区块链入门到实战(29)之Solidity – 环境搭建
在线开发环境Remix(推荐) 学习Solidity推荐使用在线开发环境Remix,本教程的例子将使用Remix开发运行. 安装本地编译器 安装 nodejs / npm node官方网站下载node ...
- (数据科学学习手札94)QGIS+Conda+jupyter玩转Python GIS
本文完整代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 QGIS随着近些年的发展,得益于其开源免费 ...
- ASP.NET Core3.1使用IdentityServer4中间件系列随笔(三):创建使用[ClientCredentials客户端凭证]授权模式的客户端
配套源码:https://gitee.com/jardeng/IdentitySolution 上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建 ...
- Android 引入第三方类库
- activiti app 6.0 乱码
登录activiti-admin 乱码,解决后如下: 在catalina.bat文件中设置 -Dfile.encoding=UTF-8 1,windows 修改catalina.bat tomcat7 ...
- ZooKeeper的十二连问,你顶得了嘛?
前言 一线大厂ZooKeeper的十二连问,你顶得了嘛? 本文已经收录到github ❝ https://github.com/whx123/JavaHome ❞ 1. 面试官:工作中使用过Zooke ...
- Labview学习之路(五)按钮的机械动作
布尔类型中有一个按钮是非常重要的控件,他不是只是表示一个确定,输出0或1,下边我们共同探讨一下他的机械动作 单击时转换 释放时转换 保持转换直到释放 单击时触发 释放时触发 保持触发直到释放 单击时转 ...