sql和c#代码的异常

时间:2013-01-09 15:32:45

标签: c# sql sql-server

我是C#和sql的新手。我在c#中有一个函数,它在数据库表中搜索特定的记录 我的功能是

 public string returnstudentdata(string primarykey, string table, string regno, string column)
    {
        string temp = "";
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        SqlCommand newCmd = conn.CreateCommand();
        newCmd.Connection = conn;
        newCmd.CommandType = CommandType.Text;
        newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";
        SqlDataReader dr = newCmd.ExecuteReader();
        while (dr.Read())
        {
            temp = dr[column].ToString();
        }
        dr.Close();
        conn.Close();
        return temp;
    }

此代码正确执行,但涉及到SqlDataReader dr = newCmd.ExecuteReader();它引发了一个例外陈述:

System.Data.dll中出现未处理的“System.Data.SqlClient.SqlException”类型异常

其他信息:'='附近的语法不正确。

调用语句是

 string regno = txtRegNo.Text;
 txtFName.Text = update.returnstudentdata("Regno","student",regno,"Fname");

我的code.please帮助

有什么问题

5 个答案:

答案 0 :(得分:3)

至少在sql语句中需要空格:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";

答案 1 :(得分:2)

在引号内的SQL关键字周围添加一些空格,您的字符串不会产生有效的SQL代码:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";

另外,出于安全考虑,我建议使用参数化查询而不是自组装字符串。例如,您的代码容易受到SQL注入攻击。

有关更多说明,请参阅此SO主题:How do parameterized queries help against SQL injection?

答案 2 :(得分:1)

此行不会提供有效的SQL。没有空格.-

newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";

答案 3 :(得分:1)

试试这个:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + " = '" + regno + "'";

答案 4 :(得分:1)

您的CommandText或Sql查询可能会出现很多错误。

首先,SQL关键字(如SELECT)和变量(假设变量未填充空格)之间没有空格:

newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";

您应该首先添加如下空格:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";

第二个问题是,您没有用引号括起regno值。现在,这可能是有效的,因为值是数字;如果是这种情况,你可以忽略引号,你的查询应该执行正常(添加上面提到的空格后)。但是,如果它是一个字符串,您需要将值包装在这样的引号中:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=\"" + regno + "\"";

但是,无论值是数字还是字符串,我实际上建议您使用预准备语句。您可以通过以下方式完成此任务:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=@regNo";
newCmd.Parameters.AddWithValue("@regNo", regno);

准备好的语句将有助于减少记住将值包装在引号中的需要(它将为您处理),并通过帮助防止SQL注入来增加查询的安全性。