初试存储过程返回记录集出错:
  未处理的“System.Exception”类型的异常出现在 system.windows.forms.dll 中。
  其他信息: 复杂的 DataBinding 接受 IList 或 IListSource 作为数据源
有关的代码:
    MainFrm n=(MainFrm)MainFrm.ActiveForm;
      System.Data.SqlClient.SqlConnection b=n.sqlConnection1;
     
      SqlCommand scm=new SqlCommand();
      scm.Connection=b;
      scm.CommandType=CommandType.StoredProcedure ;
      scm.CommandText="query_client_base";
      //存储过程的参数
      SqlParameter Sp= scm.Parameters.Add(
        "@czydm",SqlDbType.Char ,4,"1111");
      Sp.Value="1111";
      Sp= scm.Parameters.Add(
        "@clientid",SqlDbType.Int,4);
      Sp.Value=0;
      Sp= scm.Parameters.Add(
        "@flagp",SqlDbType.TinyInt,4);
      Sp.Value=127;
      Sp= scm.Parameters.Add(
        "@flagsale",SqlDbType.SmallInt,4);
      Sp.Value=127;
       Sp= scm.Parameters.Add(
        "@clientcode",SqlDbType.Char,4);
      Sp.Value="";
      Sp= scm.Parameters.Add(
        "@clientname",SqlDbType.Char,4);
      Sp.Value="";
      Sp= scm.Parameters.Add(
        "@areacode",SqlDbType.SmallInt ,4);
      Sp.Value=255;
       Sp= scm.Parameters.Add(
        "@supplycode",SqlDbType.Char,4);
      Sp.Value="";
       Sp= scm.Parameters.Add(
        "@rolesy",SqlDbType.Int ,4);
      Sp.Value=127;
       Sp= scm.Parameters.Add(
        "@rolecy",SqlDbType.Int,4);
      Sp.Value=127;      scm.Connection=b;
      SqlDataReader Dr=scm.ExecuteReader() ;
      Em.DataSource=Dr;

解决方案 »

  1.   

    DataGridView 类支持标准的 Windows 窗体数据绑定模型。这意味着数据源可以是实现下列接口之一的任何类型:IList 接口,包括一维数组。IListSource 接口,例如,DataTable 和 DataSet 类。IBindingList 接口,例如,BindingList 类。IBindingListView 接口,例如,BindingSource 类。你把DataReader作为DataGridView的数据源,当然出错了。
    其实可以用比较方便的方法,就是在“数据集设计器”中用创建“TableAdapter”的方法建立一个datatable。然后之间把它拉到Winform中就可以了。
      

  2.   

    请教:
    在“数据集设计器”中用创建“TableAdapter”的方法建立一个datatable这个怎么弄?或提供相关网址?
      

  3.   

    下面一大段是从MSDN搬过来的,希望能帮到你。创建新的 Windows 应用程序
    第一步是创建一个 Windows 应用程序。创建新的 Windows 应用程序项目
    在 Visual Studio 中,从“文件”菜单创建一个新项目。 在“项目类型”窗格中选择一种编程语言。在“模板”窗格中单击“Windows 应用程序”。将项目命名为 TableAdapterQueriesWalkthrough,然后单击“确定”。 Visual Studio 随即将该项目添加到“解决方案资源管理器”,并在设计器中显示一个新窗体。 使用 TableAdapter 创建数据库数据源
    此步骤使用“数据源配置向导”创建基于 Northwind 示例数据库中 Customers 表的数据源。必须具有访问 Northwind 示例数据库的权限才能创建连接。有关设置 Northwind 示例数据库的信息,请参见如何:安装示例数据库。创建数据源
    在“数据”菜单上单击“显示数据源”。在“数据源”窗口中,选择“添加新数据源”,启动“数据源配置向导”。在“选择数据源类型”页上选择“数据库”,然后单击“下一步”。在“选择您的数据连接”页面上执行下列操作之一: 如果下拉列表中包含到 Northwind 示例数据库的数据连接,请选择该连接。 - 或 -选择“新建连接”,以启动“添加/修改连接”对话框。有关更多信息,请参见“添加/修改连接”对话框(通用)。如果数据库需要密码,请选择该选项以包括敏感数据,再单击“下一步”。在“将连接字符串保存到应用程序配置文件”页面上单击“下一步”。在“选择数据库对象”页面上展开“表”节点。选择“Customers”表,然后单击“完成”。“NorthwindDataSet”即被添加到您的项目中,并且“数据源”窗口中出现“Customers”表。在数据集设计器中打开数据集
    在“数据集设计器”中打开数据集
    在“数据源”窗口中右击 NorthwindDataset。在快捷菜单上,选择“使用设计器编辑数据集”。NorthwindDataset 在“数据集设计器”中打开。向 CustomersTableAdapter 中添加第二个查询
    向导通过 Customers 数据表和 CustomersTableAdapter 创建数据集。本节演练将向 CustomersTableAdapter 添加第二个查询。向 CustomersTableAdapter 添加查询
    将一个“查询”从“工具箱”的“数据集”选项卡拖动到“Customers”表。TableAdapter 查询配置向导将打开。选择“使用 SQL 语句”,然后单击“下一步”。选择“选择(返回行)”,然后单击“下一步”。向该查询添加一个 WHERE 子句,结果为:  复制代码 
    SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax 
    FROM Customers 
    WHERE City = @City
     
    注意 
    如果正在使用 Access 版的 Northwind,则请使用问号替换 @City 参数。 (SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax FROM Customers WHERE City = ?)
     在“选择要生成的方法”页上,将“填充 DataTable”方法命名为 FillByCity。注意 
    本演练中未使用“返回 DataTable”方法,因此可以清除该复选框或使用默认名称。
     单击“下一步”完成该向导。FillByCity 查询即被添加到 CustomersTableAdapter。在窗体上添加执行其他查询的代码
    执行查询
    在“解决方案资源管理器”中选择“Form1”,然后单击“视图设计器”。将“Customers”节点从“数据源”窗口拖动到“Form1”上。通过从“视图”菜单选择“代码”更改为代码视图。用下面运行 FillByCity 查询的代码替换 Form1_Load 事件处理程序中的代码。Visual Basic  复制代码 
    Dim cityValue As String = "Seattle"
    CustomersTableAdapter.FillByCity(NorthwindDataSet.Customers, cityValue) 
    C#  复制代码 
    string cityValue = "Seattle";
    customersTableAdapter.FillByCity(northwindDataSet.Customers, cityValue); 
    J#  复制代码 
    String cityValue = "Seattle";
    northwindDataSetCustomersTableAdapter.FillByCity(northwindDataSet.get_Customers(), cityValue); 
    运行应用程序
    运行应用程序
    按 F5。网格将由 City 值为 Seattle 的客户进行填充。
      

  4.   

    up---------------------------------------------------------------------------------------------
    腰缠70元到月入近10万
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=453IT工程师 毕业4年我年薪涨到30万 
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=51126岁青年坐拥千万域名资产 从小玩家变成CEO 
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=515程序员的酸甜苦辣:告别Coding 
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=341从月薪3500到700万(一)
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=170网络草根月赚3000的十种方法
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=517如果我是女的 我肯定不会嫁给做网站的
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=512
      

  5.   

    建一个dataset,结果放到dataset里,然后绑定。
      

  6.   

    我也遇到同样的问题,有没有详细点的代码啊?特别是用手工绑定DataGrid 的,看了上面的介绍后还是云里雾里啊求高手相助
      

  7.   

    SqlDataReader Dr=scm.ExecuteReader() ;
          Em.DataSource=Dr;-------------------
    这2句话有问题,应为SqlDataReader是以流式返回数据库数据的,所以是不会从IList或IListSource派生来的,因此不能绑定成功。你把SqlDataReader换成DataSet就行了