C# 填充GridView时将数据类型varchar转换为浮点时出错

C# 填充GridView时将数据类型varchar转换为浮点时出错,c#,asp.net,C#,Asp.net,根据文本框中的数字数据,我用以下代码填充GridView并单击按钮。 但它给出了以下错误。 将数据类型varchar转换为float时出错。 因为我的数据库列“matri_perct”的数据类型为“float” protected void Button1_Click(object sender, EventArgs e) { try { con = new SqlConnection(ConfigurationManager.Co

根据文本框中的数字数据,我用以下代码填充GridView并单击按钮。 但它给出了以下错误。 将数据类型varchar转换为float时出错。 因为我的数据库列“matri_perct”的数据类型为“float”

protected void Button1_Click(object sender, EventArgs e)
    {
        try
        {
            con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL Connection String"].ConnectionString);con.Open();
        com = new SqlCommand("SELECT * FROM stdtable WHERE matri_perct >  @Percent", con);
        com.Parameters.AddWithValue("Percent", float.Parse(txtPercent.Text));
        com.ExecuteNonQuery();
            SqlDataAdapter dataadapter = new SqlDataAdapter();
            DataSet ds = new DataSet();
            dataadapter.Fill(ds, "Data");
            GridView1.DataSource = ds;
            GridView1.DataMember = "Data";
            con.Close();
        }
        catch (System.Exception err)
        {
            Label1.Text = err.Message.ToString();
        }
    }
我的GridView.aspx代码声明为

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="univ_regno" DataSourceID="" EnableModelValidation="True">
    <Columns>
        <asp:BoundField DataField="school" HeaderText="School" 
            SortExpression="school" />
        <asp:BoundField DataField="univ_regno" HeaderText="Univ R.No." ReadOnly="True" 
            SortExpression="univ_regno" />
        <asp:BoundField DataField="colge_rollno" HeaderText="Coll. R.No." 
            SortExpression="colge_rollno" />
        <asp:BoundField DataField="branch" HeaderText="Branch" 
            SortExpression="branch" />
        <asp:BoundField DataField="sem" HeaderText="Sem" SortExpression="sem" />
        <asp:BoundField DataField="name" HeaderText="Name" SortExpression="name" />
        <asp:BoundField DataField="f_name" HeaderText="F.Name" 
            SortExpression="f_name" />
        <asp:BoundField DataField="date_birth" HeaderText="DOB" 
            SortExpression="date_birth" />

        <asp:BoundField DataField="mob" HeaderText="Mobile" 
            SortExpression="mob" />
        <asp:BoundField DataField="email" HeaderText="E-mail" SortExpression="email" />
        <asp:BoundField DataField="matri_perct" HeaderText="Matric %" 
            SortExpression="matri_perct" />
        <asp:BoundField DataField="intermed_perct" HeaderText="Intermediate %" 
            SortExpression="intermed_perct" />
        <asp:BoundField DataField="grad_perct" HeaderText="UG %" 
            SortExpression="grad_perct" />
        <asp:BoundField DataField="post_grad_perct" HeaderText="PG %" 
            SortExpression="post_grad_perct" />
        <asp:BoundField DataField="other_perct" HeaderText="Other %" 
            SortExpression="other_perct" />
        <asp:BoundField DataField="no_backlogs" HeaderText="Backlogs" 
            SortExpression="no_backlogs" />
        <asp:BoundField DataField="Password" HeaderText="Password" 
            SortExpression="Password" />
    </Columns>
</asp:GridView>
  <asp:SqlDataSource ID="studentprofile" runat="server" 
        ConnectionString="<%$ ConnectionStrings:SQL Connection String %>" 

        SelectCommand="SELECT DISTINCT [school], [univ_regno], [colge_rollno], [branch], [sem], [name], [f_name], [date_birth], [cores_add], [mob], [email], [matri_perct], [intermed_perct], [grad_perct], [post_grad_perct], [other_perct], [no_backlogs], [Password] FROM [stdtable] ORDER BY [branch], [univ_regno]">
    </asp:SqlDataSource>

首先,养成使用构造SQL语句的习惯,就像rene的回答一样,而不是通过连接。这样可以避免很多问题,例如SQL注入攻击、带有转义字符的字符串以这种方式破坏SQL语句

其次,如果matri_perct是一个float,那么正确的语法应该是:

com = new SqlCommand("SELECT * FROM stdtable WHERE matri_perct > " + 
    float.Parse(txtPercent.Text) + ", con);
没有单引号或百分号

正如我所说的,不要将其直接复制到生产代码中!,而是将用户输入转换为参数。考虑如果输入< /P>会发生什么? 进入你的文本框

编辑

这段代码让我有点困惑:

com.ExecuteNonQuery();  // looks like you're running the SELECT statement then discarding the result
SqlDataAdapter dataadapter = new SqlDataAdapter();
DataSet ds = new DataSet();
dataadapter.Fill(ds, "Data");  // I don't see how this gets the data from your query, above.
GridView1.DataSource = ds;
GridView1.DataMember = "Data";  // see my change, below.
这样做怎么样?保持前三行不变:

SqlDataReader reader = com.ExecuteReader();  // execute SELECT statement, store result in data reader
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.Fill( reader );
GridView1.DataSource = adapter;
GridView1.DataBind();

首先,养成使用构造SQL语句的习惯,就像rene的回答一样,而不是通过连接。这样可以避免很多问题,例如SQL注入攻击、带有转义字符的字符串以这种方式破坏SQL语句

其次,如果matri_perct是一个float,那么正确的语法应该是:

com = new SqlCommand("SELECT * FROM stdtable WHERE matri_perct > " + 
    float.Parse(txtPercent.Text) + ", con);
没有单引号或百分号

正如我所说的,不要将其直接复制到生产代码中!,而是将用户输入转换为参数。考虑如果输入< /P>会发生什么? 进入你的文本框

编辑

这段代码让我有点困惑:

com.ExecuteNonQuery();  // looks like you're running the SELECT statement then discarding the result
SqlDataAdapter dataadapter = new SqlDataAdapter();
DataSet ds = new DataSet();
dataadapter.Fill(ds, "Data");  // I don't see how this gets the data from your query, above.
GridView1.DataSource = ds;
GridView1.DataMember = "Data";  // see my change, below.
这样做怎么样?保持前三行不变:

SqlDataReader reader = com.ExecuteReader();  // execute SELECT statement, store result in data reader
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.Fill( reader );
GridView1.DataSource = adapter;
GridView1.DataBind();

让sqlclient完成繁重的工作:

    com = new SqlCommand("SELECT * FROM stdtable WHERE matri_perct >  @percent", con);
    com.Parameters.AddWithValue("percent", float.Parse(txtPercent.Text));
    com.ExecuteNonQuery();
或者,如果您想更具体地了解:


最重要的是:始终使用Bob指出的参数,而不是字符串连接,否则您会发现问题。

让sqlclient完成繁重的工作:

    com = new SqlCommand("SELECT * FROM stdtable WHERE matri_perct >  @percent", con);
    com.Parameters.AddWithValue("percent", float.Parse(txtPercent.Text));
    com.ExecuteNonQuery();
或者,如果您想更具体地了解:


最重要的是:始终使用Bob指出的参数,而不是字符串连接,否则您会发现问题。

我在@Bob Kaufman&@rene的帮助下解决了我的问题 我的问题的完整解决方案如下:

protected void Button1_Click(object sender, EventArgs e)
{
    try
    {

        con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL Connection String"].ConnectionString);
        con.Open();
        com = new SqlCommand("SELECT * FROM stdtable WHERE matri_perct >  @Percent", con);
        com.Parameters.AddWithValue("@Percent", float.Parse(txtPercent.Text));
        SqlDataReader reader = com.ExecuteReader();  // execute SELECT statement, store result in data reader
        GridView1.DataSource = reader;
        GridView1.DataBind();
        con.Close();
         }
    catch (System.Exception err)
    {
        Label1.Text = err.Message.ToString();
    }
}
然后我更改了AllowPaging=false


它起作用了

我在@Bob Kaufman&@rene的帮助下解决了我的问题 我的问题的完整解决方案如下:

protected void Button1_Click(object sender, EventArgs e)
{
    try
    {

        con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL Connection String"].ConnectionString);
        con.Open();
        com = new SqlCommand("SELECT * FROM stdtable WHERE matri_perct >  @Percent", con);
        com.Parameters.AddWithValue("@Percent", float.Parse(txtPercent.Text));
        SqlDataReader reader = com.ExecuteReader();  // execute SELECT statement, store result in data reader
        GridView1.DataSource = reader;
        GridView1.DataBind();
        con.Close();
         }
    catch (System.Exception err)
    {
        Label1.Text = err.Message.ToString();
    }
}
然后我更改了AllowPaging=false


它起作用了

我已将更新代码编辑为@rene answered。现在,它表示“在调用“Fill”之前,SelectCommand属性尚未初始化”。根据您的意见,更改的代码现在是错误的,DataSource和DataSourceID都是在“GridView1”上定义的。删除一个定义。现在数据源不支持服务器端数据分页。事实证明,您确实需要SqlDataAdapter来支持分页,但我认为您没有正确初始化它。请参阅我在上面所做的编辑。我已经有一段时间没用了。很遗憾,我对这件事的了解已经接近尾声。请看最后一次编辑。感谢您到目前为止的合作….:我已将更新代码编辑为@rene answered。现在,它表示“在调用“Fill”之前,SelectCommand属性尚未初始化”。根据您的意见,更改的代码现在是错误的,DataSource和DataSourceID都是在“GridView1”上定义的。删除一个定义。现在数据源不支持服务器端数据分页。事实证明,您确实需要SqlDataAdapter来支持分页,但我认为您没有正确初始化它。请参阅我在上面所做的编辑。我已经有一段时间没用了。很遗憾,我对这件事的了解已经接近尾声。请看最后一次编辑。感谢您到目前为止的合作..:我已经从原始代码中删除了DataSouceID我已经从原始代码中删除了DataSouceID