MySQL C++.net 交互
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL C++.net 交互相关的知识,希望对你有一定的参考价值。
请教高人
我能否在本地开发一个程序,能够与网站上的数据库相互连接呢
数据库是mysql
本地程序时C++.net(CLR)
我设想是能否将本地信息传送到php页面然后通过PHP链接到数据库
不知道这个设想是否可以实现
请求各位高人求助
请给下源代码,谢谢
public static class database
//数据库链接
static MySqlConnection Conn = null;
//连接数据库
static void OpenConn()
if (Conn != null && Conn.State == ConnectionState.Open)
Conn.Close();
if (Conn == null)
Conn = new MySqlConnection(你的数据库连接字符串);
if (Conn.State == ConnectionState.Closed)
Conn.Open();
//关闭数据库连接
static void CloseConn()
if (Conn != null)
Conn.Close();
//执行SQL语句
public static bool ExecSql(string strSql)
try
OpenConn();
MySqlCommand Cmd = new MySqlCommand(strSql, Conn);
Cmd.ExecuteNonQuery();
Cmd.Dispose();
return true;
catch (Exception ex)
return false;
finally
CloseConn();
//获取DataSet接口
public static DataSet GetDataSet(string strSql, string strDataSetName)
try
OpenConn();
DataSet dataSet = new DataSet();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter(strSql, Conn);
dataAdapter.Fill(dataSet, strDataSetName);
dataAdapter.Dispose();
return dataSet;
catch(Exception ex)
return null;
finally
CloseConn();
//获取MySqlDataReader接口
public static MySqlDataReader GetDataReader(string strSql)
try
OpenConn();
MySqlCommand Cmd = new MySqlCommand(strSql, Conn);
MySqlDataReader dataReader = Cmd.ExecuteReader();
return dataReader;
catch (Exception ex)
return null;
要去网上下一个MySql.Data.dll 然后倒入就可以使用上面的代码连接数据库了 参考技术A webServices
你用PHP 写一个WS 然后用C++操作这个WS 就行了。
写数据 和 读数据
#include "StdAfx.h"
#include "WebServices.h"
#import "msxml4.dll"
using namespace MSXML2;
#include "atlenc.h"
#import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP30.dll" \
exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib30;
WebServices::WebServices(void)
CoInitialize(NULL);
WebServices::~WebServices(void)
CoUninitialize();
bool WebServices::SendData(peroson_info perInfo)
ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector;
Connector.CreateInstance(__uuidof(HttpConnector30));
Connector->Property["EndPointURL"] = "http://192.168.0.10:8080/CVR100S/services/Hello";
Connector->Connect();
Connector->Property["SoapAction"] = "";
Connector->BeginMessage();
Serializer.CreateInstance(__uuidof(SoapSerializer30));
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
Serializer->StartEnvelope("","","");
Serializer->StartBody("");
Serializer->StartElement("SaveInfo","http://ws.chinaidcard.com","","");
Serializer->StartElement("in0","","","");
SYSTEMTIME time;
GetLocalTime(&time);
CString strTime;
strTime.Format(L"%04d-%02d-%02d %02d:%02d:%02d",time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);
CString temp=perInfo.Name+L";"+perInfo.Sex+L";"+perInfo.Nation+L";"+perInfo.Birthday+L";"+perInfo.Address+L";"+perInfo.IDCode+L";"+perInfo.发证机关+L";"+(perInfo.StartDate+L"-"+perInfo.EndDate)+L";"+perInfo.NewAddress+L";"+strTime+L";"+L"netGroup01"+L";"+L"RID2";
Serializer->WriteString(temp.AllocSysString());
Serializer->EndElement();
Serializer->StartElement("in1","","","");
CFile file;
byte *data;
int len=0;
TCHAR szPath[MAX_PATH];
GetModuleFileName( NULL, szPath, MAX_PATH );
CString path=CString(szPath);
CString laod=path.Left(path.ReverseFind('\\')+1)+L"zp.bmp";
if(file.Open( laod,CFile::modeRead))
file.SeekToBegin();
len=file.GetLength();
data=new byte[len];
file.Read(data,len);
file.Close();
CString buffer;
IDataEncoderFactoryPtr encoderFc;
encoderFc.CreateInstance(__uuidof(DataEncoderFactory30));
DWORD *len1=new DWORD;
IDataEncoderPtr encoder=encoderFc->GetDataEncoder(L"base64");
encoder->raw_SizeToEncode(data,len,len1);
int lon=*len1;
byte *data1=new byte[lon+1];
HRESULT hr=encoder->Encode(data,len,data1,len1);
int len2=*len1;
if(FAILED(hr))
TRACE0("123");
Serializer->WriteBuffer(len2,(byte *)data1);
delete len1;
delete data;
delete data1;
Serializer->EndElement();
Serializer->EndElement();
Serializer->EndBody();
Serializer->EndEnvelope();
Connector->EndMessage();
Reader.CreateInstance(__uuidof(SoapReader30));
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
CString result=Reader->RpcResult->text;
if(result==L"ok")
return true;
else
return false;
CString WebServices::GetBmp()
ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector;
Connector.CreateInstance(__uuidof(HttpConnector30));
Connector->Property["EndPointURL"] = "http://192.168.0.10:8080/CVR100S/services/Hello";
Connector->Connect();
Connector->Property["SoapAction"] = "";
Connector->BeginMessage();
Serializer.CreateInstance(__uuidof(SoapSerializer30));
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
Serializer->StartEnvelope("","","");
Serializer->StartBody("");
Serializer->StartElement("GetBmp","http://ws.chinaidcard.com","","");
Serializer->EndElement();
Serializer->EndBody();
Serializer->EndEnvelope();
Connector->EndMessage();
Reader.CreateInstance(__uuidof(SoapReader30));
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
IDataEncoderFactoryPtr encoderFc;
encoderFc.CreateInstance(__uuidof(DataEncoderFactory30));
IDataEncoderPtr encoder=encoderFc->GetDataEncoder(L"base64");
CString strdata=Reader->RpcResult->text;
int byteLen=Reader->RpcResult->text.length()*2+2;
CFile file;
DWORD *len23=new DWORD;
encoder->SizeToDecode(strdata.AllocSysString(),byteLen,len23);
int l=*len23;
byte *data12=new byte[l];
encoder->Decode(strdata.AllocSysString(),byteLen,data12,len23);
if(file.Open(L"data.bmp",CFile::modeCreate|CFile::modeReadWrite))
file.Write(data12,l);
file.Close();
delete len23,data12;
return L"";
或者你用
CInternet
CHttpFile
看看例子 我手头上没有
浅析mysql交互式连接&非交互式连接
https://www.jb51.net/article/81462.htm
https://blog.csdn.net/andypan1314/article/details/77930677
(1)interactive_timeout: 服务器关闭交互式连接前等待活动的秒数
(2)wait_timeout: 服务器关闭非交互连接之前等待活动的秒数。
两者生效取决于:客户端是交互或者非交互的连接。
在交互模式下,interactive_timeout才生效;非交互模式下,wait_timeout生效。
交互式操作:通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议。
非交互式操作:就是你在你的项目中进行程序调用。比如一边是tomcat web服务器,一边是数据库服务器,两者怎么通信?在java web里,我们通常会选择hibernate或者是jdbc来连接。那么这时候就是非交互式操作。
在之前,我基本上不关系这两个属性,都是用的是mysql服务商推荐的默认值,就是8小时。
但是,从昨天开始,由于在新网租用了一个空间,而他的mysql的wait_time设置了10s,所以引出来一系列的问题,就顺便来研究下。
或者这个标题可以改为“mysql的8小时自动关闭”问题,这个标题你到百度上搜搜,一搜一大堆,但是都没有讲明白,今天我就给大家来说说这两个值。
一、概念
1)interactive_time:是指如果空余Ns(N就是这个属性的值),那么就会自动关闭mysql的连接。关闭什么样的mysql连接?在之前,我们在《什么是mysql的交互式操作和非交互式操作?》 这篇文章中讲到,mysql是有两种操作方式,那就有两种连接的,一种是交互式,一种是非交互式。而这个属性控制的是交互式。就是你打开一个mysql客 户端黑窗口,进入操作之后,又隔了Ns你不操作了,之后你想继续操作,对不起,mysql会在之前关闭了你的那个连接,mysql会帮你自动重新连接。
2)wait_time:是指如果空余Ns(N就是这个属性的值),那么会自动kill掉mysql的一部分连接线程。这里的连接就是指的是非交互式连接。
总结下,就是用比较正规的术语讲:
(1)interactive_timeout:
参数含义:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
参数默认值:28800秒(8小时)
(2)wait_timeout:
参数含义:服务器关闭非交互连接之前等待活动的秒数。
在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。
参数默认值:28800秒(8小时)
这里有引出了另外一个概念:mysql_real_connect(),这个好理解,就是你不管什么连接,是交互式还是非交互式,你要操作mysql之前要必须执行完毕的方法,其实你可以理解成登录mysql,或者拿到mysql的一个连接。
二、如何查看、重新设置这两个值
这是我修改之后的。这是查看方法。
修改这两个值是分为两种修改的。
1) 修改当前会话的这两个属性值。所谓的当前会话就是你当前获取的连接池的连接。比如你打开黑窗口那个会话。这个修改比较简单,直接set wait_timeout=10;就行了,你怎么知道这么修改仅仅修改的是当前会话?很简单,你把这个黑窗口关了,你再重新开一个,再重新查,你发现没改 啊。
2)修改全局的属性值。一般这个用的多,你到你的数据库安装包下找到my.ini,在最下面添加wait_timeout=10就可以了,然后重新启动mysql服务,我说的重新启动服务,不是你关闭这个黑窗口,重新启动一个黑窗口。服务在我的电脑右键服务里去找。
现在先说到这里,一会继续。
一、mysql8小时异常
1)异常概念。
大 家都知道mysql的8小时自动断开异常吧,百度上一大把。就是由于这个值造成的,这个值mysql默认的是8小时,所以如果你在8小时内,数据库觉得没 有任何人来连接我,那好,我就将所有的现在存在的非交互式连接全部kill掉。而ssh中,我们一般用的是数据池。就是在tomcat已启动的时候,就向 mysql申请到N(这个N是你配置的)个非交互是连接,以后想要用数据库连接的时候,没有必要一个请求就去重新获取mysql连接,只要从数据池里获取 就可以了。但是现在如果你8小时之内,没有发送请求,那么mysql会自动将所有的非交互是连接kill掉,那这时候,你的数据库连接池里存在的数据库连 接其实是null,是不存在的,你这时候也不判断,继续想用这个链接去请求数据,当然会抛出异常,所抛出的异常Communications link failure due to underlying exception。
2)那么如何解决呢?
原 理很简单,出现这个异常的原因不就是因为连接池里存在着已经不存在的连接,而且你还不知道,你还得用这个原本就被关闭的连接去请求吗?这就好办了,你控制 了不了服务器的mysql(如果你是空间的话),那你知道控制自己的数据库连接池了,让连接池增加一个验证功能,就是凡是在从池里拿到连接之后,在用之前 先验证下这个链接是否有效,如果有效则可以直接使用,如果无效则重新申请一个连接,这样就不会出现这个异常了。当然,肯定性能会降低。关于性能为什么降 低,我们稍后会讲,现在来看,如何实现让数据库连接池先验证是否有效再用的功能:
我用的连接池是c3p0,建议使用这个。当然各个连接池的性能优缺点你得根据自己的项目具体分析,这里可不分析我为什么选c3p0了。
1
2
3
4
5
6
7
8
9
|
<property name = "testConnectionOnCheckin" value= "true" />//归还给连接池时候要检查 <property name = "testConnectionOnCheckout" value= "true" />//从连接池中拿出来要检查 <! --因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。 Default : false --> <property name = "testConnectionOnCheckout" > false </property> <! --如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --> <property name = "testConnectionOnCheckin" > true </property> |
所以也就是通过两个动作去维护这个连接池,如图:
3)解决方案的性能问题
A)检测有效性的性能优化
因为要去时刻检查这个链接是否还有效,所以效率比如会降低,那么如何检查呢?默认的检查方式我现在还真不知道,但是上面一段话说了,如果使用 automaticTestTable 方法进行验证测试连接的有效性,会对性能有所提升。那我们就来看下这个属性
1 <property name="automaticTestTable" value="C3P0TestTable"/>
这 个属性是什么意思呢?就是他会自动的帮你建立一张名字叫C3P0TestTable的表,这种表非常的简单,而且最关键的是里面没有数据,检测的时候,可 以通过连接访问这种表是否能访问的到,如果能访问的到,说明这个链接是有效的,否则说明这个链接已经被mysql kill掉了。
那这张表是我们程序员建立的吗?NO,你不用管,你只要这么配置上,自然会帮你自动建立一张这个表的。
B)testConnectionOnCheckout 性能的优化。因为这个属性是指你从连接池中拿出来的时候,在每一个链接去真正提交,震中拿着这个链接去数据库访问的时候,要做下检查,并不是说,我从连接 池中拿出来,我就做检查,我得等到提交的时候才做检查的,那这样会设计到一个connection提交的问题,在默认的情况下,你发送一个db request就会自动马上去执行,就会马上commit的,如果你配置在事务当中呢,就是一个action方法对应一个biz方法,这样你只要做一次检 查就行了,减少了检测的次数。
也就是说,对于这种解决方案的性能优化的宗旨就是减少检测次数、优化检测方法。
二、mysql的wait_timeout值应该设置多少?
如果你不是IDC,你不是往外出租服务器,那么你完全可以设置为默认值8小时就可以了。但是如果IDC往外租用服务器的时候,就得重新设置了,比如新网就是设置为10s的。
但 是这个设置为多大,并不是新网那样随便设置的,因为我发现新网的这个服务器业务压力并不是很大,但是他却设置了一个10s这么小的值,这样反而会更消耗服 务器资源。是,得承认,如果这个值过大的话,很可能会造成大量的无用的闲置的连接存在,对数据库压力过大,但是新网的那个服务器的业务压力并不大啊,你设 置成这么小的数值,很明显,你是在刻意的增加系统服务器的业务压力啊,罪人啊罪人。
所以,设置为多大,得根据你的服务器的压力大小来配置的,可不是随便写一个数就行了的。
以上这篇浅析mysql交互式连接&非交互式连接就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
转自: https://blog.csdn.net/michaelwubo/article/details/80887078
以上是关于MySQL C++.net 交互的主要内容,如果未能解决你的问题,请参考以下文章
如何授权 .NET 5.0 / C# 应用程序在没有用户交互的情况下与 Microsoft 365 SharePoint Online 交互?