大家好!我有一个GridView控件,需要自定义删除的sql语句为一个名为DeleteUser的存储过程,该过程通过获取OnRowDeleting事件中传入的e.RowIndex的UserId字段的值来确定删除的行,该UserId字段是一个uniqueidentifier属性的字段
sqlDataSource数据源的代码如下:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                    ConnectionString="<%$ ConnectionStrings:sper_lvyouConnectionString1 %>" 
                    SelectCommand="
      SELECT a.UserId,a.UserName, b.Password, b.Email, b.PasswordQuestion,b.PasswordAnswer, b.CreateDate
    FROM dbo.aspnet_Users as a INNER JOIN
      dbo.aspnet_Membership as b ON b.UserId = a.UserId
    ORDER By 
       b.CreateDate desc" DeleteCommand="DeleteUser" OnDeleting="SqlDataSource1OnDeleting" DeleteCommandType="StoredProcedure">
                    
<%--       
       </asp:SqlDataSource>
   
code=C#]
    protected  void GridView1OnRowDeleting(Object sender,GridViewDeleteEventArgs e) 
    {
        ViewState["UserId"] = GridView1.Rows[e.RowIndex].Cells[0];
    }
    protected  void SqlDataSource1OnDeleting(Object sender,SqlDataSourceCommandEventArgs e) 
    {
        SqlParameter deleteKey = new SqlParameter("@UserId", SqlDbType.UniqueIdentifier);
   //     deleteKey.Value = (Guid)ViewState["UserId"];
        e.Command.Parameters.Add(deleteKey);
    //    e.Command.Parameters["@UserId"].Value = ViewState["UserId"].ToString();
        
    }[[/code]存储过程:
CREATE PROCEDURE [dbo].[DeleteUser] 
@UserId uniqueidentifier
AS
BEGIN
Delete From dbo.aspnet_Membership Where [UserId]=@UserId
Delete From dbo.aspnet_Users Where [UserId]=@UserId
END
GO哪位高人对我所说的情况比较清楚,忘指点一二,客户逼着要交货,着急ing

解决方案 »

  1.   

    额,刚才没有说清楚,CSDN竟然不允许维护自己发的帖子,汗~~,该段代码最主要的问题是在类型转换上,deleteKey.Value = (Guid)ViewState["UserId"]; 这句,总是无法将uniqueidentifier转化为合适的数据类型
      

  2.   

    如果ViewState["UserId"]的值是空值(DBNull.Value)可能就出这种错误了。试着这样做一下:if (ViewState["UserId"] is Guid)
    {
        deleteKey.Value = (Guid)ViewState["UserId"]; 
    }
      

  3.   

    看看ViewState["UserId"]是什么值,可不可以转成GUID
      

  4.   

    回楼上的,主要的问题是无法将viewState["UserId"]的值转化为一个Guid对象
      ViewState["UserId"] = GridView1.Rows[e.RowIndex].Cells[0].ToString()只能保留文本无法将其抓换为Guid对象
      

  5.   

    ViewState["UserId"] = GridView1.Rows[e.RowIndex].Cells[0];
    你的这句话问题。
    ViewState["UserId"]里面存放的是cells对象。
      

  6.   

    回复楼上的
    我这样写:
    ViewState["UserId"] = (Guid)GridView1.Rows[e.RowIndex].Cells[0];出错
    无法将类型“System.Web.UI.WebControls.TableCell”转换为“System.Guid”
    该怎么办啊?求救啊!
      

  7.   

    你应该用datatable的字段转换为guid。也就是说和gridview1绑定的datatable
      

  8.   

    回楼上的,我用的是sqldatasource,怎么获取绑定的datatable?翻了半天msdn也没找到啊
      

  9.   

    关键是看你的值是什么类型的,如果是字符串类型的且能正确的表示为Guid的字符串形式,可以使用 new Guid(strng)来获取这个GUID,如果是不可以表示为Guid的字符串,那怎样都是不能转换的。
      

  10.   

    如果你的值是正确的Guid格式,是可以转的。11楼的也说了
      

  11.   

    楼上的,我这样写:   
     protected  void GridView1OnRowDeleting(Object sender,GridViewDeleteEventArgs e) 
        {
            ViewState["UserId"] = GridView1.Rows[e.RowIndex].Cells[0].ToString();
        }
        protected  void SqlDataSource1OnDeleting(Object sender,SqlDataSourceCommandEventArgs e) 
        {
            SqlParameter deleteKey = new SqlParameter("@UserId", SqlDbType.UniqueIdentifier);
            deleteKey.Value = new Guid(ViewState["UserId"].ToString());
            e.Command.Parameters.Add(deleteKey);
            
        }
    结果还是不行啊:
    Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
    我的GridView是这样的:                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                        DataSourceID="SqlDataSource1" AllowPaging="True" AllowSorting="True"   
                        AutoGenerateDeleteButton="true" OnRowDeleting="GridView1OnRowDeleting">
                        <Columns>
                        <asp:BoundField DataField="UserId" HeaderText="UserId" 
                                SortExpression="UserId" />
                            <asp:BoundField DataField="UserName" HeaderText="UserName" 
                                SortExpression="UserName" />
                            <asp:BoundField DataField="Password" HeaderText="Password" 
                                SortExpression="Password" />
                            <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
                            <asp:BoundField DataField="PasswordQuestion" HeaderText="PasswordQuestion" 
                                SortExpression="PasswordQuestion" />
                            <asp:BoundField DataField="PasswordAnswer" HeaderText="PasswordAnswer" 
                                SortExpression="PasswordAnswer" />
                            <asp:BoundField DataField="CreateDate" HeaderText="CreateDate" 
                                SortExpression="CreateDate" />
                       
                        </Columns>
                    </asp:GridView>