C# Executereader和ExecuteNon query在ado.net中的单个连接中执行
下面的代码段在同一连接字符串中使用多个查询。首先,我从数据库中选择一些数据,然后在关闭datareader(dr)之前,我想做一些验证,如果满足,我将在dr的while循环中将这些值插入数据库中的表中。在那里,我得到了错误,因为已经有一个打开的datareader,所以在关闭它之前我不能使用另一个查询。因此,我临时使用了指向同一数据库的另一个连接字符串,并使用该连接对象(conn1)执行insert qry。但是wat是另一种不使用其他连接字符串的方法。 任何帮助都将不胜感激。ThxC# Executereader和ExecuteNon query在ado.net中的单个连接中执行,c#,sql-server-2008,ado.net,connection-string,sqldatareader,C#,Sql Server 2008,Ado.net,Connection String,Sqldatareader,下面的代码段在同一连接字符串中使用多个查询。首先,我从数据库中选择一些数据,然后在关闭datareader(dr)之前,我想做一些验证,如果满足,我将在dr的while循环中将这些值插入数据库中的表中。在那里,我得到了错误,因为已经有一个打开的datareader,所以在关闭它之前我不能使用另一个查询。因此,我临时使用了指向同一数据库的另一个连接字符串,并使用该连接对象(conn1)执行insert qry。但是wat是另一种不使用其他连接字符串的方法。 任何帮助都将不胜感激。Thx publi
public XmlDocument LBS_Offer_Scheduler(string dev_token, float lat, float llong)
{
XmlDocument xml_doc = null;
bool result = false;
int row_affect = 0;
int x = (int)Math.Truncate(lat);
int y = (int)Math.Truncate(llong);
string qry = "select Store_id,Store_Latitude,Store_Longitude from tbl_FB_Store_Details where Store_Latitude like '"
+ x + "%' and Store_Longitude like '" + y + "%'";
conn.Open();
cmd = new SqlCommand(qry, conn);
dr = cmd.ExecuteReader();
while (dr.Read())
{
Store_Id = dr[0].ToString();
str_dlat = dr[1].ToString();
str_dlon = dr[2].ToString();
double dlat = Convert.ToDouble(str_dlat);
double dlon = Convert.ToDouble(str_dlon);
dist_in_sqmts = obj_distance.distance(lat, llong, dlat, dlon);
id = Convert.ToInt32(Store_Id);
if (dist_in_sqmts < 200.00)
{
string insert_qry = "insert into tbl_FB_Offer_PushNote values('" + dev_token + "', "+ id + ",'" + DateTime.Now + "','N')";
conn1.Open();
cmd = new SqlCommand(insert_qry, conn1);
row_affect = cmd.ExecuteNonQuery();
conn1.Close();
}
}
conn.Close();
if (row_affect > 0)
result = true;
xml_doc = x_doc.result(result);
return xml_doc;
}
public-XmlDocument-LBS\u-Offer\u调度程序(string-dev\u-token、float-lat、float-llong)
{
XmlDocument xml_doc=null;
布尔结果=假;
int row_impact=0;
int x=(int)数学截断(lat);
int y=(int)Math.Truncate(llong);
string qry=“从tbl\U FB\U Store\U详细信息中选择Store\U id、Store\U纬度、Store\U经度,其中Store\U LATIONE like'”
+x+“%”并将_经度存储为“+y+”%”;
conn.Open();
cmd=新的SqlCommand(qry,conn);
dr=cmd.ExecuteReader();
while(dr.Read())
{
Store_Id=dr[0]。ToString();
str_dlat=dr[1].ToString();
str_dlon=dr[2].ToString();
double dlat=Convert.ToDouble(str_dlat);
double dlon=Convert.ToDouble(str_dlon);
距离(lat、llong、dlat、dlon);
id=转换为32(存储id);
如果(距离平方米<200.00)
{
string insert_qry=“insert into tbl_FB_Offer_PushNote值(“+dev_token+”,“+id+”,“+DateTime.Now+”,“N”);
conn1.Open();
cmd=新的SqlCommand(插入命令,conn1);
行\u impact=cmd.ExecuteNonQuery();
conn1.Close();
}
}
康涅狄格州关闭();
如果(行影响>0)
结果=真;
xml_doc=x_doc.result(结果);
返回xml\u文档;
}
您必须使用DataSet
class-SqlDataAdapter
和DataTable
从数据库检索结果
string qry = "select Store_id,Store_Latitude,Store_Longitude
from tbl_FB_Store_Details where Store_Latitude
like @x and Store_Longitude like @y";
SqlCommand cmd=new SqlCommand(qry,conn);
cmd.Parameters.AddWithValue("@x", x + "%");
cmd.Parameters.AddWithValue("@y", y + "%");
SqlDataAdapter adp=new SqlDataAdapter(cmd);
DataTable dt=new DataTable();
adp.Fill(dt);
foreach(DataRow dr in dt.Rows)
{
Store_Id = dr[0].ToString();
str_dlat = dr[1].ToString();
str_dlon = dr[2].ToString();
double dlat = Convert.ToDouble(str_dlat);
double dlon = Convert.ToDouble(str_dlon);
dist_in_sqmts = obj_distance.distance(lat, llong, dlat, dlon);
id = Convert.ToInt32(Store_Id);
if (dist_in_sqmts < 200.00)
{
.....
}
}
string qry=“选择门店id、门店纬度、门店经度
来自tbl\U FB\U门店的详细信息门店所在地
像@x一样存储经度像@y”;
SqlCommand cmd=新的SqlCommand(qry,conn);
cmd.Parameters.AddWithValue(“@x”,x+“%”);
cmd.Parameters.AddWithValue(“@y”,y+“%”);
SqlDataAdapter adp=新的SqlDataAdapter(cmd);
DataTable dt=新的DataTable();
自动进料(dt);
foreach(数据行dr在dt.行中)
{
Store_Id=dr[0]。ToString();
str_dlat=dr[1].ToString();
str_dlon=dr[2].ToString();
double dlat=Convert.ToDouble(str_dlat);
double dlon=Convert.ToDouble(str_dlon);
距离(lat、llong、dlat、dlon);
id=转换为32(存储id);
如果(距离平方米<200.00)
{
.....
}
}
您需要在连接字符串中设置MultipleActiveResultSets=True。
请参见good insight。这不能在datareader中完成吗?cos使用datatable和dataset使得编码不那么令人信服。MultipleActiveResultSets让我的工作轻松多了。但这会减缓进程吗?我猜!在CLR过程中使用“context connection=true”时,不能使用MARS: