Sql从nVarchar转换为int错误

时间:2013-11-29 05:12:18

标签: c# sql sql-server

错误:

  

转换nvarchar值时转换失败'从Topic中选择TopicID,其中TopicName ='数据结构''到数据类型int

代码:

public void  BindGridview()
{
    string strConnString = ConfigurationManager.ConnectionStrings["infoConnectionString"].ConnectionString;

    SqlConnection sqlcon = new SqlConnection(strConnString);
    sqlcon.Open();

    string strquery2 = "select TopicID from Topic where TopicName='" + ddltopic.SelectedItem.Text+ "'";

    string strquery3 = "select i.name ,i.score from info as i,Topic as t where  i.topic_id=@topicid";
    SqlCommand cmd = new SqlCommand(strquery3,sqlcon);
    cmd.Parameters.AddWithValue("@topicid",strquery2);

    cmd.Connection = sqlcon;

    SqlDataReader dr;;

    this.GridView1.DataSource =cmd.ExecuteReader();
    this.GridView1.DataBind();

    sqlcon.Close();
    }
}

谁能告诉我哪里出错了?任何帮助将不胜感激..请尽快回复..提前致谢..

4 个答案:

答案 0 :(得分:1)

您在整个查询中传递的不是此行中的主题ID

cmd.Parameters.AddWithValue("@topicid",strquery2);

然后将其作为参数并将其添加到以下查询中。如果这是子查询,则可以始终先执行它,然后在参数中使用结果。

但它失败的原因是因为你实际上是试图通过传入类似的查询字符串来比较Stringint

答案 1 :(得分:0)

我认为你想要的是cmd.Parameters.AddWithValue(" @ topicid",strquery2);是strquery2返回的值???? ,如果先执行此查询,将生成主题ID,并将使用此结果而不是查询本身

这就是你想要的吗?

答案 2 :(得分:0)

你可以尝试使用下面的代码,我没有测试但它应该适合你

public void  BindGridview()
{
    string strConnString = ConfigurationManager.ConnectionStrings["infoConnectionString"].ConnectionString;
                SqlConnection sqlcon = new SqlConnection(strConnString);
                sqlcon.Open();
                //Equal is not working when subquery return more records
                string strquery2 = "select i.name ,i.score from info as i,Topic as t where  i.topic_id in (select TopicID from Topic where TopicName=@TopicName)";

                SqlCommand cmd = new SqlCommand(strquery2, sqlcon);
                cmd.Parameters.AddWithValue("@TopicName", ddltopic.SelectedItem.Text);
                cmd.Connection = sqlcon;
                SqlDataReader dr; ;

                this.GridView1.DataSource =cmd.ExecuteReader();
                this.GridView1.DataBind();
                sqlcon.Close();
}

答案 3 :(得分:0)

不是一个真正的答案,但评论太短了。

此代码容易受到SQL injection

的攻击
string strquery2 = "select TopicID from Topic where TopicName='" + ddltopic.SelectedItem.Text+ "'";

想象一下,在未来某个时候某人(您或其他正在修改您的代码的人)决定用组合框替换下拉列表?现在想象某人将此文本输入组合框:

'; TRUNCATE TABLE Topic; --'

现在您的SQL服务器将执行此操作:

select TopicID from Topic where TopicName = '';
TRUNCATE TABLE Topic; --'

Learn使用parameters