C# 使用SqlCeConnection.Close()正在挂起应用程序
我正在开发一个WinFrom应用程序。我使用SDF数据库来存储数据。 下面将数据从数据库加载到datagrid的代码片段正在挂起应用程序。当我点击datagrid时, “在SqlResultSet关闭时调用方法Updateable的尝试无效,”引发异常C# 使用SqlCeConnection.Close()正在挂起应用程序,c#,winforms,sql-server-ce,C#,Winforms,Sql Server Ce,我正在开发一个WinFrom应用程序。我使用SDF数据库来存储数据。 下面将数据从数据库加载到datagrid的代码片段正在挂起应用程序。当我点击datagrid时, “在SqlResultSet关闭时调用方法Updateable的尝试无效,”引发异常 public partial class Form1 : Form { private SqlCeConnection _conn; public Form1() { InitializeComponent();
public partial class Form1 : Form
{
private SqlCeConnection _conn;
public Form1()
{
InitializeComponent();
_conn = new SqlCeConnection(@"Data Source = |DataDirectory|\Database1.sdf");
this.dataGridView1.AutoGenerateColumns = true;
}
private void Form1_Load(object sender, EventArgs e)
{
SqlCeCommand sqlcmd = new SqlCeCommand();
sqlcmd.Connection = _conn;
sqlcmd.CommandText = "SELECT ID, UserName FROM Table1";
_conn.Open();
SqlCeResultSet rs = sqlcmd.ExecuteResultSet(ResultSetOptions.Scrollable);
this.bindingSource1.DataSource = rs;
_conn.Close();
}
}
有人能调查一下吗?试试这个:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.dataGridView1.AutoGenerateColumns = true;
}
private void Form1_Load(object sender, EventArgs e)
{
using(SqlCeConnection _conn = new SqlCeConnection(@"Data Source = |DataDirectory|\Database1.sdf")){
_conn.Open();
SqlCeCommand sqlcmd = _conn.CreateCommand();
sqlcmd.CommandText = "SELECT ID, UserName FROM Table1";
SqlCeDataAdapter a = new SqlCeDataAdapter();
a.SelectCommand = sqlcmd;
DataTable t = new DataTable();
a.Fill(t);
this.bindingSource1.DataSource = t;
}
}
}
试试这个
public partial class Form1 : Form
{
private SqlCeConnection _conn;
public Form1()
{
InitializeComponent();
this.dataGridView1.AutoGenerateColumns = true;
}
private void Form1_Load(object sender, EventArgs e)
{
SqlCeDataReader rdr = null;
try
{
using(SqlCeConnection conn = new SqlCeConnection(@"Data Source = |DataDirectory|\Database1.sdf"))
{
conn.Open();
SqlCeCommand sqlcmd = new SqlCeCommand("SELECT ID, UserName FROM Table1", conn);
sqlcmd.Connection.Open();
rdr = sqlcmd.ExecuteReader();
//Custom Object is object with same structure as your data table
List<CustomObject> dataSource = new List<CustomObject>();
while (rdr.Read())
{
var customObject = new CustomObject();
customObject.Id = rdr.GetInt32(0);
//so on
dataSource.Add(customObject);
}
this.bindingSource1.DataSource = dataSource;
rdr.Close();
}
}
catch(Exception ex)
{
//Handle Exception
}
}
}
公共部分类表单1:表单
{
专用SqlCeConnection连接器;
公共表格1()
{
初始化组件();
this.dataGridView1.AutoGenerateColumns=true;
}
私有void Form1\u加载(对象发送方、事件参数e)
{
SqlCeDataReader rdr=null;
尝试
{
使用(SqlCeConnection conn=newsqlceconnection(@“数据源=|数据目录| \Database1.sdf”))
{
conn.Open();
SqlCeCommand sqlcmd=新的SqlCeCommand(“从表1中选择ID、用户名”,conn);
sqlcmd.Connection.Open();
rdr=sqlcmd.ExecuteReader();
//自定义对象是与数据表具有相同结构的对象
列表数据源=新列表();
while(rdr.Read())
{
var customObject=新的customObject();
customObject.Id=rdr.GetInt32(0);
//诸如此类
添加(customObject);
}
this.bindingSource1.DataSource=数据源;
rdr.Close();
}
}
捕获(例外情况除外)
{
//处理异常
}
}
}
你也可以查一下。您需要为直接绑定数据集保持连接打开。不要这样做,将其映射到某个局部对象并绑定该对象
希望这对您有用。使用SQLCE,您可以在程序启动时打开连接,并在程序关闭时进行处理。这种连接可以毫无问题地处理多个请求。SqlCeResultset的构思方式是直接查看数据库表,而不是将任何数据加载到内存中。因此,当你关闭你的连接时,没有地方可看,这就是它抱怨的原因。这就是为什么brano解决方案能够工作,因为数据是使用datatable加载到内存中的。在您的情况下,只需在form load上打开一个连接,然后在form close上关闭它。你不必进行大量的内存加载,我也不推荐这里介绍的两种解决方案(为什么要在内存中加载某个直接访问更快的内容?)。简单
public partial class Form1 : Form
{
private SqlCeConnection _conn;
public Form1()
{
InitializeComponent();
_conn = new SqlCeConnection(@"Data Source = |DataDirectory|\Database1.sdf");
this.dataGridView1.AutoGenerateColumns = true;
}
private void Form1_Load(object sender, EventArgs e)
{
SqlCeCommand sqlcmd = new SqlCeCommand();
sqlcmd.Connection = _conn;
sqlcmd.CommandText = "SELECT ID, UserName FROM Table1";
_conn.Open();
SqlCeResultSet rs = sqlcmd.ExecuteResultSet(ResultSetOptions.Scrollable);
this.bindingSource1.DataSource = rs;
//dont close the connection
// _conn.Close();
}
protected override Close()
{
if (_conn != null)
_conn.close();
base.Close()
}
}
如果我在评论_conn.Close();,它正在工作,datagrid正在加载数据。你能试试吗?嗨,Amar,ExecuteReader正在工作。非常感谢。ExecuteReader或SqlCeResultSet可以更快地处理大量记录?我认为SqlCeResultSet更快。但不确定。如果您绑定到SqlCeResultSet,则连接必须保持打开状态,因为它是针对数据库的活动游标。嗨,Erik,谢谢您提供的信息。还有一个疑问。ExecuteReader或SqlCeResultSet对于大量记录更快?使用状态将为您关闭它。它是否以与以前相同的方式挂起应用程序?什么时候挂起?Form1什么时候加载?是的。当Form1加载时,它将挂起。嗨。布拉诺。谢谢你的时间和支持。这是挂在Form1负载上的。正如Erik所说,我们无法处理/关闭连接。阿马尔的解决方案刚刚奏效。嗨,是的,我刚刚意识到。解决此问题的另一种方法是使用SqlCeDataAdapter,设置Selectcommand并将fill()函数与DataTable一起使用。这将删除ExecuteSultSet(),但您可能需要使用它。我已经修改了代码来说明SqlCeDataAdapter的用法。这是有效的。谢谢你的链接。我对代码做了一些修改。while(rdr.Read())之前分配的rdr=rs{