关于多线程查询数据库的问题!
还是一个关于多线程查询数据库出现多个线程查出同一条记录的的问题。
表里本身有个字段,就是判断是否被查询过的。查询过的后的字段被改为false,就不再查询。
但是发觉还是一样,比如用了3线程,同一条记录还是被查处三次。
示例如下:
首先在form1类中
private static void createThread()
{
for (int b = 0; b < 3; b++)
{
Thread thread = new Thread(new ThreadStart(sendMessage));
thread.IsBackground = true;
thread.Name = b.ToString();
thread.Start();
}
}
private static void sendMessage()
{
GetData getdata = new GetData();
Record record = getdata.getNotSendMessage();
...
...
//这里面有数个需要查询不同表的数据,都是getdata这个类中的方法
Thread.Sleep(500);
sendMessage();
}
//GetData类中:
public Record getNotSendMessage()
{
string sql = "getNotSendMessage";
SqlDataReader reader = null;
try
{
DBHelper dbhelp = new DBHelper();
reader = dbhelp.ExecuteProcSelect(sql);
if (reader.Read())
{
Record record = new Record();
...
...
reader.Close();
return record;
}
reader.Close();
dbhelp.closeConnection();
return null;
}
catch (Exception e)
{
...
...
}
}
...
... //也是数个查询方法
//DBHelper 类中
public SqlConnection Connection
{
get
{
string connectionString ="数据库连接语句";
if (connection == null)
{
connection = new SqlConnection(connectionString);
connection.Open();
}
else if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
else if (connection.State ==ConnectionState.Broken)
{
connection.Close();
connection.Open();
}
return connection;
}
}
public void closeConnection()
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
else if (connection.State == System.Data.ConnectionState.Broken)
{
connection.Close();
}
}
public SqlDataReader ExecuteProcSelect(string procName, params SqlParameter[] values)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = Connection;
cmd.CommandText = procName;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(values);
SqlDataReader sdr = cmd.ExecuteReader();
return sdr;
}
...
...
现在主要的是sendMessage所有方法获取数据库中的数据如何让其不重复读取一条,
我试过用用lock都还是不行,在下很少用到线程..所请各位前辈帮帮忙!