C#连接MYSQL如何做到实时取读某表的某字段的值

问题描述

初学C#有个用C#做接口的任务需要实时读取MYSQL数据库中某表字段值来触发操作查到如果是SQL2005以上可以用SqlDependency启用Servicebroker来做,但是mysql有什么办法呢我现在想实在不行就用定时器了,但是对C#结构不是很了解,好像不能定义全局对象,那么我如果在定时器的话,要在哪里定义,MySqlConnection,MySqlCommand,MySqlDataReader,如果在timer1_Tick里面,那么我timer控件设置的100毫秒,那是不是每100毫秒都要执行创建和销毁这三个对象啊!我现在的代码如下,请大神帮忙privatevoidtimer1_Tick(objectsender,EventArgse){stringserver="127.0.0.1";stringdatabase="chenkuserdb5";stringname="root";stringpassword="";stringconnectionString="DATABASE="+database+";"+"server="+server+";"+"UserId="+name+";"+"PASSWORD="+password+";pooling=false;CharSet=utf8;port=3308";MySqlConnectionconnection=newMySqlConnection(connectionString);stringmysqlStr="SELECTidfromtblattachment";MySqlCommandmySqlCmd=connection.CreateCommand();mySqlCmd.Connection.Open();mySqlCmd.CommandType=CommandType.Text;mySqlCmd.CommandText=mysqlStr;MySqlDataReadermySqlReader;mySqlReader=mySqlCmd.ExecuteReader();while(mySqlReader.Read()){textBox1.Text=mySqlReader["id"].ToString();}connection.Close();connection.Dispose();}

解决方案

解决方案二:
当数据库中某个值改变了,你就要执行C#代码,去执行一些业务逻辑?这个设计未免太不合理了吧。显然就算要执行业务逻辑,要么用触发器去执行sql语句搞。或者对数据库执行插入和更新时,调用下你开放的接口函数啊。如果实在要这么干,通过轮询数据库来判断值改变的话,connection,command的对象,定义在方法之外,作为类的私有变量好了。不要每100ms就创建-销毁的。
解决方案三:
一般来说Dependency功能都是通过定时轮询来实现的……至于销毁……Close就可以了,Dispose不需要,这个由数据库连接池来管理,可以实现复用
解决方案四:
引用1楼txfast的回复:

当数据库中某个值改变了,你就要执行C#代码,去执行一些业务逻辑?这个设计未免太不合理了吧。显然就算要执行业务逻辑,要么用触发器去执行sql语句搞。或者对数据库执行插入和更新时,调用下你开放的接口函数啊。如果实在要这么干,通过轮询数据库来判断值改变的话,connection,command的对象,定义在方法之外,作为类的私有变量好了。不要每100ms就创建-销毁的。

我是要写一个跟别的程序的接口,另我一上程序不提供接口,我只能通判断数据库值来触发操作了。定义放在方法外,我就是没整明白,哪些放在方法外,哪些放在方法内能给个具体的写法么?publicForm1(){InitializeComponent();mySqlCmd.Connection.Open();mySqlCmd.CommandType=CommandType.Text;mySqlCmd.CommandText=mysqlStr;mySqlReader=mySqlCmd.ExecuteReader();}

我把这些放到初始化里了Tick里只留了mySqlReader.Read(),但是好像他读的只是初始化时表里面的数据,此时如果数据库表有变化,read()出来的不是新数据,还是老的。如果把mySqlReader=mySqlCmd.ExecuteReader();放到Tick里面又会报错,提示要先关闭连接再创建。privatevoidtimer1_Tick(objectsender,EventArgse){while(mySqlReader.Read()){textBox1.Text=mySqlReader["id"].ToString();}}

解决方案五:
自已UP一下!
解决方案六:
C#本身是不支持连接MySQL的,不知道你是通过ODBC还是MySQL客户端进行操作的如果是前者,那么安装MySQLODBC后,就与C#提供的数据库操作没什么两样了(有的只是SQL指令上的差异)如果是后者,则应采用长连接方式,以减少连接开销查了一下MySqlConnection族好像是封装了MySQL客户端。具体用法不是很清楚不过MySqlConnectionconnection=newMySqlConnection(connectionString);应放在方法外面connection.Close();只是关闭连接,并不是销毁对象。再open就又连上了
解决方案七:
1、不建议用timer;2、如果不停的读取这个数据库,尽量让这个DB变成本地的;3、如果数据库是别人的软件写入的,直接优化数据库并解决读取刷新问题才是问题的突破口;4、如果别人的软件写数据库的时候是有规律可循的,请按这个规律来读取数据库即可;5、如果写入数据库无规律,或者是完全实时的,那么不建议实时读取,因为可能会有死锁或者冲突;6、其他的问题需要具体分析你的状况才能确定解决方案。
解决方案八:
MySQL也支持计划任务吧,建议将业务逻辑写在存储过程中,每分钟MySQL自动执行。如果无法在存储过程中完成,可通过C#程序连接数据库完成,当然执行间隔可以放宽至5分钟、10分钟。
解决方案九:
引用3楼qiwen1530的回复:

Quote: 引用1楼txfast的回复:
当数据库中某个值改变了,你就要执行C#代码,去执行一些业务逻辑?这个设计未免太不合理了吧。显然就算要执行业务逻辑,要么用触发器去执行sql语句搞。或者对数据库执行插入和更新时,调用下你开放的接口函数啊。如果实在要这么干,通过轮询数据库来判断值改变的话,connection,command的对象,定义在方法之外,作为类的私有变量好了。不要每100ms就创建-销毁的。

我是要写一个跟别的程序的接口,另我一上程序不提供接口,我只能通判断数据库值来触发操作了。定义放在方法外,我就是没整明白,哪些放在方法外,哪些放在方法内能给个具体的写法么?publicForm1(){InitializeComponent();mySqlCmd.Connection.Open();mySqlCmd.CommandType=CommandType.Text;mySqlCmd.CommandText=mysqlStr;mySqlReader=mySqlCmd.ExecuteReader();}

我把这些放到初始化里了Tick里只留了mySqlReader.Read(),但是好像他读的只是初始化时表里面的数据,此时如果数据库表有变化,read()出来的不是新数据,还是老的。如果把mySqlReader=mySqlCmd.ExecuteReader();放到Tick里面又会报错,提示要先关闭连接再创建。privatevoidtimer1_Tick(objectsender,EventArgse){while(mySqlReader.Read()){textBox1.Text=mySqlReader["id"].ToString();}}

如果一个对象需要反复销毁,创建的话,就放循环体外面。

时间: 2024-09-09 08:20:53

C#连接MYSQL如何做到实时取读某表的某字段的值的相关文章

通过PHP连接MYSQL数据库、创建数据库、创建表

通过PHP连接MYSQL数据库 $conn = mysql_connect("localhost","root","password") or die("无法连接数据库"); mysql_select_db("table" ,$conn) or die ("找不到数据源"); 通过PHP创建MYSQL数据库 $conn = mysql_connect("localhost&qu

java连接mysql数据库乱码怎么办

 解决方法一: mysql安装时候的编码, 看下my.ini,有无  [mysql] default-character-set=utf8 [client] default-character-set=utf8 [mysqld] default-character-set=utf8 创建表的时候设置: DROP TABLE IF EXISTS `Company`; CREATE TABLE IF NOT EXISTS `Company` ( `Cname` VARCHAR(10) NOT NUL

java连接mysql数据库乱码的解决方案

解决方法一: mysql安装时候的编码, 看下my.ini,有无 [mysql] default-character-set=utf8 [client] default-character-set=utf8 [mysqld] default-character-set=utf8创建表的时候设置: DROP   TABLE   IF   EXISTS   `Company`; CREATE   TABLE   IF   NOT   EXISTS   `Company` (     `Cname` 

java连接mysql数据库乱码的解决方法_java

解决方法一: mysql安装时候的编码, 看下my.ini,有无 复制代码 代码如下: [mysql] default-character-set=utf8 [client] default-character-set=utf8 [mysqld] default-character-set=utf8创建表的时候设置: DROP TABLE IF EXISTS `Company`; CREATE TABLE IF NOT EXISTS `Company` ( `Cname` VARCHAR(10)

Jsp 连接 mySQL、Oracle 数据库备忘(Windows平台)

js|mysql|oracle|window|数据|数据库  Jsp 环境目前最流行的是 Tomcat5.0.Tomcat5.0 自己包含一个 Web 服务器,如果是测试,就没必要把 Tomcat 与 IIS 或 Apache 集成起来.在 Tomcat 自带的 Web 服务器下可以进行 Jsp 测试.    安装 Tomcat5.0 前需要安装 JDK(如果是 Windows server 2003 就必须安装 JDK,因为 Windows server 2003 是不带 JVM 的-Wind

.net连接Mysql封装类代码 可直接调用

下面是我封装好的连接Mysql数据库的类,直接调用即可.   微软的visual studio没有自带连接Mysql的驱动,要去网上下载一个mysql-connector-net-6.4.3驱动,然后安装就可以使用. 下面是我封装好的连接数据库的类,直接调用即可. 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; u

javabean连接mysql后,返回的一些数据正常,一些总为NULL

问题描述 本人菜鸟,研究一个jsp+servlet+struts论坛的时候,发现可以和mysql正常连接,返回用户信息的时候,一部分项正常,但是对于某些项(webLog reg_time,last_time,reg_ip等),每次都返回NULL.我查了数据库,所有项都有对应的值,不是NULL.百思不得其解,特请教各位...这是sql文件的一部分:DROP TABLE IF EXISTS `bbsuser`; CREATE TABLE `bbsuser`( `id` int(11) NOT NUL

pinovke-关于C#通过MySQLDriverCS 连接mysql在向表内添加值的时候出现的问题请教

问题描述 关于C#通过MySQLDriverCS 连接mysql在向表内添加值的时候出现的问题请教 C# 连接Mysql 读表建表都没问题,但是在调用 MySQLInsertCommand 方法时 提示出错:" PInvoke 函数"MySQLDriverCS!MySQLDriverCS.CPrototypes::mysql_real_escape_string"的调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配.请检查 PInvoke 签名

asp net mvc4-asp.net MVC4连接mysql

问题描述 asp.net MVC4连接mysql 本人asp.net菜鸟,想学mvc4框架,想请教一下在web.config里面配置mysql连接的问题:我的Models里只有一个文件shujuku.cs,里面代码: public class shujuku{public int ID { get; set; }public string Title { get; set; }public DateTime ReleaseDate { get; set; }public string Genre