设为首页 收藏本站
查看: 1182|回复: 0

[经验分享] C#(.net)实现用apache activemq传递SQLite的数据

[复制链接]

尚未签到

发表于 2017-12-25 12:54:29 | 显示全部楼层 |阅读模式
  版权声明:本文为搜集借鉴各类文章的原创文章,转载请注明出处:http://www.cnblogs.com/2186009311CFF/p/6382623.html。
  C#(.net)实现用apache activemq传递SQLite的数据:
  本测试适用于Windows32位,VS2010的.net 4.0框架。
  一、C#连接SQLite:
  对于C#连接SQLite的内容,请查看我的另一篇随笔:http://www.cnblogs.com/2186009311CFF/p/6270467.html(从“二、后台与SQLite数据库连接:”开始看),不同之处如下:
  1、那篇文章的连接方式是B/S下的连接数据库方式,但在C/S下有所不同,具体如下:
  注意:这两种方法,都需要自己把数据库文件拷贝至相应文件夹,只是放的位置不同:绝对路径在固定的目录,相对路径在安装目录下
  1)用绝对路径:
  

static readonly static string strconn= "Data Source=C:/DB/Test.db";  

  

  2)用相对路径:
  

private readonly static string strconn = "Data Source="+Application.StartupPath+"../Test.db;Version=3;";  

  

  如果提示错误“attempt to write a readonly database”,则需数据库文件所在文件夹(即C:/DB或安装目录)的文件夹权限(属性——>安全……)
  2、那篇文章的ashx文件内容与C/S下的类似,只是在C/S下,我用cs文件替代了ashx文件,主要内容如下:
  查询的:
  

  public static DataTable GetDataTable(string strSQL)//"Select * From ProductionCycleData"  
{
  
DataTable dt = new DataTable();
  
DataSet ds = new DataSet();
  
using (SQLiteConnection conn = new SQLiteConnection(strconn))
  
{
  
//创建sqlite命令
  
using (SQLiteCommand comm = conn.CreateCommand())
  
{
  
//打开数据库链接
  
conn.Open();
  
//select数据分页用limit就行,很方便
  
comm.CommandText = strSQL;
  
using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(comm))
  
{
  
adapter.SelectCommand = comm;
  
adapter.Fill(ds);
  
}
  
//   DataTable dt = new DataTable();
  
dt = ds.Tables[0];
  
}
  
}
  
return dt;
  
}
  

  

  修改(@"UPDATE ProductionCycleData SET PDOCode = '盗贼' WHERE ShotType = 604610"),
  删除(@"DELETE FROM ProductionCycleData"),
  添加(@"INSERT INTO ProductionCycleData VALUES (1,"abc")")
  

public static void ExecuteSQLiteCommandSQL(string strSQL)  
{
  
using (SQLiteConnection con = new SQLiteConnection(SQLiteHelper.strconn))
  
{
  
con.Open();            
  
using (SQLiteCommand cmd = new SQLiteCommand(strSQL, con))
  
{
  
cmd.ExecuteNonQuery();
  
}
  
}
  
}
  

  

  可参考: http://www.cnblogs.com/teroy/p/3960760.html
  其实我测试时有小插曲,我用相当于bin目录的相对路径:private readonly static string strconn = "Data Source=../../..//DB/Test.db;Version=3;";调试是可以查询和删除成功的,但是安装后就不成功了,应该是安装后找不到路径了,具体我也不清楚。
  二、用Apache ActiveMQ传递信息
  1、首先具备java环境,去Oracle官网下载适合本电脑的JDK或者JRE安装,下载链接: http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html#javasejdk   (不知以后会不会失效,总之去官网找吧,现在是免费的)
  2、去Apache ActiveMQ官网下载文件
  源文件: http://activemq.apache.org/activemq-5143-release.html  
  运行解压后的apache-activemq-5.14.3-bin\apache-activemq-5.14.3\bin\win32\activemq.bat文件(我的测试电脑是32位,故选择Win32下的bat文件运行),出现如图所示,则表明Apache ActiveMQ可以发送和接收数据了
DSC0000.png

  .net下所需的dll,我用到的是Sub Projects下的NMS:http://www.apache.org/dyn/closer.lua/activemq/apache-nms/1.7.0/Apache.NMS.ActiveMQ-1.7.2-bin.zip
  引用解压文件里的.net 4.0下的Apache.NMS、Apache.NMS.ActiveMQ、Ionic.Zlib的dll
  3、前期准备:
  监控队列发送信息情况:打开浏览器输入 http://localhost:8161/admin/ ,用账户:admin和密码:admin登录。这是默认的,可在前面“1、”中的解压文件conf文件夹下的jetty.xml和jetty-realm.properties中,进行相应的更改,步骤如下:
  1)jetty.xml中true变false;
DSC0001.png

  2)jetty-realm.properties中,按用户名:密码,角色的顺序排列,按照所需进行更改保存
DSC0002.png

  可参考:http://blog.csdn.net/stevenprime/article/details/7091224
  成功登录后,呈现界面:
DSC0003.png

  点击Queues,如若有信息发送成功,则会显示,如图所示:
DSC0004.png

  若需查看具体发送的内容,则只需点击对应的Queues Name(如test):
DSC0005.png

  出现:
DSC0006.png


  点击对应的Message>
DSC0007.png

  4、C#控制,发送信息给Apache ActiveMQ
  可参考:http://www.cnblogs.com/woxpp/p/5001373.html(这个真的很好)、http://blog.csdn.net/proglovercn/article/details/51592884(这个也不错)
  1)查看“1、”下的解压文件conf目录下的文件:
  credentials.properties文件,查看activemq.username、activemq.password
DSC0008.png

  activemq.xml文件,查看串口号
DSC0009.png

  2)C#代码,发送信息
  

private static string strActivemMQusername = "system";  
private static string strActivemMQpassword = "manager";
  
private static string strPort = "61616";
  
public static void SendMessage(string strSendQueueName, string strSendIP, string strSendMessage)
  
{
  
String QueuesNameESF = "queue://" + strSendQueueName;
  
Uri _uri = new Uri(String.Concat("activemq:tcp://" + strSendIP + ":" + strPort));
  
IConnectionFactory factory = new ConnectionFactory(_uri);
  
using (IConnection conn = factory.CreateConnection(strActivemMQusername, strActivemMQpassword))
  
{
  
using (ISession session = conn.CreateSession())
  
{
  
IDestination destination = SessionUtil.GetDestination(session, QueuesNameESF);
  
using (IMessageProducer producer = session.CreateProducer(destination))
  
{
  
conn.Start();
  
//可以写入字符串,也可以是一个xml字符串等
  
ITextMessage request = session.CreateTextMessage(strSendMessage);
  
producer.Send(request);
  

  
}
  
}
  
}
  
}
  

  

  运行过后,可在http://localhost:8161/admin/查看信息发送情况。
  参考:http://www.cnblogs.com/diorlv/p/3328712.html  、http://www.cnblogs.com/madyina/p/4121458.html
  3)接收Apache ActiveMQ的消息:
  

public static void ReceMessage(string strReceQueueName, string strReceIP, ref DataTable dtReceMessage)  
{
  

  
String QueuesNameESF = "queue://" + strReceQueueName;
  
Uri _uri = new Uri(String.Concat("activemq:tcp://" + strReceIP + ":" + strPort + "?wireFormat.maxInactivityDuration=0"));
  
IConnectionFactory factory = new ConnectionFactory(_uri);
  
using (IConnection conn = factory.CreateConnection(strActivemMQusername, strActivemMQpassword))
  
{
  
using (ISession session = conn.CreateSession())
  
{
  
conn.Start();
  
IDestination destination = SessionUtil.GetDestination(session, QueuesNameESF);
  
using (IMessageConsumer consumer = session.CreateConsumer(destination))
  
{
  
ITextMessage message = consumer.Receive() as ITextMessage;
  

  
string strReceMessage = message.Text;
  
dtReceMessage = XMLHelper.HuaGeConvertXmlToDataTable(strReceMessage);
  

  
}
  
}
  
}
  
}
  

  

  此处接收XML文件字符串,并把其转化成DateTable形式接收。
  但以上的接收和发送有不足,发送是同一消息名接收多多信息,但接收只能接收同一消息名的第一条信息,这种是不适用实际情况的,我还在考虑如何删除,静待完善。。。呵呵。
  本人处于初期探索阶段,对于消息是否发送成功的判断,和一对多,多对一的处理,还有程序删除队列消息等问题,有待学习,希望这些能够帮助到你。
  如有不足之处,请谅解,并留言,谢谢!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-427831-1-1.html 上篇帖子: elk系列8之logstash+redis+es的架构来收集apache的日志 下篇帖子: Apache+php+mysql win7 64位安装的几个注意事项
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表