C# 填充GridView时将数据类型varchar转换为浮点时出错
根据文本框中的数字数据,我用以下代码填充GridView并单击按钮。 但它给出了以下错误。 将数据类型varchar转换为float时出错。 因为我的数据库列“matri_perct”的数据类型为“float”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
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