Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SqlCeConnection.Close()正在挂起应用程序_C#_Winforms_Sql Server Ce - Fatal编程技术网

C# 使用SqlCeConnection.Close()正在挂起应用程序

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();

我正在开发一个WinFrom应用程序。我使用SDF数据库来存储数据。 下面将数据从数据库加载到datagrid的代码片段正在挂起应用程序。当我点击datagrid时, “在SqlResultSet关闭时调用方法Updateable的尝试无效,”引发异常

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{