데이터 베이스 MySQL 튜토리얼 MySQL Connector/C++入门教程(上)

MySQL Connector/C++入门教程(上)

Jun 07, 2016 pm 04:31 PM
c++ mysql 시작하기 튜토리얼 주소

原文地址:http://dev.mysql.com/tech-resources/articles/mysql-connector-cpp.html#trx 翻译: DarkBull(www.darkbull.net) 示例代码:MySqlDemo.7z 译者注:该教程是一篇介绍如何使用C++操作MySQL的入门教程,内容简单易用。我对原文中的一些例子进行了修

原文地址: http://dev.mysql.com/tech-resources/articles/mysql-connector-cpp.html#trx

翻译: DarkBull(www.darkbull.net)

示例代码:MySqlDemo.7z

译者注:该教程是一篇介绍如何使用C++操作MySQL的入门教程,内容简单易用。我对原文中的一些例子进行了修改,并新添加了部分例子,主要目标是更简单明了的向读者介绍如何操作MySQL数据库。本人也是MySQL的初学者,错误也在所难免,欢迎拍砖!

    这篇教程将一步一步引导您如何去构建和安装MySql Connection/C++ Driver,同时提供几个简单的例子来演示如何连接MySQL数据库,如何向MySQL添加、获取数据。本教程关注如何在C++应用程序中操作MySQL,所以首先应该确定MySQL数据库服务已经开启并且在当前机器能够访问到。

    本教程面向的读者是MySQL Connector/C++的初学者,如果您对C++语言或者MySQL数据库不是很了解,请参考其他的教程。

    教程使用了下面所列的一些工具和技术,来构建、编译、运行例子程序(译者注:这是原文作者使用的环境。笔者使用的环境是:WinXP,MySQL5.1,VS2008, ):

  • Database MySQL Server 5.1.24-rc
  • C++ Driver MySQL Connector/C++ 1.0.5
  • MySQL Client Library MySQL Connector/C 6.0
  • Compiler Sun Studio 12 C++ compiler
  • Make CMake 2.6.3
  • Operating System OpenSolaris 2008.11 32-bit
  • CPU / ISA Intel Centrino / x86
  • Hardware Toshiba Tecra M2 Laptop

目录

MySQL C++ Driver的实现基于JDBC4.0规范

安装MySQL Connector/C++

运行时依赖

C++ IDE

为示例程序创建数据库与数据表

使用Connector/C++测试数据库连接

使用prepared Statements

使用事务

访问Result Set Metadata

访问Database Metadata

通过PreparedStatment对象访问参数元数据

捕获异常

调试/跟踪 MySQL Connector/C++

更多信息

MySQL C++ Driver的实现基于JDBC4.0规范

    MySQL Connector/C++是由Sun Microsystems开发的MySQL连接器。它提供了基于OO的编程接口与数据库驱动来操作MySQL服务器。

    与许多其他现存的C++接口实现不同,Connector/C++遵循了JDBC规范。也就是说,Connector/C++ Driver的API主要是基于Java语言的JDBC接口。JDBC是java语言与各种数据库连接的标准工业接口。Connector/C++实现了大部分JDBC4.0规范。如果C++程序的开发者很熟悉JDBC编程,将很快的入门。

    MySQL Connector/C++实现了下面这些类:

  • Driver
  • Connection
  • Statement
  • PreparedStatement
  • ResultSet
  • Savepoint
  • DatabaseMetaData
  • ResultSetMetaData
  • ParameterMetaData
    Connector/C++可用于连接MySQL5.1及其以后版本。

    在MySQL Connector/C++发布之前,C++程序员可以使用MySQL C API或者MySQL++访问MySQL。前者是非标准、过程化的C API,后者是对MySQL C API的C++封装。

安装MySQL Connector/C++

    此处略。(译者注:用户可以到MySQL的官网[http://dev.mysql.com/downloads/connector/cpp/1.0.html]去下载MySQL Connector/C++的安装程序,或者只下载dll,或者下载源代码自己编译。笔者在Window平台上使用MySQL,下载了mysql-connector-c++-noinstall-1.0.5-win32这个版本用于调试。)

运行时依赖

    MySQL Connector/C++ Driver依赖MySQL的客户端库,在MySQL安装目录下的lib\opt\libmysql.dll。如果是通过安装程序来安装MySQL Connector/C++,libmysql会一并安装,如果从官网只下载了dll或源码,在使用时,程序必须链接到libmysql.dll。

C++ IDE

    此处略。(译者注:原文作者使用NetBean作为C++的IED。笔者使用VS2008)

为示例程序创建数据库与数据表

    (译者注:此节略掉许多不太重要的内容。)在MySQL中创建test数据库,使用下面语句创建数据表:City:

					Create Table: CREATE TABLE `City` ( `CityName` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=ascii 
로그인 후 복사
然后向City表中添加一些数据。最后表的内容为:

mysql> SELECT * FROM City;  

 +--------------------+ 

 | CityName           | 

 +--------------------+ 

 | Hyderabad, India   | 

 | San Francisco, USA  |

 | Sydney, Australia  |

 +--------------------+

 3 rows in set (0.17 sec) 

使用Connector/C++测试数据库连接

    下面的代码演示如何使用Connector/C++连接到MySQL服务器:

  •     连接到test数据库;
  •     执行一个查询获取City表中的数据,显示在控制台上; 
  •     使用Prepared Statements向City表插入数据;
  •     使用savepoints演示事务;
  •     获取结果集和数据库的元信息;

    例子代码仅仅用于演示,不建议读者在实际开发中使用这种样式的代码。(译者注:例子代码很长,如果看不太明白,没关系,等阅读完全文之后再回过头来看)

				#include <iostream>
#include <map>
#include <string>
#include <memory>
#include "mysql_driver.h"
#include "mysql_connection.h"
#include "cppconn/driver.h"
#include "cppconn/statement.h"
#include "cppconn/prepared_statement.h"
#include "cppconn/metadata.h"
#include "cppconn/exception.h"
#define DBHOST "tcp://127.0.0.1:3306"
#define USER "root"
#define PASSWORD "000000"
#define DATABASE "test"
#define NUMOFFSET 100
#define COLNAME 200
using namespace std;
using namespace sql;
#pragma comment(lib, "mysqlcppconn.lib")
void Demo();
int main(int argc, char *argv[])
{
	Demo();
	return 0;
}
/* 获取数据库信息 */
static void GetDBMetaData(Connection *dbcon) 
{
	if (dbcon->isClosed()) 
	{
		throw runtime_error("DatabaseMetaData FAILURE - database connection closed");
	}
	cout  dbcon_meta (dbcon->getMetaData());
	DatabaseMetaData *dbcon_meta = dbcon->getMetaData();
	cout getDatabaseProductName() getDatabaseProductVersion() getUserName() getDriverName() getDriverVersion() isReadOnly() supportsTransactions() supportsDataManipulationTransactionsOnly() supportsBatchUpdates() supportsOuterJoins() supportsMultipleTransactions() supportsNamedParameters() supportsStatementPooling() supportsStoredProcedures() supportsUnion() getMaxConnections() getMaxColumnsInTable() getMaxColumnsInIndex() getMaxRowSize()  rs ( dbcon_meta->getSchemas());
	cout rowsCount() next()) {
		cout getString("TABLE_SCHEM")  rowsCount() == 0) 
	{
		throw runtime_error("ResultSetMetaData FAILURE - no records in the result set");
	}
	cout  res_meta ( rs -> getMetaData() );
	ResultSetMetaData *res_meta = rs -> getMetaData();
	int numcols = res_meta -> getColumnCount();
	cout  getColumnLabel (i+1);
		cout.width(20); 
		cout  getColumnTypeName (i+1);
		cout.width(20); 
		cout  getColumnDisplaySize (i+1)  getColumnLabel(1);
	cout  getTableName(1);
	cout  getSchemaName(1) rowsCount() next()) 
	{
		if (type == NUMOFFSET) 
		{
			cout  getString(colidx)  getString(colname)  connect(url, user, password);
		/* alternate syntax using auto_ptr to create the db connection */
		//auto_ptr  con (driver -> connect(url, user, password));
		/* turn off the autocommit */
		con -> setAutoCommit(0);
		cout  getAutoCommit()  setSchema(database);
		/* retrieve and display the database metadata */
		GetDBMetaData(con);
		/* create a statement object */
		stmt = con -> createStatement();
		cout  executeQuery ("SELECT * FROM City");
		cout  prepareStatement ("INSERT INTO City (CityName) VALUES (?)");
		cout  setString (1, "London, UK");
		updatecount = prep_stmt -> executeUpdate();
		cout  setSavepoint ("SAVEPT1");
		cout  setString (1, "Paris, France");
		updatecount = prep_stmt -> executeUpdate();
		cout  rollback (savept);
		con -> releaseSavepoint (savept);
		cout  commit();
		cout  executeQuery ("SELECT * FROM City");
		/* retrieve the data from the result set and display on stdout */
		RetrieveDataAndPrint(res, COLNAME, 1, string ("CityName"));
		cout  close();
		delete con;
	} catch (SQLException &e) {
		cout 



<p style="margin-top: 0px; margin-bottom: 0px;">
</p>
<h5>
					<strong>建立数据库连接</strong>
</h5>
    sql::Connection代表到数据库的连接,可以通过sql::Driver来创建。sql::mysql::get_mysql_driver_instance()方法用于获取sql::Driver,通过调用sql::Driver::connect方法来创建sql::Connection对象。(译者注:笔者使用的Connector/C++版本与作者使用的版本不一样,接口方面也有点细微的差别。这里根据笔者使用的最新版本mysql-connector-c++-noinstall-1.0.5-win32来说明。)
<p style="margin-top: 0px; margin-bottom: 0px;">
					    下面是get_mysql_driver_instance与connect这两个方法的签名:</p>
<p style="margin-top: 0px; margin-bottom: 0px;">
</p>
<pre class="brush:php;toolbar:false">					/* mysql_driver.h */
MySQL_Driver *sql::mysql::get_mysql_driver_instance()
/* mysql_driver.h */
sql::Connection * connect(const std::string& hostName, const std::string& userName, const std::string& password);
sql::Connection * connect(std::map<:string sql::connectpropertyval> & options);</:string>
로그인 후 복사

    Driver类重载了connect方法,一个接收数据库地址的url、用户名和密码的字符串,后一个接收一个map,map中以key/value的形式包含数据库地址、用户名与密码。使用TCP/IP连接到MySql服务器的url字符串的格式如下:"tcp://[hostname[:port]][/schemaname]"。例如:tcp://127.0.0.1:5555/some_scehma。hostname和端口号是可选的,如果省略,默认是127.0.0.1与3306。如果hostname为"localhost",会被自动转换为"127.0.0.1"。schemaname也是可选的,如果连接字符串中没有设置schema,需要在程序中通过Connection::setSchema方法手动设置。

    在unix系统上,可以通过UNIX domain socket连接运行在本地的MySQL服务,连接字符串格式为:"unix://path/to/unix_socket_file",例如:unix:///tmp/mysql.sock.

    在windows系统上,可以以命名管道的方式连接到运行在本地的MySQL数据库,连接字符串格式为:"pipe://path/to/the/pipe"。MySQL服务必须启动允许命名管道连接,可以在启动MySQL服务器的时候,通过--enable-named-pipe命令行选项来启动该功能。如果没有通过--socket=name选项设置命名管道的名称,系统默认使用MySQL。在windows上,管道的名称是区别大小写的。
    下面的代码片断尝试连接到本地的MySQL服务器,通过3306端口,用户名为root,密码是000000,schema为test.

					sql::mysql::MySQL_Driver *driver = 0;
sql::Connection *conn = 0;
try 
{
	driver = sql::mysql::get_mysql_driver_instance();
	conn = driver->connect("tcp://localhost:3306/test", "root", "000000");
	cout 
<span style="font-family: 'Courier New'; color: #555555;"><br>
					</span>

<p style="margin-top: 0px; margin-bottom: 0px;">
					也可以通过connection的第二个重载方法连接MySQL。ConnectPropertyVal是union类型,在connection.h中定义。<br>
</p><pre class="brush:php;toolbar:false">					sql::mysql::MySQL_Driver *driver = 0;
sql::Connection *conn = 0;
std::map<:string connectpropertyval> connProperties; 
ConnectPropertyVal tmp; 
tmp.str.val = "tcp://127.0.0.1:3306/test"; 
connProperties[std::string("hostName")] = tmp; 
tmp.str.val = "root"; 
connProperties[std::string("userName")] = tmp; 
tmp.str.val = "000000"; 
connProperties[std::string("password")] = tmp; 
try 
{ 
	driver = sql::mysql::get_mysql_driver_instance();
	conn = driver -> connect(connProperties); 
	cout 

<p style="margin-top: 0px; margin-bottom: 0px;">
					    上面的连接字符串可以将协议与路径分开写(译者注:C++会把两个连在一起的字符串合并成一个字符串),如:mp.str.val = "unix://" "/tmp/mysql.sock"</p>
<p style="margin-top: 0px; margin-bottom: 0px;">
					    当建立与服务器之间的连接后,通过Connection::setSessionVariable方法可以设置像sql_mode这样的选项。</p>
<h5>
					C++细节注意点</h5>
    像Connection这样的对象,必须在用完之后,显式的delete,例如:<br>
<pre class="brush:php;toolbar:false">				sql::Connection *conn = driver -> connect("tcp://127.0.0.1:3306", "root", "000000");
// do something
delete conn
로그인 후 복사

    使用使用auto_ptr来维护连接对象的清理, 如:

				use namespace std;
use namespace sql;
auto_ptr  con ( driver -> connect("tcp://127.0.0.1:3306", "root", "000000") );
로그인 후 복사
获取Statement对象

    Statement对象用于向MySQL服务器发送SQL语句。该对象可以通过调用Connection::createStatement方法获得。Statement向MySQL发送一个静态的SQL语句,然后从MySQL获取操作的结果,我们无法向它提供sql参数。如果要向它传递参数,可以使用PreparedStatemenet类。如果相同的SQL语句(只SQL参数不同)要被执行多次,建议使用PreparedStatement类。
    Connection::createStatement的签名如下(关于Connection类所提供的方法列表,可以查看connection.h头文件):

					/* connection.h */ 
Statement* Connection::createStatement();
로그인 후 복사
    下面的的代码段通过调用Connection对象的createStatemenet来获取一个Statement对象:

					Connection *conn;  // Connection对象的引用
Statement *stat; 
Statement stat = conn -> createStatement(); 
로그인 후 복사

执行SQL语句

    在执行SQL语句之前应该通过Connection对象的setSchema方法设置相应的Schema(如果没有在数据库地址URL中指定schema)。

    Statement::executeQuery用于执行一个Select语句,它返回ResultSet对象。Statement::executeUpdate方法主要用于执行INSERT, UPDATE, DELETE语句(executeUpdate可以执行所有的SQL语句,如DDL语句,像创建数据表。),该方法返回受影响记录的条数。

    如果你不清楚要执行的是像select这样的查询语句还是像update/insert/delete这样的操作语句,可以使用execute方法。对于查询语句,execute()返回True,然后通过getResultSet方法获取查询的结果;对于操作语句,它返回False,通过getUpdateCount方法获取受影响记录的数量。

    在一些特殊的情况下,单条SQL语句(如执行存储过程),可能会返回多个结果集 和/或 受影响的记录数量。如果你不想忽略这些结果,通过getResultSet或getUpdateCount方法第一个结果后,再通过getMoreResults()来获取其他的结果集。

    下面是这些方法的签名,可以在statement.h头文件中查阅Statement的完整方法列表。

				/* connection.h */ 
void Connection::setSchema(const std::string& catalog); 
/* statement.h */ 
ResultSet* Statement::executeQuery (const std::string& sql); 
int Statement::executeUpdate (const std::string& sql); 
bool Statement::execute (const std::string& sql); 
ResultSet* Statement::getResultSet(); 
uint64_t Statement::getUpdateCount();
로그인 후 복사

    这些方法出错时都会抛出SQLException异常,所以在你的代码中应该使用try...catch语句块来捕获这些异常。

    现在回顾上面那个完全的例子,你会发现获取City表的所有记录是如此的简单:

				Statement *stmt;
ResultSet *res;
res = stmt -> executeQuery ("SELECT * FROM City");
로그인 후 복사

    executeQuery方法返回ResultSet对象,它包含了查询的结果。在以下情况下,executeQuery会抛出SQLException异常:数据库在执行查询时出错;在一个关闭的Statement对象上调用executeQuery;给出的SQL语句返回的不是一个简单的结果集;

    上面的代码可以用Statement::execute()重写:

				bool retvalue = stmt -> execute ("SELECT * FROM City");
if (retvalue) 
{
    res = stmt -> getResultSet();
} 
else 
{
    ...
}
로그인 후 복사
    execute()返回True表示操作的结果是一个ResultSet对象,否则结果是受影响记录的数量或没有结果。当返回True时,通过getResultSet方法获取结果集,在返回False的情况下调用getResultSet方法,将返回NULL。

    当数据库在执行时发生错误或者在一个已关闭的Statement对象上执行execute与getResultSet方法,都会抛出SQLException异常。

    如果要往数据库里添加一条新的记录,可以像下面的例子一样简单的调用executeUpdate方法:

				int updateCount = stmt -> executeUpdate ("INSERT INTO City (CityName) VALUES ('Napier, New Zealand')");
로그인 후 복사

    如果executeUpdate执行的是像INSERT, UPDATE或DELETE这样的数据操作语句(DML),它返回受影响的记录的数量;如果执行的是数据定义语句(DDL),它返回0。在数据库操作失败,或者在一个已经关闭的Statement上调用该方法,或者给出的SQL语句是一个查询语句(会返回结果集),该方法会抛出SQLException异常。

    下面的代码使用execute和getUpdateCount方法来生写上面的例子:

				int updateCount = 0;
bool retstatus = stat->execute("INSERT INTO City (CityName) VALUES ('Napier, New Zealand')");
if (!retstatus) 
{
    updateCount = stat->getUpdateCount();
} 
else 
{
    ...
}
로그인 후 복사
从ResultData中获取数据

    上面的段落介绍了执行SQL查询的方法:executeQuery和execute,用于获取ResultSet对象。我们可以通过ResultSet访问查询的结果。每一个ResultSet都包含一个游标(cursor),它指向数据集中的当前记录行。ResultSet中排列的记录是有序的(译者注:只能按顺序一条一条获取,不能跳跃式获取)。(但)在同一行中,列值的访问却是随意的:可以通过列的位置或者名称。通过列的名称访问列值让代码更清晰,而通过位置访问列值则更高效。

    列的名称通过SQL语句的AS子名设定,如果SQL语句中没有使用AS子名,列的名称默认为数据表中对应的列名。例如对于"SELECT CityName AS CN FROM City",CN就是结果集中列的名称。
    在ResultSet中的数据,可以通过getXX系列方法来获取,例如:getString(), getInt(),"XX"取决于数据的类型。next()与previous()使游标移到结果集中的下一条或上一条记录。

    Statement执行SQL语句返回ResultSet对象后,ResultSet就变成一个独立的对象,与原先的Statement再也没有联系,即使Statement对象关闭,重新执行其他sql语句,或者获取多个结果集中的下一个。ResultSet将一直有效,除非显式或隐式地将其关闭。
    在撰写本文时,对于Statement对象,MySQL Connector/C++总是返回缓存结果,这些结果在客户端缓存。不管结果集数据量大小,MySQLConnector/C++ Driver总是获取所有的数据。希望以后的版本中,Statement对象能够返回缓存和非缓存的结果集。

    下面是数据获取方法的签名,可以在resultset.h头文件中查看所有ResultSet类支持的方法。

					/* resultset.h */
size_t ResultSet::rowsCount() const;
void ResultSet::close();
bool ResultSet::next();
bool ResultSet::previous();
bool ResultSet::last();
bool ResultSet::first();
void ResultSet::afterLast();
void ResultSet::beforeFirst();
bool ResultSet::isAfterLast() const;
bool ResultSet::isBeforeFirst()const;
bool ResultSet::isClosed() const;
bool ResultSet::isNull(uint32_t columnIndex) const;
bool ResultSet::isNull(const std::string& columnLabel) const;
bool ResultSet::wasNull() const;
std::string ResultSet::getString(uint32_t columnIndex) const;
std::string ResultSet::getString(const std::string& columnLabel) const;
int32_t ResultSet::getInt(uint32_t columnIndex) const;
int32_t ResultSet::getInt(const std::string& columnLabel) const;
로그인 후 복사
    在下面的简单示例中,查询语句"SELECT * FROM City"返回的ResultSet中只包含一列:CityName,数据类型为String,对应MySQL中的VARCHAR类型。这个例子通过next方法循环从结果集中获取CityName值,并显示在控制台上:

				while (res -> next())
{
    cout  getString("CityName") 
<p>
					    也可以通过位置来获取列值(位置从1开始而非从0开始),下面的代码产生相同的结果:</p>
<pre class="brush:php;toolbar:false">				while (res -> next()) 
{
        cout  getString(1) 

<p style="margin-top: 0px; margin-bottom: 0px;">
				    如果数据库中该字段的值为NULL,getString将返回一个空的字符串。Result::isNull用于判断指定列在数据库中的值是否为NULL。Result::wasNULL()用于判断最近读取的列的值是否为空。
</p><p style="margin-top: 0px; margin-bottom: 0px;">
					    下面的例子演示了通过cursor(游标)倒序读取结果集中的数据:</p>

<p style="margin-top: 0px; margin-bottom: 0px;">
</p><pre class="brush:php;toolbar:false">				/* Move the cursor to the end of the ResultSet object, just after the last row */
res -> afterLast();
if (!res -> isAfterLast()) 
{
    throw runtime_error("Error: Cursor position should be at the end of the result set after the last row.");
}
/* fetch the data : retrieve all the rows in the result set */
while (res -> previous()) 
{
    cout getString("CityName") 
<p>
					    getString方法在以下情况下会抛出SQLException异常:指定列名或位置不存在;数据库在执行操作时失败;在一个关闭的cursor上执行调用该方法。</p>

<p>
					    未完待续!</p>




    <p class="copyright">
        原文地址:MySQL Connector/C++入门教程(上), 感谢原作者分享。
    </p>
    
    


로그인 후 복사
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

MySQL의 역할 : 웹 응용 프로그램의 데이터베이스 MySQL의 역할 : 웹 응용 프로그램의 데이터베이스 Apr 17, 2025 am 12:23 AM

웹 응용 프로그램에서 MySQL의 주요 역할은 데이터를 저장하고 관리하는 것입니다. 1. MySQL은 사용자 정보, 제품 카탈로그, 트랜잭션 레코드 및 기타 데이터를 효율적으로 처리합니다. 2. SQL 쿼리를 통해 개발자는 데이터베이스에서 정보를 추출하여 동적 컨텐츠를 생성 할 수 있습니다. 3.mysql은 클라이언트-서버 모델을 기반으로 작동하여 허용 가능한 쿼리 속도를 보장합니다.

LARAVEL 소개 예 LARAVEL 소개 예 Apr 18, 2025 pm 12:45 PM

Laravel은 웹 응용 프로그램을 쉽게 구축하기위한 PHP 프레임 워크입니다. 설치 : Composer를 사용하여 전 세계적으로 Laravel CLI를 설치하고 프로젝트 디렉토리에서 응용 프로그램을 작성하는 등 다양한 기능을 제공합니다. 라우팅 : Routes/Web.php에서 URL과 핸들러 간의 관계를 정의하십시오. 보기 : 리소스/뷰에서보기를 작성하여 응용 프로그램의 인터페이스를 렌더링합니다. 데이터베이스 통합 : MySQL과 같은 데이터베이스와 상자 외 통합을 제공하고 마이그레이션을 사용하여 테이블을 작성하고 수정합니다. 모델 및 컨트롤러 : 모델은 데이터베이스 엔티티를 나타내고 컨트롤러는 HTTP 요청을 처리합니다.

C# vs. C : 역사, 진화 및 미래 전망 C# vs. C : 역사, 진화 및 미래 전망 Apr 19, 2025 am 12:07 AM

C#과 C의 역사와 진화는 독특하며 미래의 전망도 다릅니다. 1.C는 1983 년 Bjarnestroustrup에 의해 발명되어 객체 지향 프로그래밍을 C 언어에 소개했습니다. Evolution 프로세스에는 자동 키워드 소개 및 Lambda Expressions 소개 C 11, C 20 도입 개념 및 코 루틴과 같은 여러 표준화가 포함되며 향후 성능 및 시스템 수준 프로그래밍에 중점을 둘 것입니다. 2.C#은 2000 년 Microsoft에 의해 출시되었으며 C와 Java의 장점을 결합하여 진화는 단순성과 생산성에 중점을 둡니다. 예를 들어, C#2.0은 제네릭과 C#5.0 도입 된 비동기 프로그래밍을 소개했으며, 이는 향후 개발자의 생산성 및 클라우드 컴퓨팅에 중점을 둘 것입니다.

공연 경주 : 골랑 대 c 공연 경주 : 골랑 대 c Apr 16, 2025 am 12:07 AM

Golang과 C는 각각 공연 경쟁에서 고유 한 장점을 가지고 있습니다. 1) Golang은 높은 동시성과 빠른 발전에 적합하며 2) C는 더 높은 성능과 세밀한 제어를 제공합니다. 선택은 프로젝트 요구 사항 및 팀 기술 스택을 기반으로해야합니다.

데이터베이스 연결 문제 해결 : Minii/DB 라이브러리 사용 실질적인 사례 데이터베이스 연결 문제 해결 : Minii/DB 라이브러리 사용 실질적인 사례 Apr 18, 2025 am 07:09 AM

작은 응용 프로그램을 개발할 때 까다로운 문제가 발생했습니다. 가벼운 데이터베이스 운영 라이브러리를 신속하게 통합해야합니다. 여러 라이브러리를 시도한 후에는 기능이 너무 많거나 호환되지 않는다는 것을 알았습니다. 결국, 나는 내 문제를 완벽하게 해결하는 YII2를 기반으로 단순화 된 버전 인 Minii/DB를 발견했습니다.

vscode를 사용하는 방법 vscode를 사용하는 방법 Apr 15, 2025 pm 11:21 PM

Visual Studio Code (VSCODE)는 Microsoft가 개발 한 크로스 플랫폼, 오픈 소스 및 무료 코드 편집기입니다. 광범위한 프로그래밍 언어에 대한 가볍고 확장 성 및 지원으로 유명합니다. VSCODE를 설치하려면 공식 웹 사이트를 방문하여 설치 프로그램을 다운로드하고 실행하십시오. VScode를 사용하는 경우 새 프로젝트를 만들고 코드 편집, 디버그 코드, 프로젝트 탐색, VSCODE 확장 및 설정을 관리 할 수 ​​있습니다. VSCODE는 Windows, MacOS 및 Linux에서 사용할 수 있으며 여러 프로그래밍 언어를 지원하며 Marketplace를 통해 다양한 확장을 제공합니다. 이점은 경량, 확장 성, 광범위한 언어 지원, 풍부한 기능 및 버전이 포함됩니다.

Visual Studio Code에서 C를 사용하십니까? Visual Studio Code에서 C를 사용하십니까? Apr 15, 2025 pm 08:03 PM

C 코드에서 C를 쓰는 것은 가능할뿐만 아니라 효율적이고 우아합니다. 핵심은 코드 완료, 구문 강조 및 디버깅과 같은 기능을 제공하는 우수한 C/C 확장 기능을 설치하는 것입니다. VS Code의 디버깅 기능은 버그를 신속하게 찾는 데 도움이되며 Printf 출력은 구식이지만 효과적인 디버깅 방법입니다. 또한 동적 메모리 할당되면 메모리 누출을 방지하기 위해 반환 값을 확인하고 메모리를 풀어야하며 이러한 문제를 디버깅하는 것이 VS 코드에서 편리합니다. VS 코드는 성능 최적화에 직접 도움을 줄 수는 없지만 코드 성능을 쉽게 분석 할 수있는 우수한 개발 환경을 제공합니다. 좋은 프로그래밍 습관, 가독성 및 유지 관리도 중요합니다. 어쨌든, 대 코드는입니다

Golang 및 C : 성능 상충 Golang 및 C : 성능 상충 Apr 17, 2025 am 12:18 AM

Golang과 C의 성능 차이는 주로 메모리 관리, 컴파일 최적화 및 런타임 효율에 반영됩니다. 1) Golang의 쓰레기 수집 메커니즘은 편리하지만 성능에 영향을 줄 수 있습니다. 2) C의 수동 메모리 관리 및 컴파일러 최적화는 재귀 컴퓨팅에서 더 효율적입니다.

See all articles