程序功能:读数据表里某个字段为UnBack的数据,针对每一行数据,调用函数,将另一个字段的值发给对方,调用后将该字段值UnBack更新为BackSuccess,
想法有两个
1 通过datareader读数据,在read中循环调用函数,然后再执行更新的sqlcmd2通过dataadapter,将表填充到dataset的table中,建立循环调用函数,然后用adaper.update更新代码如下
try
{
SqlConnection RecordTableconn = new SqlConnection(@"Data Source=.\SQLExpress;Integrated Security=True;Database=RecordDataBase");
RecordTableconn.Open();//打开连接
string sql = "SELECT * FROM RecordTable WHERE BackRecord = '" + bdReturn.Ub + "' or BackRecord = '" + bdReturn.Bf + "'";//定义sql语句字符串:选择记录表中字段RecordStatus为Savesuccess的数据
//SqlDataAdapter recordAdapter = new SqlDataAdapter(sql, RecordTableconn);//建立DataAdapter
//DataSet recordDataset = new DataSet();//建立DataSet
//recordAdapter.Fill(recordDataset, "table");//adapter选中的数据填充到recordDataset中的table中
//int i = 0;
//for (i = 0; i < recordDataset.Tables["table"].Rows.Count; i++)
//{
// IPAddress ip = IPAddress.Parse(recordDataset.Tables["table"].Rows[i]["IPSource"].ToString());
// int port = (int)recordDataset.Tables["table"].Rows[i]["port"];
// int id = -(int)recordDataset.Tables["table"].Rows[i]["SendId"];
// backConnect(ip, port, id);//调用函数backConnect
// recordDataset.Tables["table"].Rows[i]["BackRecord"] = bdReturn.Bs;
// recordDataset.Tables["table"].Rows[i]["BackTime"] = DateTime.Now;
// recordAdapter.Update(recordDataset, "table");
//}
//RecordTableconn.Close();//关闭数据库连接
SqlCommand cmd = new SqlCommand(sql, RecordTableconn);//建立cmd
SqlDataReader recordReader = cmd.ExecuteReader();//建立dataReader
if (recordReader.HasRows)//reader中有数据
{
while (recordReader.Read())//循环读取
{
IPAddress ip = IPAddress.Parse(recordReader["IPSource"].ToString());
int port = (int)recordReader["Port"];
int id = -(int)recordReader["SendId"];
backConnect(ip, port, id);//调用函数dbOperation
recordReader.Close();//关闭dataReader
string sqlupdate = "UPDATE RecordTable SET BackTime ='" + DateTime.Now.ToString() + "' ,BackRecord='" + bdReturn.Bs + "'";
SqlCommand cmdupdate = new SqlCommand(sqlupdate, RecordTableconn);
cmdupdate.ExecuteNonQuery();
}
}
//recordReader.Close();//关闭dataReader
RecordTableconn.Close();//关闭数据库连接 formReturn.listboxReturn.Items.Add("返回成功!");
formReturn.listboxReturn.TopIndex = formReturn.listboxReturn.Items.Count - 1;//顶端显示最后一行
} catch
{
formReturn.listboxReturn.Items.Add("返回失败!");
formReturn.listboxReturn.TopIndex = formReturn.listboxReturn.Items.Count - 1;//顶端显示最后一行
Thread.Sleep(10000);
}其中被标记为注释的部分 为dataadapter方法,但是试验时提示 更新方法不对
未标记的那段 为datareader 试验时在执行更新的sqlcmd时 提示reader要关闭 ,但是关闭reader后还是有问题
问:使用哪种方法更合理?怎么修改来解决上述问题。
ps:还有更好的办法吗?这两个是我自己想的。datareader adapterSQL
想法有两个
1 通过datareader读数据,在read中循环调用函数,然后再执行更新的sqlcmd2通过dataadapter,将表填充到dataset的table中,建立循环调用函数,然后用adaper.update更新代码如下
try
{
SqlConnection RecordTableconn = new SqlConnection(@"Data Source=.\SQLExpress;Integrated Security=True;Database=RecordDataBase");
RecordTableconn.Open();//打开连接
string sql = "SELECT * FROM RecordTable WHERE BackRecord = '" + bdReturn.Ub + "' or BackRecord = '" + bdReturn.Bf + "'";//定义sql语句字符串:选择记录表中字段RecordStatus为Savesuccess的数据
//SqlDataAdapter recordAdapter = new SqlDataAdapter(sql, RecordTableconn);//建立DataAdapter
//DataSet recordDataset = new DataSet();//建立DataSet
//recordAdapter.Fill(recordDataset, "table");//adapter选中的数据填充到recordDataset中的table中
//int i = 0;
//for (i = 0; i < recordDataset.Tables["table"].Rows.Count; i++)
//{
// IPAddress ip = IPAddress.Parse(recordDataset.Tables["table"].Rows[i]["IPSource"].ToString());
// int port = (int)recordDataset.Tables["table"].Rows[i]["port"];
// int id = -(int)recordDataset.Tables["table"].Rows[i]["SendId"];
// backConnect(ip, port, id);//调用函数backConnect
// recordDataset.Tables["table"].Rows[i]["BackRecord"] = bdReturn.Bs;
// recordDataset.Tables["table"].Rows[i]["BackTime"] = DateTime.Now;
// recordAdapter.Update(recordDataset, "table");
//}
//RecordTableconn.Close();//关闭数据库连接
SqlCommand cmd = new SqlCommand(sql, RecordTableconn);//建立cmd
SqlDataReader recordReader = cmd.ExecuteReader();//建立dataReader
if (recordReader.HasRows)//reader中有数据
{
while (recordReader.Read())//循环读取
{
IPAddress ip = IPAddress.Parse(recordReader["IPSource"].ToString());
int port = (int)recordReader["Port"];
int id = -(int)recordReader["SendId"];
backConnect(ip, port, id);//调用函数dbOperation
recordReader.Close();//关闭dataReader
string sqlupdate = "UPDATE RecordTable SET BackTime ='" + DateTime.Now.ToString() + "' ,BackRecord='" + bdReturn.Bs + "'";
SqlCommand cmdupdate = new SqlCommand(sqlupdate, RecordTableconn);
cmdupdate.ExecuteNonQuery();
}
}
//recordReader.Close();//关闭dataReader
RecordTableconn.Close();//关闭数据库连接 formReturn.listboxReturn.Items.Add("返回成功!");
formReturn.listboxReturn.TopIndex = formReturn.listboxReturn.Items.Count - 1;//顶端显示最后一行
} catch
{
formReturn.listboxReturn.Items.Add("返回失败!");
formReturn.listboxReturn.TopIndex = formReturn.listboxReturn.Items.Count - 1;//顶端显示最后一行
Thread.Sleep(10000);
}其中被标记为注释的部分 为dataadapter方法,但是试验时提示 更新方法不对
未标记的那段 为datareader 试验时在执行更新的sqlcmd时 提示reader要关闭 ,但是关闭reader后还是有问题
问:使用哪种方法更合理?怎么修改来解决上述问题。
ps:还有更好的办法吗?这两个是我自己想的。datareader adapterSQL
你單步到dataadapter的update方法時能看到他所包含的sql命令,裏面的updatecommand應該是空的吧