110,533
社区成员
发帖
与我相关
我的任务
分享
若要创建 SqlDataReader,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不要直接使用构造函数。
在使用 SqlDataReader 时,关联的 SqlConnection 正忙于为 SqlDataReader 服务,对 SqlConnection 无法执行任何其他操作,只能将其关闭。除非调用 SqlDataReader 的 Close 方法,否则会一直处于此状态。例如,在调用 Close 之前,无法检索输出参数。
SqlDataReader 的用户可能会看到在读取数据时另一进程或线程对结果集所做的更改。但是,确切的行为与执行时间有关。
当 SqlDataReader 关闭后,只能调用 IsClosed 和 RecordsAffected 属性。尽管当 SqlDataReader 存在时可以访问 RecordsAffected 属性,但是请始终在返回 RecordsAffected 的值之前调用 Close,以保证返回精确的值。
using System;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication2
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int i = 0;
string myConnectionString = "Server=.;database=hq2;uid=sa;pwd=";
string TimeString, CommandTime;
SqlConnection myConnection = new SqlConnection(myConnectionString);
myConnection.Open();
SqlCommand myCommand = myConnection.CreateCommand();
TimeString = "select ValueID,TimeStamp,RealValue,sn from tag ";
SqlDataAdapter adapter = new SqlDataAdapter(TimeString, myConnection);
DataSet ds = new DataSet();
adapter.Fill(ds);
//查看状态
Console.WriteLine("Flag {0} \n", ds.Tables[0].Rows.Count);
if (ds.Tables[0].Rows.Count > 0)
{
foreach (DataRowView drv in ds.Tables[0].DefaultView)
{
if ((int)drv["ValueID"] == 14)
{
TimeString = drv["TimeStamp"].ToString();
CommandTime = "update tag set sn=" + i.ToString() + " where TimeStamp==" + "'" + TimeString + "'" + " and ValueID=14";
myCommand.Connection = myConnection;
myCommand.CommandText = CommandTime;
//下面这条语句不能执行,提示“已有打开的与此连接相关联的 DataReader,必须首先将它关闭。”要怎么办呢?怎样才能实现更新?
myCommand.ExecuteNonQuery();
i++;
//查看命令文本
Console.WriteLine("Done! \n {0}", myCommand.CommandText);
}
}
}
myConnection.Close();
Console.WriteLine(" \n i= {0} \nDone!Press Enter key to exit! \n", i);
Console.Read();
}
}
}