c#请教多线程同时操作数据库
c#请教多线程同时操作数据库
环境:c# WinForm Net2.0 SQL2005
用计时器刷新多个dataGridView取出值,多线程同时操作数据库,SQL有时会抛出各种异常错误。
在同一个WinForm界面,有8个Timer分别刷新8个dataGridView,目的是为了取出各自的Dgv是否有人在线。
然后,同时采用Socket通讯,收到消息时,判断如果有人在线,就操作SQL数据库。
在实际工作中Socket通讯非常频繁,同时又得及时判断是否有人在线,如果没有,不操作SQL,只通讯。如果有人在线还得读写SQL数据库。
这样一来就会发生各种各样的SQL错误,而且不是每次都出错,是不知道什么时候就出错抛出SQL异常。
因为,各个Socket收到各自的消息,就会去读写数据库,读写数据库都在同一个时间内了。而且各个Timer还在一直刷新数据库..撞车的机会非常大
我列出,SQL抛出各种错误异常:
第一种异常:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
第二种异常:阅读器关闭时 NextResult 的尝试无效。
第三种异常:ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。
第四种异常:ExecuteReader要求已打开且可用的连接.连接的当前状态为正在连接。
第五种异常:内部连接致命错误。
第六种异常:由于目标机器积极拒绝,无法连接。
第七种异常:当前命令发生了严重错误。应放弃任何可能产生的结果
第八种异常:无法运行请求,因为批处理已中止。这可能是由于从客户端发送的中止信号导致的;或者其他请求正在同一会话中运行,这会使会话处于忙状态。
第九种异常:从服务器接收结果时发生传输级错误。 (provider: SMux 提供程序, error: 20 - 连接已关闭。)
第十种异常:从服务器接收结果时发生传输级错误。 (provider: 会话提供程序, error: 19 - 物理连接不可用)
终究的问题就是,在多线程中同时操作数据库发生冲突了,请教各位有什么好方法解决!谢谢!
在同一个WinForm中有8个 dataGridView
//用计时器Timer1,定时4秒刷新dataGridView1
//用计时器Timer2,定时5秒刷新dataGridView2
请教各位有什么好方法解决多线程同时操作数据库导致各种异常问题,代码尽量写详细点,谢谢!
环境:c# WinForm Net2.0 SQL2005
用计时器刷新多个dataGridView取出值,多线程同时操作数据库,SQL有时会抛出各种异常错误。
在同一个WinForm界面,有8个Timer分别刷新8个dataGridView,目的是为了取出各自的Dgv是否有人在线。
然后,同时采用Socket通讯,收到消息时,判断如果有人在线,就操作SQL数据库。
在实际工作中Socket通讯非常频繁,同时又得及时判断是否有人在线,如果没有,不操作SQL,只通讯。如果有人在线还得读写SQL数据库。
这样一来就会发生各种各样的SQL错误,而且不是每次都出错,是不知道什么时候就出错抛出SQL异常。
因为,各个Socket收到各自的消息,就会去读写数据库,读写数据库都在同一个时间内了。而且各个Timer还在一直刷新数据库..撞车的机会非常大
我列出,SQL抛出各种错误异常:
第一种异常:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
第二种异常:阅读器关闭时 NextResult 的尝试无效。
第三种异常:ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。
第四种异常:ExecuteReader要求已打开且可用的连接.连接的当前状态为正在连接。
第五种异常:内部连接致命错误。
第六种异常:由于目标机器积极拒绝,无法连接。
第七种异常:当前命令发生了严重错误。应放弃任何可能产生的结果
第八种异常:无法运行请求,因为批处理已中止。这可能是由于从客户端发送的中止信号导致的;或者其他请求正在同一会话中运行,这会使会话处于忙状态。
第九种异常:从服务器接收结果时发生传输级错误。 (provider: SMux 提供程序, error: 20 - 连接已关闭。)
第十种异常:从服务器接收结果时发生传输级错误。 (provider: 会话提供程序, error: 19 - 物理连接不可用)
终究的问题就是,在多线程中同时操作数据库发生冲突了,请教各位有什么好方法解决!谢谢!
private DataSet ds1 = new DataSet();//设置为ds
private DataSet ds2 = new DataSet();//设置为ds
private SqlDataAdapter da1;//设置为da
private SqlDataAdapter da2;//设置为da
//...ds3 4 5 6.. da3 4 5 6....
String ZU1_h1,ZU1_h2,ZU1_h3,ZU1_h4,ZU1_h5,ZU1_h6;//取出dataGridView1某列N行的值
String ZU2_h1,ZU2_h2,ZU2_h3,ZU2_h4,ZU2_h5,ZU2_h6;//取出dataGridView2某列N行的值
//.......
Socket Sokt1;//定义一个Socket类的对象
Socket Sokt2;//定义一个Socket类的对象
//.....
Thread th1;//定义一个Thread类的对象,进程
Thread th2;//定义一个Thread类的对象,进程
//.....在同一个WinForm中有8个 dataGridView
private void FormMain_Load(object sender, EventArgs e)
{
try
{
string sql1 = "Select * From biao Where Crew=1 order by Code asc";
da1 = new SqlDataAdapter(sql1, Conn.rs);
da1.Fill(ds1, "ZU1");
Dgv1.DataSource = ds1.Tables["ZU1"];
}
catch (Exception excha1)
{
//..
}
finally
{
Conn.rs.Close();
}
Thread.Sleep(50);
try
{
string sql2 = "Select * From biao Where Crew=2 order by Code asc";
da2 = new SqlDataAdapter(sql2, Conn.rs);
da2.Fill(ds2, "ZU2");
Dgv2.DataSource = ds2.Tables["ZU2"];
}
catch (Exception excha2)
{
//..
}
finally
{
Conn.rs.Close();
}
//sql3 4 5 6.... ZU3 4 5 6...
}//用计时器Timer1,定时4秒刷新dataGridView1
private void Timer1_Tick(object sender, EventArgs e)
{
ds1.Tables["ZU1"].Clear();
da1.Fill(ds1, "ZU1");
ZU1_h1 = Dgv1.Rows[0].Cells["Code1"].Value.ToString().Trim();//Dgv第一行
ZU1_h2 = Dgv1.Rows[1].Cells["Code1"].Value.ToString().Trim();//Dgv第二行
ZU1_h3 = Dgv1.Rows[2].Cells["Code1"].Value.ToString().Trim();//Dgv第三行
ZU1_h4 = Dgv1.Rows[3].Cells["Code1"].Value.ToString().Trim();//Dgv第四行
ZU1_h5 = Dgv1.Rows[4].Cells["Code1"].Value.ToString().Trim();//Dgv第五行
ZU1_h6 = Dgv1.Rows[5].Cells["Code1"].Value.ToString().Trim();//Dgv第六行
}//用计时器Timer2,定时5秒刷新dataGridView2
private void Timer2_Tick(object sender, EventArgs e)
{
ds2.Tables["ZU2"].Clear();
da2.Fill(ds2, "ZU2");
ZU2_h1 = Dgv2.Rows[0].Cells["Code2"].Value.ToString().Trim();//Dgv第一行
ZU2_h2 = Dgv2.Rows[1].Cells["Code2"].Value.ToString().Trim();//Dgv第二行
ZU2_h3 = Dgv2.Rows[2].Cells["Code2"].Value.ToString().Trim();//Dgv第三行
ZU2_h4 = Dgv2.Rows[3].Cells["Code2"].Value.ToString().Trim();//Dgv第四行
ZU2_h5 = Dgv2.Rows[4].Cells["Code2"].Value.ToString().Trim();//Dgv第五行
ZU2_h6 = Dgv2.Rows[5].Cells["Code2"].Value.ToString().Trim();//Dgv第六行
}
//定时刷新...共8个dataGridView
//定义多线程1
private void BeginListen1()//接收发送连接
{
IPAddress ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];//获取本机IP
IPEndPoint ipe = new IPEndPoint(ip, 10000);//实例化一个服务器端指定端口的IPEndPoint
Sokt1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个套接字的TCP/IP
try
{
Sokt1.Bind(ipe);//将套接字绑定到本地端点
Sokt1.Listen(390);//侦听传入的连接,允许最大连接数
//循环接收并处理数据
while (true)
{
Socket skt = Sokt1.Accept();//在等待一个传入的连接
skt.ReceiveTimeout = 6000;//接收超时,n毫秒
Byte[] by = new Byte[80];//定义接收字节数组,接收长度
Int32 byRec = skt.Receive(by);//接收数据int
String data = Encoding.ASCII.GetString(by, 0, byRec);//收到的数据
//取值
String Hang1 = ZU1_h1;
String Hang1 = ZU1_h2;
String Hang1 = ZU1_h3;
String Hang1 = ZU1_h4;
String Hang1 = ZU1_h5;
String Hang1 = ZU1_h6;
if (Hang1.Length != 0)//Dgv第一行,有人在线
{
try
{
Int32 result = 0;
string sql = string.Format("Update Abiao Set Code='" + ZU1_h1 + "' Where ID=1");
SqlCommand cmd = new SqlCommand(sql, Conn.rs);
Conn.rs.Open();
result = cmd.ExecuteNonQuery();
if (result < 1)
{
new SqlCommand("Update Bbiao Set Code='' Where BLie='" + ZU1_h1 + "'", Conn.rs).ExecuteNonQuery();
}
else
{
new SqlCommand("Insert Into Cbiao (Code)values('" + ZU1_h1 + "')", Conn.rs).ExecuteNonQuery();
}
}
catch (Exception ex)
{
//...
}
finally
{
Conn.rs.Close();
}
}
Thread.Sleep(15);//多线程延迟N毫秒
skt.Shutdown(SocketShutdown.Both);//发送和接收,二者都结束
skt.Close();//关闭连接
}
}
catch (Exception ex)
{
//...
}
}
//定义多线程2
private void BeginListen2()//接收发送连接
{
//......
}
//定义多线程2 4 5 6......//点击按钮启动线程1
private void btnStart1_Click(object sender, EventArgs e)
{
th1 = new Thread(new ThreadStart(BeginListen1));//创建一个新的线程专门用于处理监听
th1.IsBackground = true;
th1.Start();//启动线程
}
//点击按钮启动线程2
private void btnStart2_Click(object sender, EventArgs e)
{
th2 = new Thread(new ThreadStart(BeginListen2));//创建一个新的线程专门用于处理监听
th2.IsBackground = true;
th2.Start();//启动线程
}
//点击按钮启动线程2 4 5 6.......请教各位有什么好方法解决多线程同时操作数据库导致各种异常问题,代码尽量写详细点,谢谢!
...全文
相关推荐
c# 读取串口写入数据库
用c#编写的winform程序,读取串口的数据,并写入本地的sqlite数据库,同时写入SQLServer网络数据库,这个过程都是多线程的。
C# WinForm打字小游戏开发教程
C#(读作“C Sharp”)是由微软公司设计的一种现代、面向对象的编程语言,是.NET框架的核心语言之一。它继承了C和C++的语法风格,同时加入了类型安全、内存管理和异常处理等特性。C#广泛应用于开发各种类型的应用程序,从桌面应用到移动开发,再到云计算服务,C#都显示出了其强大的生命力。WinForm是.NET框架中用于快速开发Windows窗体应用程序的一个库。它允许开发者通过拖放控件来设计图形用户界面(GUI),并为这些控件添加事件处理程序,使得用户可以与应用程序交互。
C# 力控 ForceControl V7.1安装包和DB数据通信示例.zip
C#和力控数据的访问示例,可是使用力控提供的标准com组件进行通信。实现起来比较容易。
C#多线程连接mysql,Access
C#多线程连接mysql,Access并且比较两者的性能vs2008 Cs3.5
C# 多线程 自定义窗体 读取VF数据库
多线程实现内部逻辑,运行时窗体可响应其它消息。 读取并处理理VF数据,输出Excel用的csv格式文件。


