NX二次开发-NX访问MySQL数据库(增删改查)

版本:NX11+VS2013+MySQL5.6(x64)+SQLyog

1.新建一个NX项目(多字节)

2.设置VC++目录(调用MySQL的头文件,dll和lib库文件)

3.设置番茄助手

 

 然后重启VS

3.源代码(发布:程序运行时需要libmysql.dll,此DLL要随程序一同发布)

  1 //DataBaseTest
  2 
  3 // Mandatory UF Includes
  4 #include <uf.h>
  5 #include <uf_object_types.h>
  6 
  7 // Internal Includes
  8 #include <NXOpen/ListingWindow.hxx>
  9 #include <NXOpen/NXMessageBox.hxx>
 10 #include <NXOpen/UI.hxx>
 11 
 12 // Internal+External Includes
 13 #include <NXOpen/Annotations.hxx>
 14 #include <NXOpen/Assemblies_Component.hxx>
 15 #include <NXOpen/Assemblies_ComponentAssembly.hxx>
 16 #include <NXOpen/Body.hxx>
 17 #include <NXOpen/BodyCollection.hxx>
 18 #include <NXOpen/Face.hxx>
 19 #include <NXOpen/Line.hxx>
 20 #include <NXOpen/NXException.hxx>
 21 #include <NXOpen/NXObject.hxx>
 22 #include <NXOpen/Part.hxx>
 23 #include <NXOpen/PartCollection.hxx>
 24 #include <NXOpen/Session.hxx>
 25 
 26 #include <uf.h>
 27 #include <uf_ui.h>
 28 
 29 //头文件
 30 #include <stdio.h>
 31 #include <stdlib.h>
 32 //MySQL support on Windows
 33 #include <WinSock2.h>
 34 #include <mysql.h>
 35 #pragma comment(lib,"libmysql")
 36 
 37 
 38 
 39 // Std C++ Includes
 40 #include <iostream>
 41 #include <sstream>
 42 
 43 using namespace NXOpen;
 44 using std::string;
 45 using std::exception;
 46 using std::stringstream;
 47 using std::endl;
 48 using std::cout;
 49 using std::cerr;
 50 
 51 
 52 //------------------------------------------------------------------------------
 53 // NXOpen c++ test class 
 54 //------------------------------------------------------------------------------
 55 class MyClass
 56 {
 57     // class members
 58 public:
 59     static Session *theSession;
 60     static UI *theUI;
 61 
 62     MyClass();
 63     ~MyClass();
 64 
 65     void do_it();
 66     void print(const NXString &);
 67     void print(const string &);
 68     void print(const char*);
 69 
 70 private:
 71     Part *workPart, *displayPart;
 72     NXMessageBox *mb;
 73     ListingWindow *lw;
 74     LogFile *lf;
 75 };
 76 
 77 //------------------------------------------------------------------------------
 78 // Initialize static variables
 79 //------------------------------------------------------------------------------
 80 Session *(MyClass::theSession) = NULL;
 81 UI *(MyClass::theUI) = NULL;
 82 
 83 //------------------------------------------------------------------------------
 84 // Constructor 
 85 //------------------------------------------------------------------------------
 86 MyClass::MyClass()
 87 {
 88 
 89     // Initialize the NX Open C++ API environment
 90     MyClass::theSession = NXOpen::Session::GetSession();
 91     MyClass::theUI = UI::GetUI();
 92     mb = theUI->NXMessageBox();
 93     lw = theSession->ListingWindow();
 94     lf = theSession->LogFile();
 95 
 96     workPart = theSession->Parts()->Work();
 97     displayPart = theSession->Parts()->Display();
 98     
 99 }
100 
101 //------------------------------------------------------------------------------
102 // Destructor
103 //------------------------------------------------------------------------------
104 MyClass::~MyClass()
105 {
106 }
107 
108 //------------------------------------------------------------------------------
109 // Print string to listing window or stdout
110 //------------------------------------------------------------------------------
111 void MyClass::print(const NXString &msg)
112 {
113     if(! lw->IsOpen() ) lw->Open();
114     lw->WriteLine(msg);
115 }
116 void MyClass::print(const string &msg)
117 {
118     if(! lw->IsOpen() ) lw->Open();
119     lw->WriteLine(msg);
120 }
121 void MyClass::print(const char * msg)
122 {
123     if(! lw->IsOpen() ) lw->Open();
124     lw->WriteLine(msg);
125 }
126 
127 
128 //------------------------------------------------------------------------------
129 // 定义结构体
130 //------------------------------------------------------------------------------
131 struct Student
132 {
133     int id;
134     char name[32];
135     char birthday[16];
136     char cellphone[12];
137 };
138 
139 
140 //------------------------------------------------------------------------------
141 // 接收界面输入参数,增加一条数据
142 //------------------------------------------------------------------------------
143 int do_insert(Student* stu)
144 {
145     MYSQL conn;
146     mysql_init(&conn);
147 
148     // 连接服务器
149     if (NULL == mysql_real_connect(&conn,
150         "127.0.0.1", "root", "123456", "example"
151         , 0, NULL, 0))
152     {
153         printf("Failed to connect to database:  %s
",
154             mysql_error(&conn));
155         return -1;
156     }
157 
158     // 构造SQL语句
159     char sql[256];
160     sprintf(sql,
161         "   INSERT INTO `student` "
162         "       (`id`, `name`, `birthday`, `cellphone`)    "
163         "        VALUES   "
164         "('%d', '%s', '%s', '%s')"
165         , stu->id
166         , stu->name
167         , stu->birthday
168         , stu->cellphone
169         );
170 
171     // 执行SQL语句
172     int ret = mysql_query(&conn, sql);
173     if (ret != 0)
174     {
175         printf("error: %s 
", mysql_error(&conn));
176     }
177     else
178     {
179         my_ulonglong affected_rows = mysql_affected_rows(&conn); // a 64-bit large number
180         printf("%d rows affected. 
", (int)affected_rows); // cast to int
181     }
182 
183     // 关闭连接
184     mysql_close(&conn);
185 
186     return 0;
187 }
188 
189 
190 //------------------------------------------------------------------------------
191 // 增加一条数据
192 //------------------------------------------------------------------------------
193 int my_insert(MYSQL* conn)
194 {
195     //SQL语句的末尾不要加分号
196     const char* sql =
197         "   INSERT INTO `student` "
198         "       (`id`, `name`, `birthday`, `cellphone`)    "
199         "        VALUES   "
200         "('17', 'qian22', '1992-12-2', '18601088987')"
201         ;
202 
203     int ret = mysql_query(conn, sql);//执行SQL语句
204     char msg[256];
205     if (ret != 0)
206     {    
207         sprintf_s(msg, "error: %s
", conn, sql);
208         uc1601(msg, 1);
209         return -1;
210     }
211     my_ulonglong affected_rows = mysql_affected_rows(conn);//获得受影响的行数
212     sprintf_s(msg, "%d rows affected
", (int)affected_rows);
213     uc1601(msg, 1);
214 
215     return 0;
216 }
217 
218 
219 //------------------------------------------------------------------------------
220 // 查找数据
221 //------------------------------------------------------------------------------
222 int my_select(MYSQL* conn)
223 {
224     // SQL语句,末尾不加分号。每次只执行一条SQL语句。
225     const char* sql = "SELECT * FROM student";
226     int ret = mysql_query(conn, sql);
227     char msg[256];
228     UF_UI_open_listing_window();
229     if (ret != 0)
230     {
231         sprintf_s(msg,"error: %s 
", mysql_error(conn));
232         uc1601(msg, 1);
233         return -1;
234     }
235 
236     MYSQL_RES * result = mysql_store_result(conn);
237     if (result == NULL)
238     {
239         //printf("error(%d): %s 
", mysql_errno(conn), mysql_error(conn));
240     }
241     else
242     {
243         // how many rows
244         my_ulonglong num_rows = mysql_num_rows(result);
245         sprintf_s(msg,"got %d rows: 
", (int)num_rows);
246         UF_UI_write_listing_window(msg);
247 
248         // number of fields for each row
249         unsigned int num_fields = mysql_num_fields(result);
250         sprintf_s(msg,"number of fields: %d 
", (int)num_fields);
251         UF_UI_write_listing_window(msg);
252 
253         // fetch the rows
254         MYSQL_ROW row;
255         while ((row = mysql_fetch_row(result)))
256         {
257             unsigned long *lengths = mysql_fetch_lengths(result);
258             for (int i = 0; i < num_fields; i++)
259             {
260                 char* field = row[i]; // can be a NULL value
261                 unsigned int field_length = lengths[i]; // the data length
262 
263                 sprintf_s(msg,"     column[%d], length[%d] , data[%s] 
",
264                     i, field_length, field ? field : "null");
265                 UF_UI_write_listing_window(msg);
266             }
267             UF_UI_write_listing_window("
");
268         }
269 
270         // release the memory
271         mysql_free_result(result);
272     }
273 
274     return 0;
275 }
276 
277 //------------------------------------------------------------------------------
278 // Do something
279 //------------------------------------------------------------------------------
280 void MyClass::do_it()
281 {
282 
283     // TODO: add your code here
284 
285 /*
286     //获取用户输入
287     Student stu;
288     printf("ID:");
289     char buf[128];
290     gets(buf);
291     stu.id = atoi(buf);
292     printf("Name:");
293     gets(stu.name);
294     printf("Birthday:");
295     gets(stu.birthday);
296     printf("CellPhone:");
297     gets(stu.cellphone);
298 */
299 
300     if (mysql_library_init(0, NULL, NULL))//初始化
301     {
302         uc1601("could not initialize MySQL library
", 1);
303         return;
304     }
305     //连接服务器
306     MYSQL conn;
307     mysql_init(&conn);
308 
309     MYSQL* ret = mysql_real_connect(&conn, "127.0.0.1", "root", "123456", "example", 0, NULL, 0);
310     if (!ret)
311     {
312         char msg[256];
313         sprintf_s(msg, "Failed to connect to database: %s
", mysql_error(&conn));
314         uc1601(msg, 1);
315     }
316 
317     //增加一条数据
318     my_insert(&conn);
319 
320     //查找数据
321     my_select(&conn);
322 
323     //关闭连接
324     mysql_close(&conn);
325 
326     mysql_library_end();//结束
327 }
328 
329 //------------------------------------------------------------------------------
330 // Entry point(s) for unmanaged internal NXOpen C/C++ programs
331 //------------------------------------------------------------------------------
332 //  Explicit Execution
333 extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
334 {
335     try
336     {
337         // Create NXOpen C++ class instance
338         MyClass *theMyClass;
339         theMyClass = new MyClass();
340         theMyClass->do_it();
341         delete theMyClass;
342     }
343     catch (const NXException& e1)
344     {
345         UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
346     }
347     catch (const exception& e2)
348     {
349         UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
350     }
351     catch (...)
352     {
353         UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
354     }
355 }
356 
357 
358 //------------------------------------------------------------------------------
359 // Unload Handler
360 //------------------------------------------------------------------------------
361 extern "C" DllExport int ufusr_ask_unload()
362 {
363     return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
364 }
365 
366 
367 Caesar卢尚宇
368 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[256];
            sprintf_s(msg, "Charset for the connection : %s
", mysql_character_set_name(&conn));
            //uc1601(msg, 1);
        }

2020年4月27日

Caesar卢尚宇

原文地址:https://www.cnblogs.com/nxopen2018/p/12297590.html